Refactored Interrupt handlers to provide a user pointer.
This commit is contained in:
parent
ff9221de1a
commit
93fb66ff90
|
@ -50,21 +50,26 @@ namespace Sortix
|
||||||
"Bad TSS", "Segment not present", "Stack fault",
|
"Bad TSS", "Segment not present", "Stack fault",
|
||||||
"General protection fault", "Page fault", "Unknown interrupt",
|
"General protection fault", "Page fault", "Unknown interrupt",
|
||||||
"Coprocessor fault", "Alignment check", "Machine check",
|
"Coprocessor fault", "Alignment check", "Machine check",
|
||||||
"SIMD Floating-Point" };
|
"SIMD Floating-Point" };
|
||||||
|
|
||||||
Handler interrupthandlers[256];
|
const size_t NUM_INTERRUPTS = 256UL;
|
||||||
|
|
||||||
|
Handler interrupthandlers[NUM_INTERRUPTS];
|
||||||
|
void* interrupthandlerptr[NUM_INTERRUPTS];
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
for ( size_t i = 0; i < 256; i++ )
|
for ( size_t i = 0; i < NUM_INTERRUPTS; i++ )
|
||||||
{
|
{
|
||||||
interrupthandlers[i] = NULL;
|
interrupthandlers[i] = NULL;
|
||||||
|
interrupthandlerptr[i] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegisterHandler(uint8_t n, Interrupt::Handler handler)
|
void RegisterHandler(uint8_t n, Interrupt::Handler handler, void* user)
|
||||||
{
|
{
|
||||||
interrupthandlers[n] = handler;
|
interrupthandlers[n] = handler;
|
||||||
|
interrupthandlerptr[n] = user;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This gets called from our ASM interrupt handler stub.
|
// This gets called from our ASM interrupt handler stub.
|
||||||
|
@ -105,7 +110,8 @@ namespace Sortix
|
||||||
|
|
||||||
if ( interrupthandlers[regs->int_no] != NULL )
|
if ( interrupthandlers[regs->int_no] != NULL )
|
||||||
{
|
{
|
||||||
interrupthandlers[regs->int_no](regs);
|
void* user = interrupthandlerptr[regs->int_no];
|
||||||
|
interrupthandlers[regs->int_no](regs, user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,7 +139,8 @@ namespace Sortix
|
||||||
|
|
||||||
if ( interrupthandlers[regs->int_no] )
|
if ( interrupthandlers[regs->int_no] )
|
||||||
{
|
{
|
||||||
interrupthandlers[regs->int_no](regs);
|
void* user = interrupthandlerptr[regs->int_no];
|
||||||
|
interrupthandlers[regs->int_no](regs, user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,9 +46,9 @@ namespace Sortix
|
||||||
const unsigned IRQ14 = 46;
|
const unsigned IRQ14 = 46;
|
||||||
const unsigned IRQ15 = 47;
|
const unsigned IRQ15 = 47;
|
||||||
|
|
||||||
typedef void (*Handler)(CPU::InterruptRegisters* Registers);
|
typedef void (*Handler)(CPU::InterruptRegisters* regs, void* user);
|
||||||
|
|
||||||
void RegisterHandler(uint8_t n, Handler handler);
|
void RegisterHandler(uint8_t n, Handler handler, void* user);
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
}
|
}
|
||||||
|
|
|
@ -652,7 +652,7 @@ namespace Sortix
|
||||||
Layouts::Init();
|
Layouts::Init();
|
||||||
|
|
||||||
// Register our keystroke callback.
|
// Register our keystroke callback.
|
||||||
Interrupt::RegisterHandler(Interrupt::IRQ1, OnIRQ1);
|
Interrupt::RegisterHandler(Interrupt::IRQ1, OnIRQ1, NULL);
|
||||||
|
|
||||||
// If any scancodes were already pending, our interrupt handler
|
// If any scancodes were already pending, our interrupt handler
|
||||||
// will never be called. Let's just discard anything pending.
|
// will never be called. Let's just discard anything pending.
|
||||||
|
@ -685,7 +685,7 @@ namespace Sortix
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnIRQ1(CPU::InterruptRegisters* Regs)
|
void OnIRQ1(CPU::InterruptRegisters* Regs, void* user)
|
||||||
{
|
{
|
||||||
// Read the scancode from the data register.
|
// Read the scancode from the data register.
|
||||||
uint8_t Scancode = CPU::InPortB(0x60);
|
uint8_t Scancode = CPU::InPortB(0x60);
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace Sortix
|
||||||
{
|
{
|
||||||
void Init();
|
void Init();
|
||||||
void SetLEDs(uint8_t Toggle);
|
void SetLEDs(uint8_t Toggle);
|
||||||
void OnIRQ1(CPU::InterruptRegisters* Regs);
|
void OnIRQ1(CPU::InterruptRegisters* Regs, void* user);
|
||||||
bool QueueKeystroke(uint32_t keystroke);
|
bool QueueKeystroke(uint32_t keystroke);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,7 @@ namespace Sortix
|
||||||
return microsecondssinceboot;
|
return microsecondssinceboot;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnInt177(CPU::InterruptRegisters* Regs)
|
void OnInt177(CPU::InterruptRegisters* Regs, void* /*user*/)
|
||||||
{
|
{
|
||||||
#ifdef PLATFORM_X86
|
#ifdef PLATFORM_X86
|
||||||
Log::PrintF("ds=0x%x, edi=0x%x, esi=0x%x, ebp=0x%x, esp=0x%x, ebx=0x%x, edx=0x%x, ecx=0x%x, eax=0x%x, int_no=0x%x, err_code=0x%x, eip=0x%x, cs=0x%x, eflags=0x%x, useresp=0x%x, ss=0x%x\n", Regs->ds, Regs->edi, Regs->esi, Regs->ebp, Regs->esp, Regs->ebx, Regs->edx, Regs->ecx, Regs->eax, Regs->int_no, Regs->err_code, Regs->eip, Regs->cs, Regs->eflags, Regs->useresp, Regs->ss);
|
Log::PrintF("ds=0x%x, edi=0x%x, esi=0x%x, ebp=0x%x, esp=0x%x, ebx=0x%x, edx=0x%x, ecx=0x%x, eax=0x%x, int_no=0x%x, err_code=0x%x, eip=0x%x, cs=0x%x, eflags=0x%x, useresp=0x%x, ss=0x%x\n", Regs->ds, Regs->edi, Regs->esi, Regs->ebp, Regs->esp, Regs->ebx, Regs->edx, Regs->ecx, Regs->eax, Regs->int_no, Regs->err_code, Regs->eip, Regs->cs, Regs->eflags, Regs->useresp, Regs->ss);
|
||||||
|
@ -99,8 +99,8 @@ namespace Sortix
|
||||||
microsecondssinceboot = 0;
|
microsecondssinceboot = 0;
|
||||||
|
|
||||||
// First, register our timer callback.
|
// First, register our timer callback.
|
||||||
Interrupt::RegisterHandler(Interrupt::IRQ0, &OnIRQ0);
|
Interrupt::RegisterHandler(Interrupt::IRQ0, &OnIRQ0, NULL);
|
||||||
Interrupt::RegisterHandler(177, &OnInt177);
|
Interrupt::RegisterHandler(177, &OnInt177, NULL);
|
||||||
|
|
||||||
Syscall::Register(SYSCALL_UPTIME, (void*) SysUptime);
|
Syscall::Register(SYSCALL_UPTIME, (void*) SysUptime);
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ namespace Sortix
|
||||||
RequestIQR0();
|
RequestIQR0();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnIRQ0(CPU::InterruptRegisters* Regs)
|
void OnIRQ0(CPU::InterruptRegisters* Regs, void* /*user*/)
|
||||||
{
|
{
|
||||||
#ifdef PLATFORM_SERIAL
|
#ifdef PLATFORM_SERIAL
|
||||||
SerialTerminal::OnTick();
|
SerialTerminal::OnTick();
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace Sortix
|
||||||
namespace Time
|
namespace Time
|
||||||
{
|
{
|
||||||
void Init();
|
void Init();
|
||||||
void OnIRQ0(CPU::InterruptRegisters* Registers);
|
void OnIRQ0(CPU::InterruptRegisters* Registers, void* user);
|
||||||
float GetTimeSinceBoot();
|
float GetTimeSinceBoot();
|
||||||
uintmax_t MicrosecondsSinceBoot();
|
uintmax_t MicrosecondsSinceBoot();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue