diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2006-02-14 19:43:45 +0100 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2006-02-14 19:43:45 +0100 |
commit | 84e877b23386eead61d5daaa9043282e32c3170f (patch) | |
tree | 03ad90f89a80245a28165f29c36e80f0d419ca49 | |
parent | f25330e8694f5507e6b922641ef553303a3c0976 (diff) | |
download | xen-84e877b23386eead61d5daaa9043282e32c3170f.tar.gz xen-84e877b23386eead61d5daaa9043282e32c3170f.tar.bz2 xen-84e877b23386eead61d5daaa9043282e32c3170f.zip |
Fix segment-register dumping in show_registers().
Signed-off-by: Keir Fraser <keir@xensource.com>
-rw-r--r-- | xen/arch/x86/domain.c | 8 | ||||
-rw-r--r-- | xen/arch/x86/x86_32/traps.c | 13 | ||||
-rw-r--r-- | xen/arch/x86/x86_64/traps.c | 8 | ||||
-rw-r--r-- | xen/include/asm-x86/system.h | 6 |
4 files changed, 23 insertions, 12 deletions
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index f70d5ea329..1bea8813ed 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -615,10 +615,10 @@ static void save_segments(struct vcpu *v) if ( HVM_DOMAIN(v) ) hvm_save_segments(v); - __asm__ __volatile__ ( "mov %%ds,%0" : "=m" (regs->ds) ); - __asm__ __volatile__ ( "mov %%es,%0" : "=m" (regs->es) ); - __asm__ __volatile__ ( "mov %%fs,%0" : "=m" (regs->fs) ); - __asm__ __volatile__ ( "mov %%gs,%0" : "=m" (regs->gs) ); + regs->ds = read_segment_register(ds); + regs->es = read_segment_register(es); + regs->fs = read_segment_register(fs); + regs->gs = read_segment_register(gs); if ( regs->ds ) dirty_segment_mask |= DIRTY_DS; diff --git a/xen/arch/x86/x86_32/traps.c b/xen/arch/x86/x86_32/traps.c index 3a12b0c161..5d23bea594 100644 --- a/xen/arch/x86/x86_32/traps.c +++ b/xen/arch/x86/x86_32/traps.c @@ -37,16 +37,13 @@ void show_registers(struct cpu_user_regs *regs) if ( !GUEST_MODE(regs) ) { fault_regs.esp = (unsigned long)®s->esp; - fault_regs.ss = __HYPERVISOR_DS; - fault_regs.ds = __HYPERVISOR_DS; - fault_regs.es = __HYPERVISOR_DS; - fault_regs.cs = __HYPERVISOR_CS; + fault_regs.ss = read_segment_register(ss); + fault_regs.ds = read_segment_register(ds); + fault_regs.es = read_segment_register(es); + fault_regs.fs = read_segment_register(fs); + fault_regs.gs = read_segment_register(gs); } - __asm__ ( - "movw %%fs,%0 ; movw %%gs,%1" - : "=r" (fault_regs.fs), "=r" (fault_regs.gs) ); - fault_crs[0] = read_cr0(); fault_crs[3] = read_cr3(); } diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index b4cad7ef85..cd0ada0a9e 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -35,6 +35,10 @@ void show_registers(struct cpu_user_regs *regs) context = GUEST_MODE(regs) ? "guest" : "hypervisor"; fault_crs[0] = read_cr0(); fault_crs[3] = read_cr3(); + fault_regs.ds = read_segment_register(ds); + fault_regs.es = read_segment_register(es); + fault_regs.fs = read_segment_register(fs); + fault_regs.gs = read_segment_register(gs); } printk("----[ Xen-%d.%d%s %s ]----\n", @@ -57,6 +61,10 @@ void show_registers(struct cpu_user_regs *regs) fault_regs.r12, fault_regs.r13, fault_regs.r14); printk("r15: %016lx cr0: %016lx cr3: %016lx\n", fault_regs.r15, fault_crs[0], fault_crs[3]); + printk("ds: %04x es: %04x fs: %04x gs: %04x " + "ss: %04x cs: %04x\n", + fault_regs.ds, fault_regs.es, fault_regs.fs, + fault_regs.gs, fault_regs.ss, fault_regs.cs); show_stack(regs); } diff --git a/xen/include/asm-x86/system.h b/xen/include/asm-x86/system.h index cb5f64d001..7e6b95a050 100644 --- a/xen/include/asm-x86/system.h +++ b/xen/include/asm-x86/system.h @@ -5,6 +5,12 @@ #include <xen/types.h> #include <asm/bitops.h> +#define read_segment_register(name) \ +({ u16 __sel; \ + __asm__ __volatile__ ( "movw %%" STR(name) ",%0" : "=r" (__sel) ); \ + __sel; \ +}) + /* Clear and set 'TS' bit respectively */ #define clts() __asm__ __volatile__ ("clts") #define stts() write_cr0(X86_CR0_TS|read_cr0()) |