Change order of sending EOI to PIC, works with -enable-kvm now

This commit is contained in:
2025-11-18 16:56:28 +01:00
parent 2a0dddead3
commit 4fb5448dd9
5 changed files with 7 additions and 12 deletions

View File

@ -156,7 +156,7 @@ int32_t ps2kb_intr(void) {
IpcMBus *PS2KB_MBUS; IpcMBus *PS2KB_MBUS;
int ps2kbdev_intr(IntrStackFrame *frame) { void ps2kbdev_intr(IntrStackFrame *frame) {
(void)frame; (void)frame;
int32_t c = ps2kb_intr(); int32_t c = ps2kb_intr();
@ -164,8 +164,6 @@ int ps2kbdev_intr(IntrStackFrame *frame) {
uint8_t b = c; uint8_t b = c;
ipc_mbuspublish("ps2kb", &b); ipc_mbuspublish("ps2kb", &b);
} }
return 0;
} }
void ps2kbdev_init(void) { void ps2kbdev_init(void) {

View File

@ -19,14 +19,14 @@
typedef struct IntrHandler { typedef struct IntrHandler {
struct IntrHandler *next; struct IntrHandler *next;
int (*fn)(IntrStackFrame *frame); void (*fn)(IntrStackFrame *frame);
int irq; int irq;
} IntrHandler; } IntrHandler;
IntrHandler *INTR_HANDLERS = NULL; IntrHandler *INTR_HANDLERS = NULL;
SpinLock INTR_HANDLERS_SPINLOCK; SpinLock INTR_HANDLERS_SPINLOCK;
void intr_attchhandler(int (*fn)(IntrStackFrame *frame), int irq) { void intr_attchhandler(void (*fn)(IntrStackFrame *frame), int irq) {
IntrHandler *ih = dlmalloc(sizeof(*ih)); IntrHandler *ih = dlmalloc(sizeof(*ih));
ih->fn = fn; ih->fn = fn;
ih->irq = irq; ih->irq = irq;
@ -246,13 +246,13 @@ void intr_handleintr(IntrStackFrame *frame) {
cpu_hang(); cpu_hang();
} }
} else if (frame->trapnum >= 32 && frame->trapnum <= 47) { } else if (frame->trapnum >= 32 && frame->trapnum <= 47) {
intr_pic_eoi();
IntrHandler *ih, *ihtmp; IntrHandler *ih, *ihtmp;
LL_FOREACH_SAFE(INTR_HANDLERS, ih, ihtmp) { LL_FOREACH_SAFE(INTR_HANDLERS, ih, ihtmp) {
if ((uint64_t)ih->irq == frame->trapnum) { if ((uint64_t)ih->irq == frame->trapnum) {
ih->fn(frame); ih->fn(frame);
} }
} }
intr_pic_eoi();
} else if (frame->trapnum == 0x80) { } else if (frame->trapnum == 0x80) {
intr_syscalldispatch(frame); intr_syscalldispatch(frame);
} }

View File

@ -35,7 +35,7 @@ typedef struct {
uint64_t ss; uint64_t ss;
} PACKED IntrStackFrame; } PACKED IntrStackFrame;
void intr_attchhandler(int (*fn)(IntrStackFrame *frame), int irq); void intr_attchhandler(void (*fn)(IntrStackFrame *frame), int irq);
int32_t intr_dttchhandler(int irq); int32_t intr_dttchhandler(int irq);
void intr_disable(void); void intr_disable(void);
void intr_enable(void); void intr_enable(void);

View File

@ -31,9 +31,8 @@ void intr_pit_wait(uint32_t ms) {
while (PIT_TICKS - now < ms); while (PIT_TICKS - now < ms);
} }
int intr_pit_intr(IntrStackFrame *frame) { void intr_pit_intr(IntrStackFrame *frame) {
PIT_TICKS++; PIT_TICKS++;
return 0;
} }
void intr_pit_init(void) { void intr_pit_init(void) {

View File

@ -253,10 +253,8 @@ void proc_killself(void) {
proc_kill(proc); proc_kill(proc);
} }
int proc_intr(IntrStackFrame *frame) { void proc_intr(IntrStackFrame *frame) {
intr_pic_eoi();
proc_sched(frame); proc_sched(frame);
return 0;
} }
void proc_init(void) { void proc_init(void) {