sel4/arch/arm/arch/aarch64/
user_context.rs1use crate::{Word, newtype_methods, sys};
9
10#[derive(Debug, Clone, PartialEq, Eq, Default)]
12pub struct UserContext(sys::seL4_UserContext);
13
14impl UserContext {
15 newtype_methods!(pub sys::seL4_UserContext);
16
17 pub fn pc(&self) -> &Word {
18 &self.0.pc
19 }
20
21 pub fn pc_mut(&mut self) -> &mut Word {
22 &mut self.0.pc
23 }
24
25 pub fn sp(&self) -> &Word {
26 &self.0.sp
27 }
28
29 pub fn sp_mut(&mut self) -> &mut Word {
30 &mut self.0.sp
31 }
32
33 pub fn spsr(&self) -> &Word {
34 &self.0.spsr
35 }
36
37 pub fn spsr_mut(&mut self) -> &mut Word {
38 &mut self.0.spsr
39 }
40
41 pub fn gpr(&self, ix: usize) -> &Word {
42 match ix {
43 0 => &self.inner().x0,
44 1 => &self.inner().x1,
45 2 => &self.inner().x2,
46 3 => &self.inner().x3,
47 4 => &self.inner().x4,
48 5 => &self.inner().x5,
49 6 => &self.inner().x6,
50 7 => &self.inner().x7,
51 8 => &self.inner().x8,
52 9 => &self.inner().x9,
53 10 => &self.inner().x10,
54 11 => &self.inner().x11,
55 12 => &self.inner().x12,
56 13 => &self.inner().x13,
57 14 => &self.inner().x14,
58 15 => &self.inner().x15,
59 16 => &self.inner().x16,
60 17 => &self.inner().x17,
61 18 => &self.inner().x18,
62 19 => &self.inner().x19,
63 20 => &self.inner().x20,
64 21 => &self.inner().x21,
65 22 => &self.inner().x22,
66 23 => &self.inner().x23,
67 24 => &self.inner().x24,
68 25 => &self.inner().x25,
69 26 => &self.inner().x26,
70 27 => &self.inner().x27,
71 28 => &self.inner().x28,
72 29 => &self.inner().x29,
73 30 => &self.inner().x30,
74 _ => panic!(),
75 }
76 }
77
78 pub fn gpr_mut(&mut self, ix: usize) -> &mut Word {
79 match ix {
80 0 => &mut self.inner_mut().x0,
81 1 => &mut self.inner_mut().x1,
82 2 => &mut self.inner_mut().x2,
83 3 => &mut self.inner_mut().x3,
84 4 => &mut self.inner_mut().x4,
85 5 => &mut self.inner_mut().x5,
86 6 => &mut self.inner_mut().x6,
87 7 => &mut self.inner_mut().x7,
88 8 => &mut self.inner_mut().x8,
89 9 => &mut self.inner_mut().x9,
90 10 => &mut self.inner_mut().x10,
91 11 => &mut self.inner_mut().x11,
92 12 => &mut self.inner_mut().x12,
93 13 => &mut self.inner_mut().x13,
94 14 => &mut self.inner_mut().x14,
95 15 => &mut self.inner_mut().x15,
96 16 => &mut self.inner_mut().x16,
97 17 => &mut self.inner_mut().x17,
98 18 => &mut self.inner_mut().x18,
99 19 => &mut self.inner_mut().x19,
100 20 => &mut self.inner_mut().x20,
101 21 => &mut self.inner_mut().x21,
102 22 => &mut self.inner_mut().x22,
103 23 => &mut self.inner_mut().x23,
104 24 => &mut self.inner_mut().x24,
105 25 => &mut self.inner_mut().x25,
106 26 => &mut self.inner_mut().x26,
107 27 => &mut self.inner_mut().x27,
108 28 => &mut self.inner_mut().x28,
109 29 => &mut self.inner_mut().x29,
110 30 => &mut self.inner_mut().x30,
111 _ => panic!(),
112 }
113 }
114
115 pub fn c_param(&self, ix: usize) -> &Word {
116 assert!(ix < 8);
117 self.gpr(ix)
118 }
119
120 pub fn c_param_mut(&mut self, ix: usize) -> &mut Word {
121 assert!(ix < 8);
122 self.gpr_mut(ix)
123 }
124}