sel4/arch/riscv/
user_context.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: MIT
5//
6
7use crate::{newtype_methods, sys, Word};
8
9/// Corresponds to `seL4_UserContext`.
10#[derive(Debug, Clone, PartialEq, Eq, Default)]
11pub struct UserContext(sys::seL4_UserContext);
12
13impl UserContext {
14    newtype_methods!(pub sys::seL4_UserContext);
15
16    pub fn pc(&self) -> &Word {
17        &self.0.pc
18    }
19
20    pub fn pc_mut(&mut self) -> &mut Word {
21        &mut self.0.pc
22    }
23
24    pub fn sp(&self) -> &Word {
25        &self.0.sp
26    }
27
28    pub fn sp_mut(&mut self) -> &mut Word {
29        &mut self.0.sp
30    }
31
32    pub fn gpr_a(&self, ix: usize) -> &Word {
33        match ix {
34            0 => &self.inner().a0,
35            1 => &self.inner().a1,
36            2 => &self.inner().a2,
37            3 => &self.inner().a3,
38            4 => &self.inner().a4,
39            5 => &self.inner().a5,
40            6 => &self.inner().a6,
41            7 => &self.inner().a7,
42            _ => panic!(),
43        }
44    }
45
46    pub fn gpr_a_mut(&mut self, ix: usize) -> &mut Word {
47        match ix {
48            0 => &mut self.inner_mut().a0,
49            1 => &mut self.inner_mut().a1,
50            2 => &mut self.inner_mut().a2,
51            3 => &mut self.inner_mut().a3,
52            4 => &mut self.inner_mut().a4,
53            5 => &mut self.inner_mut().a5,
54            6 => &mut self.inner_mut().a6,
55            7 => &mut self.inner_mut().a7,
56            _ => panic!(),
57        }
58    }
59
60    pub fn c_param(&self, ix: usize) -> &Word {
61        self.gpr_a(ix)
62    }
63
64    pub fn c_param_mut(&mut self, ix: usize) -> &mut Word {
65        self.gpr_a_mut(ix)
66    }
67}