diff options
Diffstat (limited to 'Kernel')
| -rw-r--r-- | Kernel/Source/SMPManager.cxx | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/Kernel/Source/SMPManager.cxx b/Kernel/Source/SMPManager.cxx index d9aac48e..2c3f11f2 100644 --- a/Kernel/Source/SMPManager.cxx +++ b/Kernel/Source/SMPManager.cxx @@ -78,12 +78,29 @@ namespace NewOS extern bool rt_check_stack(HAL::StackFramePtr stackPtr); + /// @brief Switch to hardware thread. + /// @param stack the new hardware thread. + /// @retval true stack was changed, code is running. + /// @retval false stack is invalid, previous code is running. bool HardwareThread::Switch(HAL::StackFramePtr stack) { if (!rt_check_stack(stack)) return false; - fStack = stack; + if (!fStack) + { + fStack = stack; + } + else + { + /// Keep the arguments, switch the base pointer, stack pointer + /// fs and gs registers. + + fStack->Rbp = stack->Rbp; + fStack->Rsp = stack->Rsp; + fStack->Fs = stack->Fs; + fStack->Gs = stack->Gs; + } rt_do_context_switch(fStack); return true; |
