sel4_sys/syscalls/helpers/arch/
aarch32.rs
1use 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
15pub 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}