X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_intr.c;h=9010a4c9b7097a89e17d68eed2a76d622c451164;hb=457220e0485aefc6efecbc81ab1343b9cb65d8ba;hp=c9c18001cb6838f5db7c65ce5544deb0d14a8680;hpb=16745fa0dd0900263d4d92315cd17e0ed9ccae91;p=palacios.git diff --git a/palacios/src/palacios/vmm_intr.c b/palacios/src/palacios/vmm_intr.c index c9c1800..9010a4c 100644 --- a/palacios/src/palacios/vmm_intr.c +++ b/palacios/src/palacios/vmm_intr.c @@ -26,7 +26,7 @@ #include -#ifndef CONFIG_DEBUG_INTERRUPTS +#ifndef V3_CONFIG_DEBUG_INTERRUPTS #undef PrintDebug #define PrintDebug(fmt, args...) #endif @@ -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); @@ -389,7 +408,7 @@ intr_type_t v3_get_intr_type(struct guest_info * info) { } } -#ifdef CONFIG_DEBUG_INTERRUPTS +#ifdef V3_CONFIG_DEBUG_INTERRUPTS if (type == V3_INVALID_INTR) { PrintError("[get_intr_type] Invalid_Intr\n"); }