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 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}