Fix PIC, add small delays when initializing

This commit is contained in:
2025-11-18 23:27:49 +01:00
parent 638214a0e2
commit 28c95303e9
8 changed files with 51 additions and 24 deletions

View File

@ -186,7 +186,6 @@ void intr_init(void) {
idt_init(); idt_init();
intr_pic_init(); intr_pic_init();
intr_pit_init(); intr_pit_init();
intr_disable();
} }
void intr_dumpframe(IntrStackFrame *frame) { void intr_dumpframe(IntrStackFrame *frame) {
@ -246,13 +245,19 @@ 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(); if (frame->trapnum == INTR_IRQBASE+0) {
PIT_TICKS++;
intr_pic_eoi(frame->trapnum >= 40);
proc_sched((void *)frame);
} else {
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(frame->trapnum >= 40);
}
} else if (frame->trapnum == 0x80) { } else if (frame->trapnum == 0x80) {
intr_syscalldispatch(frame); intr_syscalldispatch(frame);
} }

View File

@ -25,22 +25,44 @@
void intr_pic_init(void) { void intr_pic_init(void) {
io_out8(PIC1_CMD, ICW1_INIT | ICW1_ICW4); io_out8(PIC1_CMD, ICW1_INIT | ICW1_ICW4);
io_wait();
io_out8(PIC2_CMD, ICW1_INIT | ICW1_ICW4); io_out8(PIC2_CMD, ICW1_INIT | ICW1_ICW4);
io_wait();
io_out8(PIC1_DATA, INTR_IRQBASE); io_out8(PIC1_DATA, INTR_IRQBASE);
io_wait();
io_out8(PIC2_DATA, INTR_IRQBASE+8); io_out8(PIC2_DATA, INTR_IRQBASE+8);
io_wait();
io_out8(PIC1_DATA, 2); io_out8(PIC1_DATA, 2);
io_wait();
io_out8(PIC2_DATA, 2); io_out8(PIC2_DATA, 2);
io_wait();
io_out8(PIC1_DATA, ICW4_8086); io_out8(PIC1_DATA, ICW4_8086);
io_wait();
io_out8(PIC2_DATA, ICW4_8086); io_out8(PIC2_DATA, ICW4_8086);
io_wait();
io_out8(PIC1_DATA, 0); intr_pic_mask();
io_out8(PIC2_DATA, 0);
} }
void intr_pic_eoi(void) { void intr_pic_mask(void) {
io_out8(PIC1_DATA, 0xFF);
io_wait();
io_out8(PIC2_DATA, 0xFF);
io_wait();
}
void intr_pic_unmask(void) {
io_out8(PIC1_DATA, 0);
io_wait();
io_out8(PIC2_DATA, 0);
io_wait();
}
void intr_pic_eoi(bool pic2) {
if (pic2)
io_out8(PIC2_CMD, PIC_EOI); io_out8(PIC2_CMD, PIC_EOI);
io_out8(PIC1_CMD, PIC_EOI); io_out8(PIC1_CMD, PIC_EOI);
} }

View File

@ -1,7 +1,11 @@
#ifndef INTR_PIC_H_ #ifndef INTR_PIC_H_
#define INTR_PIC_H_ #define INTR_PIC_H_
#include <stdbool.h>
void intr_pic_init(void); void intr_pic_init(void);
void intr_pic_eoi(void); void intr_pic_eoi(bool pic2);
void intr_pic_mask(void);
void intr_pic_unmask(void);
#endif // INTR_PIC_H_ #endif // INTR_PIC_H_

View File

@ -31,13 +31,7 @@ void intr_pit_wait(uint32_t ms) {
while (PIT_TICKS - now < ms); while (PIT_TICKS - now < ms);
} }
void intr_pit_intr(IntrStackFrame *frame) {
PIT_TICKS++;
}
void intr_pit_init(void) { void intr_pit_init(void) {
intr_attchhandler(&intr_pit_intr, INTR_IRQBASE+0);
uint32_t hz = 1000; uint32_t hz = 1000;
uint32_t div = PIT_FREQ / hz; uint32_t div = PIT_FREQ / hz;
io_out8(PIT_CMD, PIT_CMD_BINARY | PIT_CMD_MODE3 | PIT_CMD_RW_BOTH | PIT_CMD_COUNTER0); io_out8(PIT_CMD, PIT_CMD_BINARY | PIT_CMD_MODE3 | PIT_CMD_RW_BOTH | PIT_CMD_COUNTER0);

View File

@ -45,3 +45,7 @@ void io_outs16(uint16_t port, const void *addr, int cnt) {
: "memory", "cc" : "memory", "cc"
); );
} }
void io_wait(void) {
io_out8(0x80, 0);
}

View File

@ -15,4 +15,6 @@ void io_out32(uint16_t port, uint32_t value);
void io_ins16(uint16_t port, void *addr, int cnt); void io_ins16(uint16_t port, void *addr, int cnt);
void io_outs16(uint16_t port, const void *addr, int cnt); void io_outs16(uint16_t port, const void *addr, int cnt);
void io_wait(void);
#endif // IO_IO_H_ #endif // IO_IO_H_

View File

@ -253,21 +253,17 @@ void proc_killself(void) {
proc_kill(proc); proc_kill(proc);
} }
void proc_intr(IntrStackFrame *frame) {
proc_sched(frame);
}
void proc_init(void) { void proc_init(void) {
spinlock_init(&PROCS.spinlock); spinlock_init(&PROCS.spinlock);
PROCS.procs = NULL; PROCS.procs = NULL;
intr_attchhandler(&proc_intr, INTR_IRQBASE+0);
Proc *init = proc_spawnuser("base", "/bin/init"); Proc *init = proc_spawnuser("base", "/bin/init");
PROCS.current = init; PROCS.current = init;
proc_register(init); proc_register(init);
init->state = PROC_READY; init->state = PROC_READY;
intr_pic_unmask();
tss.rsp0 = (uint64_t)VIRT(PROCS.current->platformdata.kstack); tss.rsp0 = (uint64_t)VIRT(PROCS.current->platformdata.kstack);
proc_switch(&PROCS.current->platformdata.trapframe, (void *)PROCS.current->platformdata.cr3); proc_switch(&PROCS.current->platformdata.trapframe, (void *)PROCS.current->platformdata.cr3);
} }

View File

@ -3,7 +3,7 @@
set -x set -x
qemu-system-x86_64 \ qemu-system-x86_64 \
-cpu IvyBridge \ -machine pc \
-m 4G \ -m 4G \
-boot d \ -boot d \
-serial stdio \ -serial stdio \