diff options
author | arun.sharma@intel.com[kaf24] <arun.sharma@intel.com[kaf24]> | 2005-06-23 10:05:06 +0000 |
---|---|---|
committer | arun.sharma@intel.com[kaf24] <arun.sharma@intel.com[kaf24]> | 2005-06-23 10:05:06 +0000 |
commit | 5ce68b82c6e12f09d361dc9d3bc3cc965ce6d1cd (patch) | |
tree | 37d9009eade8c24ff71d2f377d5ef68f6b948fe4 | |
parent | 7331904137db2c07bea47936628fe7b866604a6a (diff) | |
download | xen-5ce68b82c6e12f09d361dc9d3bc3cc965ce6d1cd.tar.gz xen-5ce68b82c6e12f09d361dc9d3bc3cc965ce6d1cd.tar.bz2 xen-5ce68b82c6e12f09d361dc9d3bc3cc965ce6d1cd.zip |
bitkeeper revision 1.1741 (42ba8952xTiiA50azru9j4tKvXIVDA)
[PATCH] 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 <arun.sharma@intel.com>
-rw-r--r-- | tools/libxc/xc_ptrace.c | 11 | ||||
-rw-r--r-- | xen/arch/x86/dom0_ops.c | 5 | ||||
-rw-r--r-- | xen/include/public/arch-x86_32.h | 2 |
3 files changed, 16 insertions, 2 deletions
diff --git a/tools/libxc/xc_ptrace.c b/tools/libxc/xc_ptrace.c index 1db45a7bbb..a8b39a648d 100644 --- a/tools/libxc/xc_ptrace.c +++ b/tools/libxc/xc_ptrace.c @@ -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 int regs_valid[MAX_VIRT_CPUS]; 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 @@ map_domain_va(unsigned long domid, int cpu, void * guest_va, int perm) } 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]) { diff --git a/xen/arch/x86/dom0_ops.c b/xen/arch/x86/dom0_ops.c index 2a269f11b6..fdefebd4b6 100644 --- a/xen/arch/x86/dom0_ops.c +++ b/xen/arch/x86/dom0_ops.c @@ -393,8 +393,11 @@ void arch_getdomaininfo_ctxt( #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 diff --git a/xen/include/public/arch-x86_32.h b/xen/include/public/arch-x86_32.h index 1a11a3be86..44bc8dd46f 100644 --- a/xen/include/public/arch-x86_32.h +++ b/xen/include/public/arch-x86_32.h @@ -137,6 +137,8 @@ typedef struct vcpu_guest_context { 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; |