x86: Use Linux's MSR_SFMASK values
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Nov 2016 23:40:29 +0000 (18:40 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 7 Dec 2016 22:46:48 +0000 (14:46 -0800)
Whatever bits are set in SFMASK will be clear when we enter the kernel on a
SYSENTER/SYSCALL.  We had been paranoid and cleared everything.  Linux does
not.  The benefit to us using the same value is that we are less likely to
need to write_msr() when running a Linux VM.

The ridiculous thing is that there's no reason not to mask all the bits.
Over time, Linux actually changed theirs too.  Back in 2.6, it was just TF,
DF, and IF.  Later they added more.  Why not just mask it all?  Maybe
there's a reason.  Maybe not.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/trap64.h

index 19f1cc5..b3165d5 100644 (file)
@@ -38,7 +38,7 @@ static inline void x86_fake_rdtscp(struct hw_trapframe *hw_tf)
                             ((uint64_t)GD_KT << 32))
 #define AKAROS_MSR_LSTAR ((uintptr_t)&sysenter_handler)
 /* Masking all flags.  when we syscall, we'll get rflags = 0 */
-#define AKAROS_MSR_SFMASK 0xffffffff
+#define AKAROS_MSR_SFMASK (FL_AC | FL_NT | FL_IOPL_MASK | FL_DF | FL_IF | FL_TF)
 
 static inline void x86_sysenter_init(void)
 {