esp_wifi/preempt_builtin/
preempt_riscv.rs

1use esp_wifi_sys::c_types;
2
3use super::*;
4use crate::hal::interrupt::TrapFrame;
5
6#[derive(Debug, Clone, Copy)]
7pub struct Context {
8    trap_frame: TrapFrame,
9    pub thread_semaphore: u32,
10    pub next: *mut Context,
11    pub allocated_stack: *const u8,
12}
13
14impl Context {
15    pub(crate) fn new() -> Self {
16        Context {
17            trap_frame: TrapFrame::default(),
18            thread_semaphore: 0,
19            next: core::ptr::null_mut(),
20            allocated_stack: core::ptr::null(),
21        }
22    }
23}
24
25pub(crate) fn task_create(
26    task: extern "C" fn(*mut c_types::c_void),
27    param: *mut c_types::c_void,
28    task_stack_size: usize,
29) -> *mut Context {
30    unsafe {
31        let ctx = allocate_task();
32
33        (*ctx).trap_frame.pc = task as usize;
34        (*ctx).trap_frame.a0 = param as usize;
35
36        let stack = malloc(task_stack_size as u32);
37        (*ctx).allocated_stack = stack.cast();
38
39        // stack must be aligned by 16
40        let task_stack_ptr = stack as usize + task_stack_size;
41        let stack_ptr = task_stack_ptr - (task_stack_ptr % 0x10);
42        (*ctx).trap_frame.sp = stack_ptr;
43
44        ctx
45    }
46}
47
48pub(crate) fn restore_task_context(ctx: *mut Context, trap_frame: &mut TrapFrame) {
49    unsafe {
50        trap_frame.ra = (*ctx).trap_frame.ra;
51        trap_frame.sp = (*ctx).trap_frame.sp;
52        trap_frame.a0 = (*ctx).trap_frame.a0;
53        trap_frame.a1 = (*ctx).trap_frame.a1;
54        trap_frame.a2 = (*ctx).trap_frame.a2;
55        trap_frame.a3 = (*ctx).trap_frame.a3;
56        trap_frame.a4 = (*ctx).trap_frame.a4;
57        trap_frame.a5 = (*ctx).trap_frame.a5;
58        trap_frame.a6 = (*ctx).trap_frame.a6;
59        trap_frame.a7 = (*ctx).trap_frame.a7;
60        trap_frame.t0 = (*ctx).trap_frame.t0;
61        trap_frame.t1 = (*ctx).trap_frame.t1;
62        trap_frame.t2 = (*ctx).trap_frame.t2;
63        trap_frame.t3 = (*ctx).trap_frame.t3;
64        trap_frame.t4 = (*ctx).trap_frame.t4;
65        trap_frame.t5 = (*ctx).trap_frame.t5;
66        trap_frame.t6 = (*ctx).trap_frame.t6;
67        trap_frame.s0 = (*ctx).trap_frame.s0;
68        trap_frame.s1 = (*ctx).trap_frame.s1;
69        trap_frame.s2 = (*ctx).trap_frame.s2;
70        trap_frame.s3 = (*ctx).trap_frame.s3;
71        trap_frame.s4 = (*ctx).trap_frame.s4;
72        trap_frame.s5 = (*ctx).trap_frame.s5;
73        trap_frame.s6 = (*ctx).trap_frame.s6;
74        trap_frame.s7 = (*ctx).trap_frame.s7;
75        trap_frame.s8 = (*ctx).trap_frame.s8;
76        trap_frame.s9 = (*ctx).trap_frame.s9;
77        trap_frame.s10 = (*ctx).trap_frame.s10;
78        trap_frame.s11 = (*ctx).trap_frame.s11;
79        trap_frame.gp = (*ctx).trap_frame.gp;
80        trap_frame.tp = (*ctx).trap_frame.tp;
81        trap_frame.pc = (*ctx).trap_frame.pc;
82    }
83}
84
85pub(crate) fn save_task_context(ctx: *mut Context, trap_frame: &TrapFrame) {
86    unsafe {
87        (*ctx).trap_frame.ra = trap_frame.ra;
88        (*ctx).trap_frame.sp = trap_frame.sp;
89        (*ctx).trap_frame.a0 = trap_frame.a0;
90        (*ctx).trap_frame.a1 = trap_frame.a1;
91        (*ctx).trap_frame.a2 = trap_frame.a2;
92        (*ctx).trap_frame.a3 = trap_frame.a3;
93        (*ctx).trap_frame.a4 = trap_frame.a4;
94        (*ctx).trap_frame.a5 = trap_frame.a5;
95        (*ctx).trap_frame.a6 = trap_frame.a6;
96        (*ctx).trap_frame.a7 = trap_frame.a7;
97        (*ctx).trap_frame.t0 = trap_frame.t0;
98        (*ctx).trap_frame.t1 = trap_frame.t1;
99        (*ctx).trap_frame.t2 = trap_frame.t2;
100        (*ctx).trap_frame.t3 = trap_frame.t3;
101        (*ctx).trap_frame.t4 = trap_frame.t4;
102        (*ctx).trap_frame.t5 = trap_frame.t5;
103        (*ctx).trap_frame.t6 = trap_frame.t6;
104        (*ctx).trap_frame.s0 = trap_frame.s0;
105        (*ctx).trap_frame.s1 = trap_frame.s1;
106        (*ctx).trap_frame.s2 = trap_frame.s2;
107        (*ctx).trap_frame.s3 = trap_frame.s3;
108        (*ctx).trap_frame.s4 = trap_frame.s4;
109        (*ctx).trap_frame.s5 = trap_frame.s5;
110        (*ctx).trap_frame.s6 = trap_frame.s6;
111        (*ctx).trap_frame.s7 = trap_frame.s7;
112        (*ctx).trap_frame.s8 = trap_frame.s8;
113        (*ctx).trap_frame.s9 = trap_frame.s9;
114        (*ctx).trap_frame.s10 = trap_frame.s10;
115        (*ctx).trap_frame.s11 = trap_frame.s11;
116        (*ctx).trap_frame.gp = trap_frame.gp;
117        (*ctx).trap_frame.tp = trap_frame.tp;
118        (*ctx).trap_frame.pc = trap_frame.pc;
119    }
120}