---
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