|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86: introduce read_sregs() to allow storing to memory directly
commit 32a9ecca23b87db659c19fa5fc23c40309ba68ed
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Tue Sep 29 10:50:27 2020 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Sep 29 10:50:27 2020 +0200
x86: introduce read_sregs() to allow storing to memory directly
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@xxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
xen/arch/x86/domain.c | 5 +----
xen/arch/x86/x86_64/traps.c | 5 +----
xen/include/asm-x86/regs.h | 14 ++++++++++++++
xen/include/asm-x86/system.h | 6 ------
4 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index e8e91cf080..4273d272e7 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -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) )
{
diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c
index 93af0c5e87..fd049c5e14 100644
--- a/xen/arch/x86/x86_64/traps.c
+++ b/xen/arch/x86/x86_64/traps.c
@@ -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();
diff --git a/xen/include/asm-x86/regs.h b/xen/include/asm-x86/regs.h
index dc00b854e3..8d984ea388 100644
--- a/xen/include/asm-x86/regs.h
+++ b/xen/include/asm-x86/regs.h
@@ -15,4 +15,18 @@
(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__ */
diff --git a/xen/include/asm-x86/system.h b/xen/include/asm-x86/system.h
index 7e5891f3df..45c183bd10 100644
--- a/xen/include/asm-x86/system.h
+++ b/xen/include/asm-x86/system.h
@@ -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" );
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |