diff options
| author | Hanjie Wu <hanjiew@andrew.cmu.edu> | 2023-04-28 21:14:37 -0400 |
|---|---|---|
| committer | Hanjie Wu <hanjiew@andrew.cmu.edu> | 2023-04-28 21:14:37 -0400 |
| commit | 119b5e6fde37c53a5037a6ba959ba60c882bd6d0 (patch) | |
| tree | a41be842bfc966befb80324cc405414b35cf91d2 /kern/pv.c | |
| parent | ff90341c64565ac7d8034d2f8cf460532a5b51fd (diff) | |
Diffstat (limited to 'kern/pv.c')
| -rw-r--r-- | kern/pv.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -332,11 +332,12 @@ int pv_inject_irq(stack_frame_t* f, int index, int arg) { if (pv == NULL) { return -1; } + /** IRQ happens in host kernel mode or PV guest blocks interrupt */ if (f->cs != SEGSEL_PV_CS || (pv->vif & EFL_IF) == 0) { pv_pend_irq(pv, index, arg); return 0; } - pv_idt_entry_t* idt = &pv->vidt.irq[index - PV_IRQ_START]; + pv_idt_entry_t* idt = &pv->vidt.fault_irq[index]; if (idt->eip == 0) { goto no_idt_handler; } @@ -359,11 +360,11 @@ void pv_check_pending_irq(stack_frame_t* f) { int i; for (i = 0; i < (PV_IRQ_END - PV_IRQ_START); i++) { if (vidt->pending_irq[i].pending != 0) { - if (vidt->irq[i].eip == 0) { + if (vidt->fault_irq[i + PV_IRQ_START].eip == 0) { goto no_idt_handler; } pv_inject_interrupt(t, pv, f, vidt->pending_irq[i].arg, - vidt->irq[i].eip); + vidt->fault_irq[i + PV_IRQ_START].eip); vidt->pending_irq[i].pending = 0; restore_if(old_if); return; |
