From 7011d456e95497aea277ff1e100d74ed4ca635b8 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Wed, 17 Apr 2024 16:48:18 +0200 Subject: [PATCH] Fix loading CS segment for AMD64 architecture --- xtoskrnl/ar/amd64/cpufunc.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/xtoskrnl/ar/amd64/cpufunc.c b/xtoskrnl/ar/amd64/cpufunc.c index dd564d5..2db1e56 100644 --- a/xtoskrnl/ar/amd64/cpufunc.c +++ b/xtoskrnl/ar/amd64/cpufunc.c @@ -235,30 +235,42 @@ ArLoadSegment(IN USHORT Segment, switch(Segment) { case SEGMENT_CS: - asm volatile("movl %0, %%cs" + /* Load CS Segment */ + asm volatile("mov %0, %%rax\n" + "push %%rax\n" + "lea label(%%rip), %%rax\n" + "push %%rax\n" + "lretq\n" + "label:" : - : "r" (Source)); + : "ri" ((ULONGLONG)Source) + : "rax"); break; case SEGMENT_DS: + /* Load DS Segment */ asm volatile("movl %0, %%ds" : : "r" (Source)); break; case SEGMENT_ES: + /* Load ES Segment */ asm volatile("movl %0, %%es" : : "r" (Source)); break; case SEGMENT_FS: + /* Load FS Segment */ asm volatile("movl %0, %%fs" : : "r" (Source)); break; case SEGMENT_GS: + /* Load GS Segment */ asm volatile("movl %0, %%gs" : : "r" (Source)); break; + /* Load SS Segment */ case SEGMENT_SS: asm volatile("movl %0, %%ss" :