Struct axhal::arch::TaskContext
source · pub struct TaskContext {
pub kstack_top: VirtAddr,
pub rsp: u64,
pub fs_base: usize,
pub gs_base: usize,
pub ext_state: ExtendedState,
pub cr3: PhysAddr,
}
Expand description
Saved hardware states of a task.
The context usually includes:
- Callee-saved registers
- Stack pointer register
- Thread pointer register (for thread-local storage, currently unsupported)
- FP/SIMD registers
On context switch, current task saves its context from CPU to memory, and the next task restores its context from memory to CPU.
On x86_64, callee-saved registers are saved to the kernel stack by the
PUSH
instruction. So that rsp
is the RSP
after callee-saved
registers are pushed, and kstack_top
is the top of the kernel stack
(RSP
before any push).
Fields§
§kstack_top: VirtAddr
The kernel stack top of the task.
rsp: u64
RSP
after all callee-saved registers are pushed.
fs_base: usize
Thread Local Storage (TLS).
gs_base: usize
uspace
only.The gs_base
register value.
ext_state: ExtendedState
fp_simd
only.Extended states, i.e., FP/SIMD states.
cr3: PhysAddr
uspace
only.The CR3
register value, i.e., the page table root.
Implementations§
source§impl TaskContext
impl TaskContext
sourcepub fn init(&mut self, entry: usize, kstack_top: VirtAddr, tls_area: VirtAddr)
pub fn init(&mut self, entry: usize, kstack_top: VirtAddr, tls_area: VirtAddr)
Initializes the context for a new task, with the given entry point and kernel stack.
sourcepub fn set_page_table_root(&mut self, cr3: PhysAddr)
Available on crate feature uspace
only.
pub fn set_page_table_root(&mut self, cr3: PhysAddr)
uspace
only.Changes the page table root (CR3
register for x86_64).
If not set, the kernel page table root is used (obtained by
axhal::paging::kernel_page_table_root
).