1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// Copyright 2023, Colias Group, LLC
// Copyright (c) 2020 Arm Limited
//
// SPDX-License-Identifier: MIT
//

use crate::{newtype_methods, sys, Word};

/// Corresponds to `seL4_UserContext`.
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct UserContext(sys::seL4_UserContext);

impl UserContext {
    newtype_methods!(pub sys::seL4_UserContext);

    pub fn pc(&self) -> &Word {
        &self.0.pc
    }

    pub fn pc_mut(&mut self) -> &mut Word {
        &mut self.0.pc
    }

    pub fn sp(&self) -> &Word {
        &self.0.sp
    }

    pub fn sp_mut(&mut self) -> &mut Word {
        &mut self.0.sp
    }

    pub fn spsr(&self) -> &Word {
        &self.0.spsr
    }

    pub fn spsr_mut(&mut self) -> &mut Word {
        &mut self.0.spsr
    }

    pub fn gpr(&self, ix: usize) -> &Word {
        match ix {
            0 => &self.inner().x0,
            1 => &self.inner().x1,
            2 => &self.inner().x2,
            3 => &self.inner().x3,
            4 => &self.inner().x4,
            5 => &self.inner().x5,
            6 => &self.inner().x6,
            7 => &self.inner().x7,
            8 => &self.inner().x8,
            9 => &self.inner().x9,
            10 => &self.inner().x10,
            11 => &self.inner().x11,
            12 => &self.inner().x12,
            13 => &self.inner().x13,
            14 => &self.inner().x14,
            15 => &self.inner().x15,
            16 => &self.inner().x16,
            17 => &self.inner().x17,
            18 => &self.inner().x18,
            19 => &self.inner().x19,
            20 => &self.inner().x20,
            21 => &self.inner().x21,
            22 => &self.inner().x22,
            23 => &self.inner().x23,
            24 => &self.inner().x24,
            25 => &self.inner().x25,
            26 => &self.inner().x26,
            27 => &self.inner().x27,
            28 => &self.inner().x28,
            29 => &self.inner().x29,
            30 => &self.inner().x30,
            _ => panic!(),
        }
    }

    pub fn gpr_mut(&mut self, ix: usize) -> &mut Word {
        match ix {
            0 => &mut self.inner_mut().x0,
            1 => &mut self.inner_mut().x1,
            2 => &mut self.inner_mut().x2,
            3 => &mut self.inner_mut().x3,
            4 => &mut self.inner_mut().x4,
            5 => &mut self.inner_mut().x5,
            6 => &mut self.inner_mut().x6,
            7 => &mut self.inner_mut().x7,
            8 => &mut self.inner_mut().x8,
            9 => &mut self.inner_mut().x9,
            10 => &mut self.inner_mut().x10,
            11 => &mut self.inner_mut().x11,
            12 => &mut self.inner_mut().x12,
            13 => &mut self.inner_mut().x13,
            14 => &mut self.inner_mut().x14,
            15 => &mut self.inner_mut().x15,
            16 => &mut self.inner_mut().x16,
            17 => &mut self.inner_mut().x17,
            18 => &mut self.inner_mut().x18,
            19 => &mut self.inner_mut().x19,
            20 => &mut self.inner_mut().x20,
            21 => &mut self.inner_mut().x21,
            22 => &mut self.inner_mut().x22,
            23 => &mut self.inner_mut().x23,
            24 => &mut self.inner_mut().x24,
            25 => &mut self.inner_mut().x25,
            26 => &mut self.inner_mut().x26,
            27 => &mut self.inner_mut().x27,
            28 => &mut self.inner_mut().x28,
            29 => &mut self.inner_mut().x29,
            30 => &mut self.inner_mut().x30,
            _ => panic!(),
        }
    }

    pub fn c_param(&self, ix: usize) -> &Word {
        assert!(ix < 8);
        self.gpr(ix)
    }

    pub fn c_param_mut(&mut self, ix: usize) -> &mut Word {
        assert!(ix < 8);
        self.gpr_mut(ix)
    }
}