Hello,

Damien Zammit, le mer. 07 janv. 2026 03:07:45 +0000, a ecrit:
> ---
>  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]);

Again, here, in KGSBASE it'll rather be the user gs base, not the kernel
one. So rather make it 0.

> +}
> +#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