summaryrefslogtreecommitdiff
path: root/kern/pv.c
diff options
context:
space:
mode:
authorHanjie Wu <hanjiew@andrew.cmu.edu>2023-04-28 21:14:37 -0400
committerHanjie Wu <hanjiew@andrew.cmu.edu>2023-04-28 21:14:37 -0400
commit119b5e6fde37c53a5037a6ba959ba60c882bd6d0 (patch)
treea41be842bfc966befb80324cc405414b35cf91d2 /kern/pv.c
parentff90341c64565ac7d8034d2f8cf460532a5b51fd (diff)
commentHEADmaster
Diffstat (limited to 'kern/pv.c')
-rw-r--r--kern/pv.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/kern/pv.c b/kern/pv.c
index e82973c..2b26ff9 100644
--- a/kern/pv.c
+++ b/kern/pv.c
@@ -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;