Convert dispatcher context switch functions to naked assembly
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 38s
Builds / ExectOS (amd64, release) (push) Successful in 36s
Builds / ExectOS (i686, debug) (push) Successful in 37s
Builds / ExectOS (i686, release) (push) Successful in 34s

This commit is contained in:
2026-06-10 16:48:54 +02:00
parent c57aa98923
commit 32f0b747a1
2 changed files with 16 additions and 36 deletions

View File

@@ -22,13 +22,12 @@
* *
* @since XT 1.0 * @since XT 1.0
*/ */
XTASSEMBLY
XTFASTCALL XTFASTCALL
BOOLEAN BOOLEAN
KE::Dispatcher::SwitchContext(IN PKTHREAD CurrentThread, KE::Dispatcher::SwitchContext(IN PKTHREAD CurrentThread,
IN KRUNLEVEL RunLevel) IN KRUNLEVEL RunLevel)
{ {
BOOLEAN PendingApc;
/* Save non-volatile and XMM registers to the exception frame, align the stack and invoke the switch routine */ /* Save non-volatile and XMM registers to the exception frame, align the stack and invoke the switch routine */
__asm__ volatile("subq %[ExFrameSize], %%rsp\n" __asm__ volatile("subq %[ExFrameSize], %%rsp\n"
"movq %%rbp, %c[ExRbp](%%rsp)\n" "movq %%rbp, %c[ExRbp](%%rsp)\n"
@@ -69,10 +68,9 @@ KE::Dispatcher::SwitchContext(IN PKTHREAD CurrentThread,
"movdqa %c[ExXmm14](%%rsp), %%xmm14\n" "movdqa %c[ExXmm14](%%rsp), %%xmm14\n"
"movdqa %c[ExXmm15](%%rsp), %%xmm15\n" "movdqa %c[ExXmm15](%%rsp), %%xmm15\n"
"addq %[ExFrameSize], %%rsp\n" "addq %[ExFrameSize], %%rsp\n"
: "=a" (PendingApc) "ret\n"
: "c" (CurrentThread), :
"d" (RunLevel), : [ExFrameSize] "i" (sizeof(KEXCEPTION_FRAME) - 8),
[ExFrameSize] "i" (sizeof(KEXCEPTION_FRAME) - 8),
[ExR12] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, R12)), [ExR12] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, R12)),
[ExR13] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, R13)), [ExR13] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, R13)),
[ExR14] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, R14)), [ExR14] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, R14)),
@@ -93,9 +91,6 @@ KE::Dispatcher::SwitchContext(IN PKTHREAD CurrentThread,
[ExXmm15] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Xmm15)), [ExXmm15] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Xmm15)),
[SwitchRoutine] "i" (SwitchThreadStack) [SwitchRoutine] "i" (SwitchThreadStack)
: "cc", "memory", "r8", "r9", "r10", "r11"); : "cc", "memory", "r8", "r9", "r10", "r11");
/* Return the APC status */
return PendingApc;
} }
/** /**
@@ -134,13 +129,12 @@ KE::Dispatcher::SwitchThreadContext(IN PKTHREAD CurrentThread,
* *
* @since XT 1.0 * @since XT 1.0
*/ */
XTASSEMBLY
XTFASTCALL XTFASTCALL
BOOLEAN BOOLEAN
KE::Dispatcher::SwitchThreadStack(IN PKTHREAD CurrentThread, KE::Dispatcher::SwitchThreadStack(IN PKTHREAD CurrentThread,
IN KRUNLEVEL RunLevel) IN KRUNLEVEL RunLevel)
{ {
BOOLEAN PendingApc;
/* Preserve MXCSR, synchronize with CPUs, switch stack and call the switch routine */ /* Preserve MXCSR, synchronize with CPUs, switch stack and call the switch routine */
__asm__ volatile("pushq %%rbp\n" __asm__ volatile("pushq %%rbp\n"
"subq %[FrameSize], %%rsp\n" "subq %[FrameSize], %%rsp\n"
@@ -160,10 +154,9 @@ KE::Dispatcher::SwitchThreadStack(IN PKTHREAD CurrentThread,
"ldmxcsr %c[SwMxCsr](%%rsp)\n" "ldmxcsr %c[SwMxCsr](%%rsp)\n"
"addq %[FrameSize], %%rsp\n" "addq %[FrameSize], %%rsp\n"
"popq %%rbp\n" "popq %%rbp\n"
: "=a" (PendingApc) "ret\n"
: "c" (CurrentThread), :
"d" (RunLevel), : [FrameSize] "i" (FIELD_OFFSET(KSWITCH_FRAME, Rbp)),
[FrameSize] "i" (FIELD_OFFSET(KSWITCH_FRAME, Rbp)),
[PrcbcCurrentThread] "i" (FIELD_OFFSET(KPROCESSOR_BLOCK, Prcb.CurrentThread)), [PrcbcCurrentThread] "i" (FIELD_OFFSET(KPROCESSOR_BLOCK, Prcb.CurrentThread)),
[SwApcBypass] "i" (FIELD_OFFSET(KSWITCH_FRAME, ApcBypass)), [SwApcBypass] "i" (FIELD_OFFSET(KSWITCH_FRAME, ApcBypass)),
[SwMxCsr] "i" (FIELD_OFFSET(KSWITCH_FRAME, MxCsr)), [SwMxCsr] "i" (FIELD_OFFSET(KSWITCH_FRAME, MxCsr)),
@@ -171,7 +164,4 @@ KE::Dispatcher::SwitchThreadStack(IN PKTHREAD CurrentThread,
[ThrdStack] "i" (FIELD_OFFSET(KTHREAD, KernelStack)), [ThrdStack] "i" (FIELD_OFFSET(KTHREAD, KernelStack)),
[ThrdSwapBusy] "i" (FIELD_OFFSET(KTHREAD, SwapBusy)) [ThrdSwapBusy] "i" (FIELD_OFFSET(KTHREAD, SwapBusy))
: "cc", "memory", "r8", "r9", "r10", "r11"); : "cc", "memory", "r8", "r9", "r10", "r11");
/* Return the APC status */
return PendingApc;
} }

View File

@@ -22,13 +22,12 @@
* *
* @since XT 1.0 * @since XT 1.0
*/ */
XTASSEMBLY
XTFASTCALL XTFASTCALL
BOOLEAN BOOLEAN
KE::Dispatcher::SwitchContext(IN PKTHREAD CurrentThread, KE::Dispatcher::SwitchContext(IN PKTHREAD CurrentThread,
IN KRUNLEVEL RunLevel) IN KRUNLEVEL RunLevel)
{ {
BOOLEAN PendingApc;
/* Save registers to the exception frame and invoke the stack switch routine */ /* Save registers to the exception frame and invoke the stack switch routine */
__asm__ volatile("subl %[ExFrameSize], %%esp\n" __asm__ volatile("subl %[ExFrameSize], %%esp\n"
"movl %%esi, %c[ExEsi](%%esp)\n" "movl %%esi, %c[ExEsi](%%esp)\n"
@@ -41,19 +40,15 @@ KE::Dispatcher::SwitchContext(IN PKTHREAD CurrentThread,
"movl %c[ExEdi](%%esp), %%edi\n" "movl %c[ExEdi](%%esp), %%edi\n"
"movl %c[ExEsi](%%esp), %%esi\n" "movl %c[ExEsi](%%esp), %%esi\n"
"addl %[ExFrameSize], %%esp\n" "addl %[ExFrameSize], %%esp\n"
: "=a" (PendingApc) "ret\n"
: "c" (CurrentThread), :
"d" (RunLevel), : [ExFrameSize] "i" (sizeof(KEXCEPTION_FRAME) - 4),
[ExFrameSize] "i" (sizeof(KEXCEPTION_FRAME) - 4),
[ExEbp] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Ebp)), [ExEbp] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Ebp)),
[ExEbx] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Ebx)), [ExEbx] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Ebx)),
[ExEdi] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Edi)), [ExEdi] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Edi)),
[ExEsi] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Esi)), [ExEsi] "i" (FIELD_OFFSET(KEXCEPTION_FRAME, Esi)),
[SwitchRoutine] "i" (SwitchThreadStack) [SwitchRoutine] "i" (SwitchThreadStack)
: "cc", "memory"); : "cc", "memory");
/* Return the APC status */
return PendingApc;
} }
/** /**
@@ -92,13 +87,12 @@ KE::Dispatcher::SwitchThreadContext(IN PKTHREAD CurrentThread,
* *
* @since XT 1.0 * @since XT 1.0
*/ */
XTASSEMBLY
XTFASTCALL XTFASTCALL
BOOLEAN BOOLEAN
KE::Dispatcher::SwitchThreadStack(IN PKTHREAD CurrentThread, KE::Dispatcher::SwitchThreadStack(IN PKTHREAD CurrentThread,
IN KRUNLEVEL RunLevel) IN KRUNLEVEL RunLevel)
{ {
BOOLEAN PendingApc;
/* Save old state, synchronize with CPUs, switch stack and call the switch routine */ /* Save old state, synchronize with CPUs, switch stack and call the switch routine */
__asm__ volatile("subl %[FrameSize], %%esp\n" __asm__ volatile("subl %[FrameSize], %%esp\n"
"movl %%fs:%c[PrcbcCurrentThread], %%ebx\n" "movl %%fs:%c[PrcbcCurrentThread], %%ebx\n"
@@ -116,10 +110,9 @@ KE::Dispatcher::SwitchThreadStack(IN PKTHREAD CurrentThread,
"movzbl %c[SwApcBypass](%%esp), %%edx\n" "movzbl %c[SwApcBypass](%%esp), %%edx\n"
"call %P[SwitchRoutine]\n" "call %P[SwitchRoutine]\n"
"addl %[FrameSize], %%esp\n" "addl %[FrameSize], %%esp\n"
: "=a" (PendingApc) "ret\n"
: "c" (CurrentThread), :
"d" (RunLevel), : [FrameSize] "i" (sizeof(KSWITCH_FRAME) - 4),
[FrameSize] "i" (sizeof(KSWITCH_FRAME) - 4),
[PrcbcCurrentThread] "i" (FIELD_OFFSET(KPROCESSOR_BLOCK, Prcb.CurrentThread)), [PrcbcCurrentThread] "i" (FIELD_OFFSET(KPROCESSOR_BLOCK, Prcb.CurrentThread)),
[SwApcBypass] "i" (FIELD_OFFSET(KSWITCH_FRAME, ApcBypassDisabled)), [SwApcBypass] "i" (FIELD_OFFSET(KSWITCH_FRAME, ApcBypassDisabled)),
[SwExceptionList] "i" (FIELD_OFFSET(KSWITCH_FRAME, ExceptionList)), [SwExceptionList] "i" (FIELD_OFFSET(KSWITCH_FRAME, ExceptionList)),
@@ -128,7 +121,4 @@ KE::Dispatcher::SwitchThreadStack(IN PKTHREAD CurrentThread,
[ThrdStack] "i" (FIELD_OFFSET(KTHREAD, KernelStack)), [ThrdStack] "i" (FIELD_OFFSET(KTHREAD, KernelStack)),
[ThrdSwapBusy] "i" (FIELD_OFFSET(KTHREAD, SwapBusy)) [ThrdSwapBusy] "i" (FIELD_OFFSET(KTHREAD, SwapBusy))
: "cc", "memory"); : "cc", "memory");
/* Return the APC status */
return PendingApc;
} }