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

@ -50,21 +50,26 @@ namespace Sortix
"Bad TSS", "Segment not present", "Stack fault",
"General protection fault", "Page fault", "Unknown interrupt",
"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()
{
for ( size_t i = 0; i < 256; i++ )
for ( size_t i = 0; i < NUM_INTERRUPTS; i++ )
{
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;
interrupthandlerptr[n] = user;
}
// This gets called from our ASM interrupt handler stub.
@ -105,7 +110,8 @@ namespace Sortix
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] )
{
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 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();
}

View File

@ -652,7 +652,7 @@ namespace Sortix
Layouts::Init();
// Register our keystroke callback.
Interrupt::RegisterHandler(Interrupt::IRQ1, OnIRQ1);
Interrupt::RegisterHandler(Interrupt::IRQ1, OnIRQ1, NULL);
// If any scancodes were already pending, our interrupt handler
// will never be called. Let's just discard anything pending.
@ -685,7 +685,7 @@ namespace Sortix
return true;
}
void OnIRQ1(CPU::InterruptRegisters* Regs)
void OnIRQ1(CPU::InterruptRegisters* Regs, void* user)
{
// Read the scancode from the data register.
uint8_t Scancode = CPU::InPortB(0x60);

View File

@ -31,7 +31,7 @@ namespace Sortix
{
void Init();
void SetLEDs(uint8_t Toggle);
void OnIRQ1(CPU::InterruptRegisters* Regs);
void OnIRQ1(CPU::InterruptRegisters* Regs, void* user);
bool QueueKeystroke(uint32_t keystroke);
}
}

View File

@ -54,7 +54,7 @@ namespace Sortix
return microsecondssinceboot;
}
void OnInt177(CPU::InterruptRegisters* Regs)
void OnInt177(CPU::InterruptRegisters* Regs, void* /*user*/)
{
#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);
@ -99,8 +99,8 @@ namespace Sortix
microsecondssinceboot = 0;
// First, register our timer callback.
Interrupt::RegisterHandler(Interrupt::IRQ0, &OnIRQ0);
Interrupt::RegisterHandler(177, &OnInt177);
Interrupt::RegisterHandler(Interrupt::IRQ0, &OnIRQ0, NULL);
Interrupt::RegisterHandler(177, &OnInt177, NULL);
Syscall::Register(SYSCALL_UPTIME, (void*) SysUptime);
@ -109,7 +109,7 @@ namespace Sortix
RequestIQR0();
}
void OnIRQ0(CPU::InterruptRegisters* Regs)
void OnIRQ0(CPU::InterruptRegisters* Regs, void* /*user*/)
{
#ifdef PLATFORM_SERIAL
SerialTerminal::OnTick();

View File

@ -31,7 +31,7 @@ namespace Sortix
namespace Time
{
void Init();
void OnIRQ0(CPU::InterruptRegisters* Registers);
void OnIRQ0(CPU::InterruptRegisters* Registers, void* user);
float GetTimeSinceBoot();
uintmax_t MicrosecondsSinceBoot();
}