Fix kernel stack's underflowing initial rsp

This commit is contained in:
nishirong
2024-04-07 16:54:36 +08:00
committed by Tate, Hongliang Tian
parent 4dd707488d
commit 02e4cdc80e

View File

@ -1,4 +1,5 @@
// SPDX-License-Identifier: MPL-2.0 // SPDX-License-Identifier: MPL-2.0
use core::mem::size_of;
use intrusive_collections::{intrusive_adapter, LinkedListAtomicLink}; use intrusive_collections::{intrusive_adapter, LinkedListAtomicLink};
@ -277,8 +278,10 @@ impl TaskOptions {
result.task_inner.lock().task_status = TaskStatus::Runnable; result.task_inner.lock().task_status = TaskStatus::Runnable;
result.task_inner.lock().ctx.rip = kernel_task_entry as usize; result.task_inner.lock().ctx.rip = kernel_task_entry as usize;
// Subtract 8 bytes to reserve space for the return address, otherwise
// we will write across the page bondary.
result.task_inner.lock().ctx.regs.rsp = result.task_inner.lock().ctx.regs.rsp =
(crate::vm::paddr_to_vaddr(result.kstack.end_paddr())) as u64; (crate::vm::paddr_to_vaddr(result.kstack.end_paddr() - size_of::<u64>())) as u64;
Ok(Arc::new(result)) Ok(Arc::new(result))
} }
@ -314,8 +317,10 @@ impl TaskOptions {
result.task_inner.lock().task_status = TaskStatus::Runnable; result.task_inner.lock().task_status = TaskStatus::Runnable;
result.task_inner.lock().ctx.rip = kernel_task_entry as usize; result.task_inner.lock().ctx.rip = kernel_task_entry as usize;
// Subtract 8 bytes to reserve space for the return address, otherwise
// we will write across the page bondary.
result.task_inner.lock().ctx.regs.rsp = result.task_inner.lock().ctx.regs.rsp =
(crate::vm::paddr_to_vaddr(result.kstack.end_paddr())) as u64; (crate::vm::paddr_to_vaddr(result.kstack.end_paddr() - size_of::<u64>())) as u64;
let arc_self = Arc::new(result); let arc_self = Arc::new(result);
arc_self.run(); arc_self.run();