Convert dispatcher context switch functions to naked assembly
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user