X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=96fcaa1e38aaf917d17caf3f08ebf85633a22445;hb=94966f95239e03c7df97bd71d6be3e1316239d21;hp=171d2b521a3d2f7b5aa8daf17fa5dd896c77d6dc;hpb=69982930e8a2c0e44aeae5a95497fb896dad3da3;p=palacios.git diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 171d2b5..96fcaa1 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -34,27 +34,30 @@ #include #include -#ifndef CONFIG_DEBUG_SVM +#ifndef V3_CONFIG_DEBUG_SVM #undef PrintDebug #define PrintDebug(fmt, args...) #endif -#ifdef CONFIG_TELEMETRY +#ifdef V3_CONFIG_TELEMETRY #include #endif - +#ifdef V3_CONFIG_EXT_SW_INTERRUPTS +#include +#endif int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_info1, addr_t exit_info2) { -#ifdef CONFIG_TELEMETRY +#ifdef V3_CONFIG_TELEMETRY if (info->vm_info->enable_telemetry) { v3_telemetry_start_exit(info); } #endif - //PrintDebug("SVM Returned: Exit Code: %x\n",exit_code); + + // PrintDebug("SVM Returned: Exit Code: %p\n", (void *)exit_code); switch (exit_code) { case VMEXIT_IOIO: { @@ -114,7 +117,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i break; case VMEXIT_CR0_WRITE: -#ifdef CONFIG_DEBUG_CTRL_REGS +#ifdef V3_CONFIG_DEBUG_CTRL_REGS PrintDebug("CR0 Write\n"); #endif if (v3_handle_cr0_write(info) == -1) { @@ -122,7 +125,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i } break; case VMEXIT_CR0_READ: -#ifdef CONFIG_DEBUG_CTRL_REGS +#ifdef V3_CONFIG_DEBUG_CTRL_REGS PrintDebug("CR0 Read\n"); #endif if (v3_handle_cr0_read(info) == -1) { @@ -130,7 +133,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i } break; case VMEXIT_CR3_WRITE: -#ifdef CONFIG_DEBUG_CTRL_REGS +#ifdef V3_CONFIG_DEBUG_CTRL_REGS PrintDebug("CR3 Write\n"); #endif if (v3_handle_cr3_write(info) == -1) { @@ -139,7 +142,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i break; case VMEXIT_CR3_READ: -#ifdef CONFIG_DEBUG_CTRL_REGS +#ifdef V3_CONFIG_DEBUG_CTRL_REGS PrintDebug("CR3 Read\n"); #endif if (v3_handle_cr3_read(info) == -1) { @@ -147,7 +150,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i } break; case VMEXIT_CR4_WRITE: -#ifdef CONFIG_DEBUG_CTRL_REGS +#ifdef V3_CONFIG_DEBUG_CTRL_REGS PrintDebug("CR4 Write\n"); #endif if (v3_handle_cr4_write(info) == -1) { @@ -155,7 +158,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i } break; case VMEXIT_CR4_READ: -#ifdef CONFIG_DEBUG_CTRL_REGS +#ifdef V3_CONFIG_DEBUG_CTRL_REGS PrintDebug("CR4 Read\n"); #endif if (v3_handle_cr4_read(info) == -1) { @@ -165,7 +168,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i case VMEXIT_EXCP14: { addr_t fault_addr = exit_info2; pf_error_t * error_code = (pf_error_t *)&(exit_info1); -#ifdef CONFIG_DEBUG_SHADOW_PAGING +#ifdef V3_CONFIG_DEBUG_SHADOW_PAGING PrintDebug("PageFault at %p (error=%d)\n", (void *)fault_addr, *(uint_t *)error_code); #endif @@ -195,7 +198,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i } case VMEXIT_INVLPG: if (info->shdw_pg_mode == SHADOW_PAGING) { -#ifdef CONFIG_DEBUG_SHADOW_PAGING +#ifdef V3_CONFIG_DEBUG_SHADOW_PAGING PrintDebug("Invlpg\n"); #endif if (v3_handle_shadow_invlpg(info) == -1) { @@ -217,7 +220,10 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i return -1; } - break; + break; + case VMEXIT_NMI: + // handled by interrupt dispatcher + break; case VMEXIT_INTR: // handled by interrupt dispatch earlier break; @@ -225,7 +231,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i // handle_svm_smi(info); // ignored for now break; case VMEXIT_HLT: -#ifdef CONFIG_DEBUG_HALT +#ifdef V3_CONFIG_DEBUG_HALT PrintDebug("Guest halted\n"); #endif if (v3_handle_halt(info) == -1) { @@ -239,7 +245,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i } break; case VMEXIT_WBINVD: -#ifdef CONFIG_DEBUG_EMULATOR +#ifdef V3_CONFIG_DEBUG_EMULATOR PrintDebug("WBINVD\n"); #endif if (v3_handle_svm_wbinvd(info) == -1) { @@ -247,7 +253,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i } break; case VMEXIT_RDTSC: -#ifdef CONFIG_DEBUG_TIME +#ifdef V3_CONFIG_DEBUG_TIME PrintDebug("RDTSC/RDTSCP\n"); #endif if (v3_handle_rdtsc(info) == -1) { @@ -256,7 +262,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i } break; case VMEXIT_RDTSCP: -#ifdef CONFIG_DEBUG_TIME +#ifdef V3_CONFIG_DEBUG_TIME PrintDebug("RDTSCP\n"); #endif if (v3_handle_rdtscp(info) == -1) { @@ -264,6 +270,25 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i return -1; } break; + case VMEXIT_SHUTDOWN: + PrintDebug("Guest-initiated shutdown\n"); + + info->vm_info->run_state = VM_STOPPED; + + // Force exit on other cores + + break; +#ifdef V3_CONFIG_EXT_SW_INTERRUPTS + case VMEXIT_SWINT: +#ifdef V3_CONFIG_DEBUG_EXT_SW_INTERRUPTS + PrintDebug("Intercepted a software interrupt\n"); +#endif + if (v3_handle_swintr(info) == -1) { + PrintError("Error handling software interrupt\n"); + return -1; + } + break; +#endif /* Exits Following this line are NOT HANDLED */ @@ -273,7 +298,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i addr_t rip_addr; - PrintDebug("Unhandled SVM Exit: %s\n", vmexit_code_to_str(exit_code)); + PrintError("Unhandled SVM Exit: %s\n", vmexit_code_to_str(exit_code)); rip_addr = get_addr_linear(info, info->rip, &(info->segments.cs)); @@ -285,10 +310,10 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i PrintError("SVM Returned: Exit Code: %p\n", (void *)(addr_t)exit_code); PrintError("io_info1 low = 0x%.8x\n", *(uint_t*)&(exit_info1)); - PrintError("io_info1 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(exit_info1)) + 4)); + PrintError("io_info1 high = 0x%.8x\n", *(uint_t *)(((uint8_t *)&(exit_info1)) + 4)); PrintError("io_info2 low = 0x%.8x\n", *(uint_t*)&(exit_info2)); - PrintError("io_info2 high = 0x%.8x\n", *(uint_t *)(((uchar_t *)&(exit_info2)) + 4)); + PrintError("io_info2 high = 0x%.8x\n", *(uint_t *)(((uint8_t *)&(exit_info2)) + 4)); if (info->shdw_pg_mode == SHADOW_PAGING) { @@ -301,7 +326,7 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i } // END OF SWITCH (EXIT_CODE) -#ifdef CONFIG_TELEMETRY +#ifdef V3_CONFIG_TELEMETRY if (info->vm_info->enable_telemetry) { v3_telemetry_end_exit(info, exit_code); }