for (i = 0; i < 16; i++) {
if (i <= 7) {
if (((state->master_irr & ~(state->master_imr)) >> i) == 0x01) {
- return i;
+ state->master_isr |= (0x1 << i);
+ return i + state->master_icw2;
}
} else {
if (((state->slave_irr & ~(state->slave_imr)) >> i) == 0x01) {
- return i;
+ state->slave_isr |= (0x1 << i);
+ return i + state->slave_icw2;
}
}
}
}
-static int begin_irq(void * private_data, int irq) {
+static int pic_begin_irq(void * private_data, int irq) {
return 0;
}
-static int end_irq(void * private_data, int irq) {
+/*
+static int pic_end_irq(void * private_data, int irq) {
return 0;
}
-
+*/
static struct intr_ctrl_ops intr_ops = {
.intr_pending = pic_intr_pending,
.get_intr_number = pic_get_intr_number,
.raise_intr = pic_raise_intr,
- .begin_irq = begin_irq,
+ .begin_irq = pic_begin_irq,
};
} else if (state->master_state == READY) {
if (IS_OCW2(cw)) {
// handle the EOI here
- struct ocw2 * cw2 = (struct ocw2 *)cw;
+ struct ocw2 * cw2 = (struct ocw2*)&cw;
if ((cw2->EOI) && (!cw2->R) && (cw2->SL)) {
// specific EOI;
state->master_isr &= ~(0x01 << cw2->level);
+ } else if ((cw2->EOI) & (!cw2->R) && (!cw2->SL)) {
+ // Non-specific EOI
+
} else {
// error;
}
} else if (state->slave_state == READY) {
if (IS_OCW2(cw)) {
// handle the EOI here
- struct ocw2 * cw2 = (struct ocw2 *)cw;
+ struct ocw2 * cw2 = (struct ocw2 *)&cw;
if ((cw2->EOI) && (!cw2->R) && (cw2->SL)) {
// specific EOI;
state->slave_isr &= ~(0x01 << cw2->level);
+ } else if ((cw2->EOI) & (!cw2->R) && (!cw2->SL)) {
+ // non specific EOI
} else {
// error;
}
os_hooks.free = &VMM_Free;
os_hooks.vaddr_to_paddr = &Identity;
os_hooks.paddr_to_vaddr = &Identity;
-
+ os_hooks.hook_interrupt = &hook_irq_stub;
+ os_hooks.ack_irq = &ack_irq;
// DumpGDT();
Init_VMM(&os_hooks, &vmm_ops);