1use core::ptr::NonNull;
2
3use cpu_local::ExecutionContextHeader;
4
5use crate::KernelTlsBase;
6
7#[repr(C)]
14#[derive(Debug, Default)]
15pub struct TaskLocalState {
16 pub(crate) context_header: usize,
17 pub(crate) kernel_tls: KernelTlsBase,
18}
19
20impl TaskLocalState {
21 pub const fn new() -> Self {
23 Self {
24 context_header: 0,
25 kernel_tls: KernelTlsBase::new(0),
26 }
27 }
28
29 pub(crate) fn set_kernel_tls(&mut self, kernel_tls: KernelTlsBase) {
31 self.kernel_tls = KernelTlsBase::for_task_context(kernel_tls);
32 }
33
34 pub fn set_context_header(&mut self, header: NonNull<ExecutionContextHeader>) {
36 self.context_header = header.as_ptr() as usize;
37 }
38
39 pub const fn context_header(&self) -> Option<NonNull<ExecutionContextHeader>> {
41 NonNull::new(self.context_header as *mut ExecutionContextHeader)
42 }
43}
44
45const _: () = {
46 assert!(core::mem::size_of::<TaskLocalState>() == 2 * core::mem::size_of::<usize>());
47 assert!(core::mem::align_of::<TaskLocalState>() == core::mem::align_of::<usize>());
48};