{
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) )
{
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 == 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__ */
#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" );