1#[percpu::def_percpu]
4static CPU_ID: usize = 0;
5
6#[percpu::def_percpu]
7static IS_BSP: bool = false;
8
9#[percpu::def_percpu]
10static CURRENT_TASK_PTR: usize = 0;
11
12#[inline]
14pub fn this_cpu_id() -> usize {
15    CPU_ID.read_current()
16}
17
18#[inline]
21pub fn this_cpu_is_bsp() -> bool {
22    IS_BSP.read_current()
23}
24
25#[cfg(target_arch = "aarch64")]
30unsafe fn cache_current_task_ptr<T>(ptr: *const T) {
31    use aarch64_cpu::registers::{SP_EL0, Writeable};
32    SP_EL0.set(ptr as u64);
33}
34
35#[inline]
40pub fn current_task_ptr<T>() -> *const T {
41    #[cfg(target_arch = "x86_64")]
42    unsafe {
43        CURRENT_TASK_PTR.read_current_raw() as _
45    }
46    #[cfg(any(
47        target_arch = "riscv32",
48        target_arch = "riscv64",
49        target_arch = "loongarch64"
50    ))]
51    unsafe {
52        let _guard = kernel_guard::IrqSave::new();
54        CURRENT_TASK_PTR.read_current_raw() as _
55    }
56    #[cfg(target_arch = "aarch64")]
57    {
58        use aarch64_cpu::registers::{Readable, SP_EL0};
60        let sp_el0 = SP_EL0.get();
61        if sp_el0 != 0 {
62            sp_el0 as _
64        } else {
65            unsafe {
68                let _guard = kernel_guard::IrqSave::new();
69                let ptr = CURRENT_TASK_PTR.read_current_raw() as _;
70                cache_current_task_ptr(ptr);
71                ptr
72            }
73        }
74    }
75}
76
77#[inline]
86pub unsafe fn set_current_task_ptr<T>(ptr: *const T) {
87    #[cfg(target_arch = "x86_64")]
88    {
89        unsafe { CURRENT_TASK_PTR.write_current_raw(ptr as usize) }
90    }
91    #[cfg(any(
92        target_arch = "riscv32",
93        target_arch = "riscv64",
94        target_arch = "loongarch64"
95    ))]
96    {
97        let _guard = kernel_guard::IrqSave::new();
98        unsafe { CURRENT_TASK_PTR.write_current_raw(ptr as usize) }
99    }
100    #[cfg(target_arch = "aarch64")]
101    {
102        let _guard = kernel_guard::IrqSave::new();
103        unsafe {
104            CURRENT_TASK_PTR.write_current_raw(ptr as usize);
105            cache_current_task_ptr(ptr);
106        }
107    }
108}
109
110#[allow(dead_code)]
111pub(crate) fn init_primary(cpu_id: usize) {
112    percpu::init();
113    percpu::init_percpu_reg(cpu_id);
114    unsafe {
115        CPU_ID.write_current_raw(cpu_id);
116        IS_BSP.write_current_raw(true);
117    }
118}
119
120#[allow(dead_code)]
121pub(crate) fn init_secondary(cpu_id: usize) {
122    percpu::init_percpu_reg(cpu_id);
123    unsafe {
124        CPU_ID.write_current_raw(cpu_id);
125        IS_BSP.write_current_raw(false);
126    }
127}