x86: Use FSGSBASE for TLS changes (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 29 Feb 2016 23:34:45 +0000 (18:34 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 29 Feb 2016 23:34:45 +0000 (18:34 -0500)
When the CPU feature is available, userspace and the kernel will use the
instructions (e.g. wrfsbase) to change TLS.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/cpuinfo.c
kern/arch/x86/ros/mmu.h
kern/arch/x86/smp_boot.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/x86_64/tls.h

index 95273e4..3219421 100644 (file)
@@ -133,15 +133,11 @@ void print_cpuinfo(void)
        cpuid(0x07, 0x0, &eax, &ebx, &ecx, &edx);
        if (ebx & 0x00000001) {
                printk("FS/GS Base RD/W supported\n");
-               /* Untested, since we don't have a machine that supports this.  Email us
-                * if this fails. */
-               printk("Attempting to enable WRFSBASE...\n");
-               lcr4(rcr4() | (1 << 16));
+               cpu_set_feat(CPU_FEAT_X86_FSGSBASE);
        } else {
                printk("FS/GS Base RD/W not supported\n");
                #ifdef CONFIG_NOFASTCALL_FSBASE
-               printk("\nGIANT WARNING: Can't write FS Base from userspace, "
-                      "and no FASTCALL support!\n\n");
+               panic("Can't write FS Base from userspace, and no FASTCALL support!");
                #endif
        }
        cpuid(0x80000001, 0x0, &eax, &ebx, &ecx, &edx);
index d31beb3..6e423ad 100644 (file)
@@ -40,6 +40,7 @@
 #define CR4_OSXMME     0x00000400      // OS support for unmasked SIMD FP exceptions
 #define CR4_VMXE       0x00002000      // VMX enable
 #define CR4_SMXE       0x00004000      // SMX enable
+#define CR4_FSGSBASE   0x00010000      // RD/WR FS/GS Base enabled
 #define CR4_OSXSAVE    0x00040000      // XSAVE and processor extended states-enabled
 
 // Eflags register
index 8dedc27..8ffa6dc 100644 (file)
@@ -22,6 +22,7 @@
 #include <env.h>
 #include <trap.h>
 #include <kmalloc.h>
+#include <cpu_feat.h>
 #include <arch/fsgsbase.h>
 
 #include "vmm/vmm.h"
@@ -281,6 +282,8 @@ void __arch_pcpu_init(uint32_t coreid)
         * removal) */
        tlbflush();
 
+       if (cpu_has_feat(CPU_FEAT_X86_FSGSBASE))
+               lcr4(rcr4() | CR4_FSGSBASE);
        /* Enable SSE instructions.  We might have to do more, like masking certain
         * flags or exceptions in the MXCSR, or at least handle the SIMD exceptions.
         * We don't do it for FP yet either, so YMMV. */
index 2afe19c..f2bb363 100644 (file)
@@ -412,8 +412,11 @@ static inline void *__get_tls_desc(void)
 
 static inline void __set_tls_desc(void *tls_desc)
 {
-       /* TODO: check for and use WRFSBASE */
-       __fastcall_setfsbase((uintptr_t)tls_desc);
+       if (!cpu_has_feat(CPU_FEAT_X86_FSGSBASE)) {
+               __fastcall_setfsbase((uintptr_t)tls_desc);
+               return;
+       }
+       asm volatile ("wrfsbase %0" : : "r"(tls_desc));
 }
 
 static inline const char* tls_init_tp(void* thrdescr)