sel4_sys/syscalls/helpers/arch/
aarch64.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
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}