]> xenbits.xensource.com Git - people/pauldu/xen.git/commitdiff
x86: introduce read_sregs() to allow storing to memory directly
authorJan Beulich <jbeulich@suse.com>
Tue, 29 Sep 2020 08:50:27 +0000 (10:50 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 29 Sep 2020 08:50:27 +0000 (10:50 +0200)
When storing all (data) segment registers in one go, prefer writing the
selector values directly to memory (as opposed to read_sreg()).

Also move the single register variant into the regs.h, dropping the
unecessary "volatile" from the asm() (there are no hidden side effects).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/domain.c
xen/arch/x86/x86_64/traps.c
xen/include/asm-x86/regs.h
xen/include/asm-x86/system.h

index e8e91cf08006ead13a0114b744ebfef8ab2365f3..4273d272e724b61ef5f7d431b7b994ca59cf749f 100644 (file)
@@ -1703,10 +1703,7 @@ static void save_segments(struct vcpu *v)
 {
     struct cpu_user_regs *regs = &v->arch.user_regs;
 
-    regs->ds = read_sreg(ds);
-    regs->es = read_sreg(es);
-    regs->fs = read_sreg(fs);
-    regs->gs = read_sreg(gs);
+    read_sregs(regs);
 
     if ( !is_pv_32bit_vcpu(v) )
     {
index 93af0c5e879629795d4c2e8c754e4e1de3cb3be5..fd049c5e14ff922054f441ab0b92fbe7a55b612e 100644 (file)
@@ -43,10 +43,7 @@ static void read_registers(struct cpu_user_regs *regs, unsigned long crs[8])
     crs[2] = read_cr2();
     crs[3] = read_cr3();
     crs[4] = read_cr4();
-    regs->ds = read_sreg(ds);
-    regs->es = read_sreg(es);
-    regs->fs = read_sreg(fs);
-    regs->gs = read_sreg(gs);
+    read_sregs(regs);
     crs[5] = rdfsbase();
     crs[6] = rdgsbase();
     crs[7] = rdgsshadow();
index dc00b854e30b5c094273122cdd141ce9810e793f..8d984ea38826d0c79cca7c9efe382860aaa4810c 100644 (file)
     (diff == 0);                                                              \
 })
 
+#define read_sreg(name) ({                           \
+    unsigned int __sel;                              \
+    asm ( "mov %%" STR(name) ",%0" : "=r" (__sel) ); \
+    __sel;                                           \
+})
+
+static inline void read_sregs(struct cpu_user_regs *regs)
+{
+    asm ( "mov %%ds, %0" : "=m" (regs->ds) );
+    asm ( "mov %%es, %0" : "=m" (regs->es) );
+    asm ( "mov %%fs, %0" : "=m" (regs->fs) );
+    asm ( "mov %%gs, %0" : "=m" (regs->gs) );
+}
+
 #endif /* __X86_REGS_H__ */
index 7e5891f3dfafbfec923cea31fdaa056e55c5c5ca..45c183bd101c015cf196ff6a6e636c9f520462bb 100644 (file)
@@ -5,12 +5,6 @@
 #include <xen/bitops.h>
 #include <asm/processor.h>
 
-#define read_sreg(name)                                         \
-({  unsigned int __sel;                                         \
-    asm volatile ( "mov %%" STR(name) ",%0" : "=r" (__sel) );   \
-    __sel;                                                      \
-})
-
 static inline void wbinvd(void)
 {
     asm volatile ( "wbinvd" ::: "memory" );