Ich glaube ich komme der Sache näher ..
Den Code habe ich schon gefunden ..
Mein Problem ist einfach nur, dass ich den interrupt handler etwas anders integriert habe .. (Dump davon gibts weiter unten ..)
statt cpu_state benutze ich folgendes Struct:
struct regs
{
unsigned int gs, fs, es, ds;
unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
unsigned int int_no, err_code;
unsigned int eip, cs, eflags, useresp, ss;
};
Mein IRQ Handler sieht wie folgt aus:
struct regs* irq_handler(struct regs *r)
{
struct regs* new_cpu = r;
void (*handler)(struct regs *r);
handler = irq_routines[r->int_no - 32];
if (handler)
{
handler(r);
}
if (r->int_no >= 40)
{
outportb(0xA0, 0x20);
}
if (r->int_no == 0x20) {
new_cpu = schedule(r);
}
outportb(0x20, 0x20);
return new_cpu;
}
Und das hier ist der irq stub, der den irq_handler aufruft
irq_common_stub:
pusha
push ds
push es
push fs
push gs
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
push esp
mov eax, _irq_handler
call eax
call _irq_handler
pop eax
mov esp, eax
pop gs
pop fs
pop es
pop ds
popa
add esp, 8
iret
Jetzt zum Problem:
sobald der Interrupt kommt, und schedule() aufgerufen wird, scheint er alles richtig in die Register zu laden (siehe dump unten),
aber danach verabschiedet sich das Ding mit einem Fehler 0, General Protection Fault.
Der Dump sieht wie folgt aus:
CPU HALT
gs: 0, fs: 0, es: 0, ds: 0
edi: 0, esi: 0, esp: 1065599
eax: 0, ebx: 1085824, ecx: 0, edx: 1065599
int_no: 13, err_code: 0
eip: 1063348, cs: 0, ss: 1065599
eflags: 66054, useresp: 1050769
Hat wer ne Idee?