sel4_sys/syscalls/helpers/arch/
aarch32.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7use core::arch::asm;
8use core::ffi::c_int;
9
10use sel4_config::sel4_cfg;
11
12use super::sys_id_to_word;
13use crate::{seL4_MessageInfo, seL4_Word};
14
15// NOTE
16// asm!() does not allow r6 to be used for input or output operands, because it's sometimes used by LLVM.
17
18pub fn sys_send(
19    sys: c_int,
20    dest: seL4_Word,
21    info_arg: seL4_MessageInfo,
22    mr0: seL4_Word,
23    mr1: seL4_Word,
24    mr2: seL4_Word,
25    mr3: seL4_Word,
26) {
27    unsafe {
28        asm!("swi 0",
29            in("r7") sys_id_to_word(sys),
30            in("r0") dest,
31            in("r1") info_arg.into_word(),
32            in("r2") mr0,
33            in("r3") mr1,
34            in("r4") mr2,
35            in("r5") mr3,
36        );
37    }
38}
39
40#[sel4_cfg(not(KERNEL_MCS))]
41pub fn sys_reply(
42    sys: c_int,
43    info_arg: seL4_MessageInfo,
44    mr0: seL4_Word,
45    mr1: seL4_Word,
46    mr2: seL4_Word,
47    mr3: seL4_Word,
48) {
49    unsafe {
50        asm!("swi 0",
51            in("r7") sys_id_to_word(sys),
52            in("r1") info_arg.into_word(),
53            in("r2") mr0,
54            in("r3") mr1,
55            in("r4") mr2,
56            in("r5") mr3,
57        );
58    }
59}
60
61pub fn sys_send_null(sys: c_int, src: seL4_Word, info_arg: seL4_MessageInfo) {
62    unsafe {
63        asm!("swi 0",
64            in("r7") sys_id_to_word(sys),
65            in("r0") src,
66            in("r1") info_arg.into_word(),
67        );
68    }
69}
70
71pub fn sys_recv(
72    sys: c_int,
73    src: seL4_Word,
74    out_mr0: &mut seL4_Word,
75    out_mr1: &mut seL4_Word,
76    out_mr2: &mut seL4_Word,
77    out_mr3: &mut seL4_Word,
78    reply: seL4_Word,
79) -> (seL4_MessageInfo, seL4_Word) {
80    let out_info: seL4_Word;
81    let out_badge: seL4_Word;
82    unsafe {
83        asm!(
84            "mov r10, r6",
85            "mov r6, r9",
86            "swi 0",
87            "mov r6, r10",
88            in("r7") sys_id_to_word(sys),
89            inout("r0") src => out_badge,
90            out("r1") out_info,
91            out("r2") *out_mr0,
92            out("r3") *out_mr1,
93            out("r4") *out_mr2,
94            out("r5") *out_mr3,
95            in("r9") reply,
96            inout("r10") 0 => _,
97        );
98    }
99    (seL4_MessageInfo::from_word(out_info), out_badge)
100}
101
102pub fn sys_send_recv(
103    sys: c_int,
104    dest: seL4_Word,
105    info_arg: seL4_MessageInfo,
106    in_out_mr0: &mut seL4_Word,
107    in_out_mr1: &mut seL4_Word,
108    in_out_mr2: &mut seL4_Word,
109    in_out_mr3: &mut seL4_Word,
110    reply: seL4_Word,
111) -> (seL4_MessageInfo, seL4_Word) {
112    let out_info: seL4_Word;
113    let out_badge: seL4_Word;
114    unsafe {
115        asm!(
116            "mov r10, r6",
117            "mov r6, r9",
118            "swi 0",
119            "mov r6, r10",
120            in("r7") sys_id_to_word(sys),
121            inout("r0") dest => out_badge,
122            inout("r1") info_arg.into_word() => out_info,
123            inout("r2") *in_out_mr0,
124            inout("r3") *in_out_mr1,
125            inout("r4") *in_out_mr2,
126            inout("r5") *in_out_mr3,
127            in("r9") reply,
128            inout("r10") 0 => _,
129        );
130    }
131    (seL4_MessageInfo::from_word(out_info), out_badge)
132}
133
134#[sel4_cfg(KERNEL_MCS)]
135pub fn sys_nb_send_recv(
136    sys: c_int,
137    dest: seL4_Word,
138    src: seL4_Word,
139    info_arg: seL4_MessageInfo,
140    in_out_mr0: &mut seL4_Word,
141    in_out_mr1: &mut seL4_Word,
142    in_out_mr2: &mut seL4_Word,
143    in_out_mr3: &mut seL4_Word,
144    reply: seL4_Word,
145) -> (seL4_MessageInfo, seL4_Word) {
146    let out_info: seL4_Word;
147    let out_badge: seL4_Word;
148    unsafe {
149        asm!(
150            "mov r10, r6",
151            "mov r6, r9",
152            "swi 0",
153            "mov r6, r10",
154            in("r7") sys_id_to_word(sys),
155            inout("r0") src => out_badge,
156            inout("r1") info_arg.into_word() => out_info,
157            inout("r2") *in_out_mr0,
158            inout("r3") *in_out_mr1,
159            inout("r4") *in_out_mr2,
160            inout("r5") *in_out_mr3,
161            in("r9") reply,
162            in("r8") dest,
163            inout("r10") 0 => _,
164        );
165    }
166    (seL4_MessageInfo::from_word(out_info), out_badge)
167}
168
169pub fn sys_null(sys: c_int) {
170    unsafe {
171        asm!("swi 0",
172            in("r7") sys_id_to_word(sys),
173        );
174    }
175}