sel4/arch/arm/arch/aarch64/
user_context.rs

1//
2// Copyright 2023, Colias Group, LLC
3// Copyright (c) 2020 Arm Limited
4//
5// SPDX-License-Identifier: MIT
6//
7
8use crate::{Word, newtype_methods, sys};
9
10/// Corresponds to `seL4_UserContext`.
11#[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}