vmx-gdbserver-paging.patch
PATCH 1/1 vmx-gdbserver-paging.patch
gdbserver should not try to convert guest physical to machine physical if paging is not enabled.
Signed-off-by Arun Sharma <[email protected]>
xen/include/public/arch-x86_32.h +2 -0
@@ -134,6 +134,8 @@unsigned long gdt_frames[16 ], gdt_ents;/* GDT (machine frames, # ents) */ unsigned long kernel_ss, kernel_sp;/* Virtual TSS (only SS1/SP1) */ unsigned long pt_base;/* CR3 (pagetable base) */ +unsigned long cr0;/* CR0 */ +unsigned long cr4;/* CR4 */ unsigned long debugreg[8 ];/* DB0-DB7 (debug registers) */ unsigned long event_callback_cs;/* CS:EIP of event callback */ unsigned long event_callback_eip;
tools/libxc/xc_ptrace.c +10 -1
@@ -3,6 +3,8 @@#include "xc_private.h" #include <time.h> +#define X86_CR0_PE 0x00000001/* Enable Protected Mode (RW) */ +#define X86_CR0_PG 0x80000000/* Paging (RW) */ #define BSD_PAGE_MASK (PAGE_SIZE-1)#define PG_FRAME (~((unsigned long)BSD_PAGE_MASK)
@@ -132,6 +134,13 @@static unsigned long cr3[MAX_VIRT_CPUS ];static vcpu_guest_context_t ctxt[MAX_VIRT_CPUS ]; +static inline int paging_enabled (vcpu_guest_context_t *v) +{ +unsigned long cr0 = v->cr0; + +return (cr0 &X86_CR0_PE ) && (cr0 &X86_CR0_PG ); +} +/* --------------------- */ static void *
@@ -179,7 +188,7 @@ }if ((pde = cr3_virt[cpu][vtopdi (va)]) ==0 )/* logical address */ goto error_out; -if (ctxt[cpu].flags &VGCF_VMX_GUEST ) +if ((ctxt[cpu].flags &VGCF_VMX_GUEST ) &&paging_enabled (&ctxt[cpu])) pde = page_array[pde >>PAGE_SHIFT ] <<PAGE_SHIFT ;if (pde != pde_phys[cpu]) {
xen/arch/x86/dom0_ops.c +4 -1
@@ -393,8 +393,11 @@#ifdef __i386__#ifdef CONFIG_VMX -if (VMX_DOMAIN (v) ) +if (VMX_DOMAIN (v) ) {save_vmx_cpu_user_regs (&c->user_regs); +__vmread (CR0_READ_SHADOW , &c->cr0); +__vmread (CR4_READ_SHADOW , &c->cr4); + }#endif #endif