esp_wifi/preempt_builtin/
preempt_riscv.rs

1use esp_wifi_sys::c_types;
2
3use super::*;
4pub use crate::hal::interrupt::TrapFrame;
5
6pub(crate) fn new_task_context(
7    task: extern "C" fn(*mut c_types::c_void),
8    param: *mut c_types::c_void,
9    stack_top: *mut (),
10) -> TrapFrame {
11    let stack_top = stack_top as usize;
12    let stack_top = stack_top - (stack_top % 16);
13
14    TrapFrame {
15        pc: task as usize,
16        a0: param as usize,
17        sp: stack_top,
18        ..Default::default()
19    }
20}
21
22pub(crate) fn restore_task_context(ctx: &mut Context, trap_frame: &mut TrapFrame) {
23    trap_frame.ra = ctx.trap_frame.ra;
24    trap_frame.sp = ctx.trap_frame.sp;
25    trap_frame.a0 = ctx.trap_frame.a0;
26    trap_frame.a1 = ctx.trap_frame.a1;
27    trap_frame.a2 = ctx.trap_frame.a2;
28    trap_frame.a3 = ctx.trap_frame.a3;
29    trap_frame.a4 = ctx.trap_frame.a4;
30    trap_frame.a5 = ctx.trap_frame.a5;
31    trap_frame.a6 = ctx.trap_frame.a6;
32    trap_frame.a7 = ctx.trap_frame.a7;
33    trap_frame.t0 = ctx.trap_frame.t0;
34    trap_frame.t1 = ctx.trap_frame.t1;
35    trap_frame.t2 = ctx.trap_frame.t2;
36    trap_frame.t3 = ctx.trap_frame.t3;
37    trap_frame.t4 = ctx.trap_frame.t4;
38    trap_frame.t5 = ctx.trap_frame.t5;
39    trap_frame.t6 = ctx.trap_frame.t6;
40    trap_frame.s0 = ctx.trap_frame.s0;
41    trap_frame.s1 = ctx.trap_frame.s1;
42    trap_frame.s2 = ctx.trap_frame.s2;
43    trap_frame.s3 = ctx.trap_frame.s3;
44    trap_frame.s4 = ctx.trap_frame.s4;
45    trap_frame.s5 = ctx.trap_frame.s5;
46    trap_frame.s6 = ctx.trap_frame.s6;
47    trap_frame.s7 = ctx.trap_frame.s7;
48    trap_frame.s8 = ctx.trap_frame.s8;
49    trap_frame.s9 = ctx.trap_frame.s9;
50    trap_frame.s10 = ctx.trap_frame.s10;
51    trap_frame.s11 = ctx.trap_frame.s11;
52    trap_frame.gp = ctx.trap_frame.gp;
53    trap_frame.tp = ctx.trap_frame.tp;
54    trap_frame.pc = ctx.trap_frame.pc;
55}
56
57pub(crate) fn save_task_context(ctx: &mut Context, trap_frame: &TrapFrame) {
58    ctx.trap_frame.ra = trap_frame.ra;
59    ctx.trap_frame.sp = trap_frame.sp;
60    ctx.trap_frame.a0 = trap_frame.a0;
61    ctx.trap_frame.a1 = trap_frame.a1;
62    ctx.trap_frame.a2 = trap_frame.a2;
63    ctx.trap_frame.a3 = trap_frame.a3;
64    ctx.trap_frame.a4 = trap_frame.a4;
65    ctx.trap_frame.a5 = trap_frame.a5;
66    ctx.trap_frame.a6 = trap_frame.a6;
67    ctx.trap_frame.a7 = trap_frame.a7;
68    ctx.trap_frame.t0 = trap_frame.t0;
69    ctx.trap_frame.t1 = trap_frame.t1;
70    ctx.trap_frame.t2 = trap_frame.t2;
71    ctx.trap_frame.t3 = trap_frame.t3;
72    ctx.trap_frame.t4 = trap_frame.t4;
73    ctx.trap_frame.t5 = trap_frame.t5;
74    ctx.trap_frame.t6 = trap_frame.t6;
75    ctx.trap_frame.s0 = trap_frame.s0;
76    ctx.trap_frame.s1 = trap_frame.s1;
77    ctx.trap_frame.s2 = trap_frame.s2;
78    ctx.trap_frame.s3 = trap_frame.s3;
79    ctx.trap_frame.s4 = trap_frame.s4;
80    ctx.trap_frame.s5 = trap_frame.s5;
81    ctx.trap_frame.s6 = trap_frame.s6;
82    ctx.trap_frame.s7 = trap_frame.s7;
83    ctx.trap_frame.s8 = trap_frame.s8;
84    ctx.trap_frame.s9 = trap_frame.s9;
85    ctx.trap_frame.s10 = trap_frame.s10;
86    ctx.trap_frame.s11 = trap_frame.s11;
87    ctx.trap_frame.gp = trap_frame.gp;
88    ctx.trap_frame.tp = trap_frame.tp;
89    ctx.trap_frame.pc = trap_frame.pc;
90}