aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2006-02-14 19:43:45 +0100
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2006-02-14 19:43:45 +0100
commit84e877b23386eead61d5daaa9043282e32c3170f (patch)
tree03ad90f89a80245a28165f29c36e80f0d419ca49
parentf25330e8694f5507e6b922641ef553303a3c0976 (diff)
downloadxen-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.c8
-rw-r--r--xen/arch/x86/x86_32/traps.c13
-rw-r--r--xen/arch/x86/x86_64/traps.c8
-rw-r--r--xen/include/asm-x86/system.h6
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)&regs->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())