From: Jack Lange Date: Thu, 23 Apr 2009 04:20:16 +0000 (-0500) Subject: added host cpu type function X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=de3fce7c94e36342005ae5f79fcf22937acde586 added host cpu type function --- diff --git a/palacios/include/palacios/svm.h b/palacios/include/palacios/svm.h index b522ee3..0be1c9a 100644 --- a/palacios/include/palacios/svm.h +++ b/palacios/include/palacios/svm.h @@ -38,8 +38,6 @@ #define CPUID_SVM_REV_AND_FEATURE_IDS_edx_svml 0x00000004 #define CPUID_SVM_REV_AND_FEATURE_IDS_edx_np 0x00000001 - -#define EFER_MSR 0xc0000080 #define EFER_MSR_svm_enable 0x00001000 /************/ diff --git a/palacios/include/palacios/vmm_ctrl_regs.h b/palacios/include/palacios/vmm_ctrl_regs.h index aafa83b..f23caad 100644 --- a/palacios/include/palacios/vmm_ctrl_regs.h +++ b/palacios/include/palacios/vmm_ctrl_regs.h @@ -25,6 +25,8 @@ #include +#define EFER_MSR 0xc0000080 + struct cr0_real { uint_t pe : 1; uint_t mp : 1; diff --git a/palacios/src/palacios/vmm.c b/palacios/src/palacios/vmm.c index c07476f..e860391 100644 --- a/palacios/src/palacios/vmm.c +++ b/palacios/src/palacios/vmm.c @@ -24,6 +24,8 @@ #include #include #include +#include +#include /* These should be the only global variables in Palacios */ @@ -67,3 +69,35 @@ void Init_V3(struct v3_os_hooks * hooks, struct v3_ctrl_ops * vmm_ops) { PrintDebug("CPU has no virtualization Extensions\n"); } } + + + +#ifdef __V3_32BIT__ + +v3_cpu_mode_t v3_get_host_cpu_mode() { + uint32_t cr4_val; + struct cr4_32 * cr4; + + __asm__ ( + "movl %%cr4, %0; " + : "=r"(cr4_val) + ); + + + cr4 = (struct cr4_32 *)&(cr4_val); + + if (cr4->pae == 1) { + return PROTECTED_PAE; + } else { + return PROTECTED; + } +} + +#elif __V3_64BIT__ + +v3_cpu_mode_t v3_get_host_cpu_mode() { + return LONG; +} + +#endif + diff --git a/palacios/src/palacios/vmm_direct_paging.c b/palacios/src/palacios/vmm_direct_paging.c index e6b1052..e50a458 100644 --- a/palacios/src/palacios/vmm_direct_paging.c +++ b/palacios/src/palacios/vmm_direct_paging.c @@ -111,8 +111,7 @@ int v3_handle_passthrough_pagefault(struct guest_info * info, addr_t fault_addr, int v3_handle_nested_pagefault(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) { - // THIS IS VERY BAD - v3_cpu_mode_t mode = LONG; + v3_cpu_mode_t mode = v3_get_host_cpu_mode() PrintDebug("Nested PageFault: fault_addr=%p, error_code=%u\n",(void*)fault_addr, *(uint_t *)&error_code);