X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_intr.c;h=9010a4c9b7097a89e17d68eed2a76d622c451164;hb=e3f45cda75462948e8d2ad89a6167fbecc8d13f5;hp=8c4e1c27a7f0a973e15c47ba4e05314af7eb152a;hpb=94f67717b6461df514dc225ed84f03b44c44061b;p=palacios.git diff --git a/palacios/src/palacios/vmm_intr.c b/palacios/src/palacios/vmm_intr.c index 8c4e1c2..9010a4c 100644 --- a/palacios/src/palacios/vmm_intr.c +++ b/palacios/src/palacios/vmm_intr.c @@ -239,6 +239,18 @@ int v3_deliver_irq(struct v3_vm_info * vm, struct v3_interrupt * intr) { +int v3_raise_swintr (struct guest_info * core, uint8_t vector) { + struct v3_intr_core_state * intr_state = &(core->intr_core_state); + + PrintDebug("Signaling software interrupt in v3_signal_swintr()\n"); + PrintDebug("\tINT vector: %d\n", vector); + + intr_state->swintr_posted = 1; + intr_state->swintr_vector = vector; + return 0; +} + + int v3_raise_virq(struct guest_info * info, int irq) { struct v3_intr_core_state * intr_state = &(info->intr_core_state); @@ -294,6 +306,8 @@ int v3_raise_irq(struct v3_vm_info * vm, int irq) { } + + void v3_clear_pending_intr(struct guest_info * core) { struct v3_intr_core_state * intr_state = &(core->intr_core_state); @@ -327,6 +341,11 @@ v3_intr_type_t v3_intr_pending(struct guest_info * info) { } } } + + /* for swintr injection */ + if (intr_state->swintr_posted == 1) { + ret = V3_SOFTWARE_INTR; + } v3_unlock_irqrestore(intr_state->irq_lock, irq_state);