sel4_sys/syscalls/helpers/arch/
aarch64.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(
16 sys: c_int,
17 dest: seL4_Word,
18 info_arg: seL4_MessageInfo,
19 mr0: seL4_Word,
20 mr1: seL4_Word,
21 mr2: seL4_Word,
22 mr3: seL4_Word,
23) {
24 unsafe {
25 asm!("svc 0",
26 in("x7") sys_id_to_word(sys),
27 in("x0") dest,
28 in("x1") info_arg.into_word(),
29 in("x2") mr0,
30 in("x3") mr1,
31 in("x4") mr2,
32 in("x5") mr3,
33 );
34 }
35}
36
37#[sel4_cfg(not(KERNEL_MCS))]
38pub fn sys_reply(
39 sys: c_int,
40 info_arg: seL4_MessageInfo,
41 mr0: seL4_Word,
42 mr1: seL4_Word,
43 mr2: seL4_Word,
44 mr3: seL4_Word,
45) {
46 unsafe {
47 asm!("svc 0",
48 in("x7") sys_id_to_word(sys),
49 in("x1") info_arg.into_word(),
50 in("x2") mr0,
51 in("x3") mr1,
52 in("x4") mr2,
53 in("x5") mr3,
54 );
55 }
56}
57
58pub fn sys_send_null(sys: c_int, src: seL4_Word, info_arg: seL4_MessageInfo) {
59 unsafe {
60 asm!("svc 0",
61 in("x7") sys_id_to_word(sys),
62 in("x0") src,
63 in("x1") info_arg.into_word(),
64 );
65 }
66}
67
68pub fn sys_recv(
69 sys: c_int,
70 src: seL4_Word,
71 out_mr0: &mut seL4_Word,
72 out_mr1: &mut seL4_Word,
73 out_mr2: &mut seL4_Word,
74 out_mr3: &mut seL4_Word,
75 reply: seL4_Word,
76) -> (seL4_MessageInfo, seL4_Word) {
77 let out_info: seL4_Word;
78 let out_badge: seL4_Word;
79 unsafe {
80 asm!("svc 0",
81 in("x7") sys_id_to_word(sys),
82 inout("x0") src => out_badge,
83 out("x1") out_info,
84 out("x2") *out_mr0,
85 out("x3") *out_mr1,
86 out("x4") *out_mr2,
87 out("x5") *out_mr3,
88 in("x6") reply,
89 );
90 }
91 (seL4_MessageInfo::from_word(out_info), out_badge)
92}
93
94pub fn sys_send_recv(
95 sys: c_int,
96 dest: seL4_Word,
97 info_arg: seL4_MessageInfo,
98 in_out_mr0: &mut seL4_Word,
99 in_out_mr1: &mut seL4_Word,
100 in_out_mr2: &mut seL4_Word,
101 in_out_mr3: &mut seL4_Word,
102 reply: seL4_Word,
103) -> (seL4_MessageInfo, seL4_Word) {
104 let out_info: seL4_Word;
105 let out_badge: seL4_Word;
106 unsafe {
107 asm!("svc 0",
108 in("x7") sys_id_to_word(sys),
109 inout("x0") dest => out_badge,
110 inout("x1") info_arg.into_word() => out_info,
111 inout("x2") *in_out_mr0,
112 inout("x3") *in_out_mr1,
113 inout("x4") *in_out_mr2,
114 inout("x5") *in_out_mr3,
115 in("x6") reply,
116 );
117 }
118 (seL4_MessageInfo::from_word(out_info), out_badge)
119}
120
121#[sel4_cfg(KERNEL_MCS)]
122pub fn sys_nb_send_recv(
123 sys: c_int,
124 dest: seL4_Word,
125 src: seL4_Word,
126 info_arg: seL4_MessageInfo,
127 in_out_mr0: &mut seL4_Word,
128 in_out_mr1: &mut seL4_Word,
129 in_out_mr2: &mut seL4_Word,
130 in_out_mr3: &mut seL4_Word,
131 reply: seL4_Word,
132) -> (seL4_MessageInfo, seL4_Word) {
133 let out_info: seL4_Word;
134 let out_badge: seL4_Word;
135 unsafe {
136 asm!("svc 0",
137 in("x7") sys_id_to_word(sys),
138 inout("x0") src => out_badge,
139 inout("x1") info_arg.into_word() => out_info,
140 inout("x2") *in_out_mr0,
141 inout("x3") *in_out_mr1,
142 inout("x4") *in_out_mr2,
143 inout("x5") *in_out_mr3,
144 in("x6") reply,
145 in("x8") dest,
146 );
147 }
148 (seL4_MessageInfo::from_word(out_info), out_badge)
149}
150
151pub fn sys_null(sys: c_int) {
152 unsafe {
153 asm!("svc 0",
154 in("x7") sys_id_to_word(sys),
155 );
156 }
157}