X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_handler.c;h=701619795b04abffd8bf350b3b76eefd949fec8b;hb=374b2d6d22a0e0dc6ed8d3d628e635ab935072e0;hp=9c20ae675228295e4da2598f15a482024900997e;hpb=28cfe68985ef4360c9bd7428a19c222b295e9d85;p=palacios.git diff --git a/palacios/src/palacios/svm_handler.c b/palacios/src/palacios/svm_handler.c index 9c20ae6..7016197 100644 --- a/palacios/src/palacios/svm_handler.c +++ b/palacios/src/palacios/svm_handler.c @@ -34,16 +34,21 @@ #include #include +#ifndef CONFIG_DEBUG_SVM +#undef PrintDebug +#define PrintDebug(fmt, args...) +#endif #ifdef CONFIG_TELEMETRY #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 - if (info->enable_telemetry) { + if (info->vm_info->enable_telemetry) { v3_telemetry_start_exit(info); } #endif @@ -208,9 +213,10 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i info->rip += 3; if (v3_handle_hypercall(info) == -1) { + PrintError("Error handling Hypercall\n"); return -1; } - + break; case VMEXIT_INTR: // handled by interrupt dispatch earlier @@ -240,9 +246,32 @@ int v3_handle_svm_exit(struct guest_info * info, addr_t exit_code, addr_t exit_i return -1; } break; - + case VMEXIT_RDTSC: +#ifdef CONFIG_DEBUG_TIME + PrintDebug("RDTSC/RDTSCP\n"); +#endif + if (v3_handle_rdtsc(info) == -1) { + PrintError("Error Handling RDTSC instruction\n"); + return -1; + } + break; + case VMEXIT_RDTSCP: +#ifdef CONFIG_DEBUG_TIME + PrintDebug("RDTSCP\n"); +#endif + if (v3_handle_rdtscp(info) == -1) { + PrintError("Error Handling RDTSCP instruction\n"); + return -1; + } + break; + case VMEXIT_SHUTDOWN: + PrintDebug("Guest-initiated shutdown\n"); + + info->vm_info->run_state = VM_STOPPED; + // Force exit on other cores + break; /* Exits Following this line are NOT HANDLED */ @@ -252,7 +281,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)); @@ -281,7 +310,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 - if (info->enable_telemetry) { + if (info->vm_info->enable_telemetry) { v3_telemetry_end_exit(info, exit_code); } #endif