---
 i386/i386/gdt.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/i386/i386/gdt.c b/i386/i386/gdt.c
index 9409c2fe..36712d3f 100644
--- a/i386/i386/gdt.c
+++ b/i386/i386/gdt.c
@@ -40,6 +40,7 @@
 
 #include "vm_param.h"
 #include "seg.h"
+#include "msr.h"
 #include "gdt.h"
 #include "mp_desc.h"
 
@@ -110,6 +111,15 @@ gdt_fill(int cpu, struct real_descriptor *mygdt)
 #endif /* MACH_PV_DESCRIPTORS */
 }
 
+#ifdef __x86_64__
+static void
+reload_gs_base(int cpu)
+{
+       wrmsr(MSR_REG_GSBASE, (uint64_t)&percpu_array[cpu]);
+       wrmsr(MSR_REG_KGSBASE, (uint64_t)&percpu_array[cpu]);
+}
+#endif
+
 static void
 reload_segs(void)
 {
@@ -137,7 +147,9 @@ void
 gdt_init(void)
 {
        gdt_fill(0, gdt);
-
+#ifdef __x86_64__
+       reload_gs_base(0);
+#endif
        reload_segs();
 
 #ifdef MACH_PV_PAGETABLES
@@ -156,7 +168,9 @@ void
 ap_gdt_init(int cpu)
 {
        gdt_fill(cpu, mp_gdt[cpu]);
-
+#ifdef __x86_64__
+       reload_gs_base(cpu);
+#endif
        reload_segs();
 }
 #endif
-- 
2.45.2



Reply via email to