diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-05-14 15:26:08 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-05-14 15:26:08 +0200 |
| commit | 9ebaf586257bf42996881b70a79cb2d57d8fd1ef (patch) | |
| tree | 093086456781af0b46d3c25950b12c6b36c40089 | |
| parent | dcbdbc9198774f72894dc25854c5687be8445914 (diff) | |
MHR-23: SMPManager.cxx: fix HardwareThread::Switch.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
| -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; |
