Refactored Interrupt handlers to provide a user pointer.

This commit is contained in:
Jonas 'Sortie' Termansen 2012-01-15 18:32:42 +01:00
parent ff9221de1a
commit 93fb66ff90
6 changed files with 23 additions and 16 deletions

View File

@ -52,19 +52,24 @@ namespace Sortix
"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);
} }
} }

View File

@ -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();
} }

View File

@ -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);

View File

@ -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);
} }
} }

View File

@ -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();

View File

@ -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();
} }