From d88f9f0a15d8a6bd1c3dc83465738b662bf2a8e5 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Wed, 1 Apr 2026 11:18:28 +0200 Subject: [PATCH] Remove erroneous swapgs and implement proper segment setting --- xtoskrnl/ar/i686/archsup.S | 16 ++++++++++++---- xtoskrnl/includes/ar/i686/asmsup.h | 7 +++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/xtoskrnl/ar/i686/archsup.S b/xtoskrnl/ar/i686/archsup.S index dcd8817..7d02b61 100644 --- a/xtoskrnl/ar/i686/archsup.S +++ b/xtoskrnl/ar/i686/archsup.S @@ -109,13 +109,22 @@ _Ar\Type\Vector\()Start: mov %cr2, %eax mov %eax, TrapCr2(%ebp) - /* Test previous mode and swap GS if needed */ + /* Test previous mode */ movl $0, TrapPreviousMode(%ebp) mov TrapSegCs(%ebp), %ax and $3, %al mov %al, TrapPreviousMode(%ebp) jz KernelMode\Type\Vector - swapgs + + /* Load Kernel PB selector into FS */ + mov $KGDT_R0_PB, %ax + mov %ax, %fs + + /* Set sane data segment selectors */ + mov $(KGDT_R3_DATA | RPL_MASK), %ax + mov %ax, %ds + mov %ax, %es + jmp UserMode\Type\Vector KernelMode\Type\Vector: @@ -141,11 +150,10 @@ UserMode\Type\Vector: /* Clean up the stack */ add $4, %esp - /* Test previous mode and swapgs if needed */ + /* Test previous mode and disable interrupts before user mode return */ testb $1, TrapPreviousMode(%ebp) jz KernelModeReturn\Type\Vector cli - swapgs KernelModeReturn\Type\Vector: /* Restore segment selectors */ diff --git a/xtoskrnl/includes/ar/i686/asmsup.h b/xtoskrnl/includes/ar/i686/asmsup.h index 6b228f2..5eb490b 100644 --- a/xtoskrnl/includes/ar/i686/asmsup.h +++ b/xtoskrnl/includes/ar/i686/asmsup.h @@ -10,6 +10,13 @@ #define __XTOSKRNL_I686_ASMSUP_H +/* Selector masks */ +#define RPL_MASK 0x0003 + +/* GDT selectors */ +#define KGDT_R3_DATA 0x0020 +#define KGDT_R0_PB 0x0030 + /* KTRAP_FRAME structure offsets */ #define TrapPreviousMode 0 #define TrapCr2 4