fix(interrupts): use proper kernel stack when returning to idle loop #82
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Root Cause Analysis
When a userspace process faults and the page fault handler terminates it, the handler
sets up the exception frame to return to
idle_loop. Previously, we used:This captures the CURRENT RSP which is on the IST page fault stack (IST[1]).
When IRET returns to idle_loop with this RSP, idle_loop runs on the small IST stack.
Timer interrupts then push frames onto this stack, eventually causing overflow and
corrupting RSP to values like
0xffffc97ffffffff0.Fix
Use
per_cpu::kernel_stack_top()to get the idle thread's actual kernel stack,which is large (64KB) and meant for normal execution.
Test plan
🤖 Generated with Claude Code