From f03515b0eb71c62e2f1d1268a79de369f9741012 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Wed, 29 Apr 2026 20:23:01 +0200 Subject: [PATCH] Refactor KE::KernelInit::SwitchBootStack() inline assembly --- xtoskrnl/ke/amd64/krnlinit.cc | 18 +++++++++--------- xtoskrnl/ke/i686/krnlinit.cc | 21 ++++++++++----------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/xtoskrnl/ke/amd64/krnlinit.cc b/xtoskrnl/ke/amd64/krnlinit.cc index 9148e49..03a9895 100644 --- a/xtoskrnl/ke/amd64/krnlinit.cc +++ b/xtoskrnl/ke/amd64/krnlinit.cc @@ -144,14 +144,14 @@ KE::KernelInit::SwitchBootStack(VOID) StartKernel = (PVOID)KE::KernelInit::StartKernel; /* Discard old stack frame, switch stack and jump to KernelInit::StartKernel() */ - __asm__ volatile("mov %0, %%rdx\n" - "xor %%rbp, %%rbp\n" - "mov %%rdx, %%rsp\n" - "sub %1, %%rsp\n" - "jmp *%2\n" + __asm__ volatile("movq %[Stack], %%rsp\n" + "subq %[TotalSize], %%rsp\n" + "xorq %%rbp, %%rbp\n" + "jmp *%[TargetRoutine]\n" : - : "m" (Stack), - "i" (FLOATING_SAVE_AREA_SIZE | KEXCEPTION_FRAME_SIZE | KSWITCH_FRAME_SIZE | KRETURN_ADDRESS_SIZE), - "r" (StartKernel) - : "rdx", "rbp", "rsp", "memory"); + : [Stack] "r" (Stack), + [TargetRoutine] "r" (StartKernel), + [TotalSize] "i" (FLOATING_SAVE_AREA_SIZE + KEXCEPTION_FRAME_SIZE + + KSWITCH_FRAME_SIZE + KRETURN_ADDRESS_SIZE) + : "memory", "rbp", "rsp"); } diff --git a/xtoskrnl/ke/i686/krnlinit.cc b/xtoskrnl/ke/i686/krnlinit.cc index aed82f0..7a9a913 100644 --- a/xtoskrnl/ke/i686/krnlinit.cc +++ b/xtoskrnl/ke/i686/krnlinit.cc @@ -144,16 +144,15 @@ KE::KernelInit::SwitchBootStack(VOID) StartKernel = (PVOID)KE::KernelInit::StartKernel; /* Discard old stack frame, switch stack, make space for NPX and jump to KernelInit::StartKernel() */ - __asm__ volatile("mov %0, %%edx\n" - "xor %%ebp, %%ebp\n" - "mov %%edx, %%esp\n" - "sub %1, %%esp\n" - "push %2\n" - "jmp *%3\n" + __asm__ volatile("movl %[Stack], %%esp\n" + "subl %[TotalSize], %%esp\n" + "xorl %%ebp, %%ebp\n" + "pushl %[Cr0Value]\n" + "jmp *%[TargetRoutine]\n" : - : "m" (Stack), - "i" (KTRAP_FRAME_ALIGN | KTRAP_FRAME_SIZE | NPX_FRAME_SIZE | KRETURN_ADDRESS_SIZE), - "i" (CR0_EM | CR0_MP | CR0_TS), - "r" (StartKernel) - : "edx", "ebp", "esp", "memory"); + : [Cr0Value] "i" (CR0_EM | CR0_MP | CR0_TS), + [Stack] "r" (Stack), + [TargetRoutine] "r" (StartKernel), + [TotalSize] "i" (KTRAP_FRAME_ALIGN + KTRAP_FRAME_SIZE + NPX_FRAME_SIZE + KRETURN_ADDRESS_SIZE) + : "ebp", "esp", "memory"); }