Fix PIC, add small delays when initializing
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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_
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|||||||
@ -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_
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 \
|
||||||
|
|||||||
Reference in New Issue
Block a user