vmx-worldswitch-1-to-1.patch
PATCH 1/1 vmx-worldswitch-1-to-1.patch
Fix VMX world switch to use 1:1 page tables when the guest has paging disabled. Also do a printk instead of VMX_DBG_LOG() anytime we crash a domain.
Signed-off-by Arun Sharma <[email protected]>
tools/libxc/xc_vmx_build.c +1 -1
@@ -10,7 +10,7 @@#include <zlib.h> #include "linux_boot_params.h" -#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED) +#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_USER)#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)#define round_pgup (_p) (((_p)+(PAGE_SIZE-1))&PAGE_MASK)
===== xen/arch/x86/domain.c 1.200 vs edited =====
xen/arch/x86/domain.c +0 -1
@@ -339,7 +339,6 @@ } ed->arch.schedule_tail = arch_vmx_do_launch; -clear_bit (VMX_CPU_STATE_PG_ENABLED , &ed->arch.arch_vmx.cpu_state);#if defined (__i386) ed->arch.arch_vmx.vmx_platform.real_mode_data =
===== xen/arch/x86/vmx.c 1.58 vs edited =====
xen/arch/x86/vmx.c +29 -29
160 lines not on this page · raw message
===== xen/arch/x86/vmx_io.c 1.24 vs edited =====
xen/arch/x86/vmx_io.c +1 -1
@@ -430,7 +430,7 @@void vmx_do_resume (struct exec_domain *d) {vmx_stts (); -if (test_bit (VMX_CPU_STATE_PG_ENABLED , &d->arch.arch_vmx.cpu_state) ) +if (vmx_paging_enabled (d) )__vmwrite (GUEST_CR3 ,pagetable_val (d->arch.shadow_table));else // paging is not enabled in the guest
===== xen/arch/x86/vmx_platform.c 1.19 vs edited =====
xen/arch/x86/vmx_platform.c +7 -3
@@ -418,8 +418,12 @@ }if ((guest_eip &PAGE_MASK ) == ((guest_eip + inst_len) &PAGE_MASK )) { - gpte =gva_to_gpte (guest_eip); - mfn =phys_to_machine_mapping (l1e_get_pfn (gpte)); +if (vmx_paging_enabled (current)) { + gpte =gva_to_gpte (guest_eip); + mfn =phys_to_machine_mapping (l1e_get_pfn (gpte)); + }else { + mfn =phys_to_machine_mapping (guest_eip >>PAGE_SHIFT ); + } ma = (mfn <<PAGE_SHIFT ) | (guest_eip & (PAGE_SIZE -1 )); inst_start = (unsigned char *)map_domain_mem (ma);
@@ -509,7 +513,7 @@ }else p->count =1 ; -if (pvalid) +if ((pvalid) &&vmx_paging_enabled (current)) p->u.pdata = (void *)gva_to_gpa (p->u.data);#if 0
===== xen/arch/x86/vmx_vmcs.c 1.25 vs edited =====
xen/arch/x86/vmx_vmcs.c +1 -1
@@ -291,7 +291,7 @@/* Initally PG, PE are not set*/ shadow_cr = host_env->cr0; - shadow_cr &= ~(X86_CR0_PE |X86_CR0_PG ); + shadow_cr &= ~X86_CR0_PG ; error |=__vmwrite (CR0_READ_SHADOW , shadow_cr);/* CR3 is set in vmx_final_setup_guest */ error |=__vmwrite (GUEST_CR4 , host_env->cr4);
===== xen/arch/x86/x86_32/traps.c 1.27 vs edited =====
xen/arch/x86/x86_32/traps.c +7 -1
@@ -20,8 +20,9 @@unsigned long ss, ds, es, fs, gs, cs;unsigned long eip, esp, eflags;const char *context; -#ifdef CONFIG_VMX +unsigned long cr0, cr3; +if (VMX_DOMAIN (current) && (regs->eflags ==0 ) ) {__vmread (GUEST_EIP , &eip);
@@ -33,6 +34,8 @@__vmread (GUEST_FS_SELECTOR , &fs);__vmread (GUEST_GS_SELECTOR , &gs);__vmread (GUEST_CS_SELECTOR , &cs); +__vmread (CR0_READ_SHADOW , &cr0); +__vmread (GUEST_CR3 , &cr3); context ="vmx guest" ; }else
@@ -77,6 +80,9 @@printk ("ds: %04lx es: %04lx fs: %04lx gs: %04lx " "ss: %04lx cs: %04lx\n" , ds, es, fs, gs, ss, cs); +#ifdef CONFIG_VMX +printk ("cr0: %08lx cr3: %08lx\n" , cr0, cr3); +#endif if (GUEST_MODE (regs) )show_guest_stack ();
===== xen/include/asm-x86/shadow.h 1.97 vs edited =====
xen/include/asm-x86/shadow.h +5 -2
@@ -31,6 +31,9 @@#include <asm/processor.h> #include <asm/domain_page.h> #include <public/dom0_ops.h> +#ifdef CONFIG_VMX +#include <asm/vmx.h> +#endif /* Shadow PT operation mode : shadow-mode variable in arch_domain. */
@@ -1672,8 +1675,8 @@#ifdef CONFIG_VMX if (VMX_DOMAIN (ed) ) - paging_enabled = -test_bit (VMX_CPU_STATE_PG_ENABLED , &ed->arch.arch_vmx.cpu_state); + paging_enabled =vmx_paging_enabled (ed); + else#endif // HACK ALERT: there's currently no easy way to figure out if a domU
===== xen/include/asm-x86/vmx.h 1.8 vs edited =====
xen/include/asm-x86/vmx.h +10 -1
@@ -294,5 +294,14 @@if (!(cr0 &X86_CR0_TS )) __vm_set_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_NM); } - + +/* Works only for ed == current */ +static inline int vmx_paging_enabled (struct exec_domain *ed) +{ +unsigned long cr0; + +__vmread (CR0_READ_SHADOW , &cr0); +return (cr0 &X86_CR0_PE ) && (cr0 &X86_CR0_PG ); +} +#endif /* __ASM_X86_VMX_H__ */
===== xen/include/asm-x86/vmx_vmcs.h 1.11 vs edited =====
xen/include/asm-x86/vmx_vmcs.h +0 -1
@@ -29,7 +29,6 @@void vmx_enter_scheduler (void ); -#define VMX_CPU_STATE_PG_ENABLED 0#define VMX_CPU_STATE_ASSIST_ENABLED 1struct vmcs_struct {