sentry_uapi/
ffi_c.rs

1// SPDX-FileCopyrightText: 2023 Ledger SAS
2// SPDX-FileCopyrightText: 2025 ANSSI & H2Lab OSS Team
3// SPDX-License-Identifier: Apache-2.0
4
5use crate::exchange;
6use crate::systypes::*;
7
8/// C interface to [`crate::syscall::get_process_handle`] syscall Rust implementation
9#[unsafe(no_mangle)]
10pub extern "C" fn __sys_get_process_handle(process: TaskLabel) -> Status {
11    crate::syscall::get_process_handle(process)
12}
13
14/// C interface to [`crate::syscall::exit`] syscall Rust implementation
15#[unsafe(no_mangle)]
16pub extern "C" fn __sys_exit(status: i32) -> Status {
17    crate::syscall::exit(status)
18}
19
20/// C interface to [`crate::syscall::get_shm_handle`] syscall Rust implementation
21#[unsafe(no_mangle)]
22pub extern "C" fn __sys_get_shm_handle(shm: ShmLabel) -> Status {
23    crate::syscall::get_shm_handle(shm)
24}
25
26/// C interface to [`crate::syscall::get_dma_stream_handle`] syscall Rust implementation
27#[unsafe(no_mangle)]
28pub extern "C" fn __sys_get_dma_stream_handle(stream: StreamLabel) -> Status {
29    crate::syscall::get_dma_stream_handle(stream)
30}
31
32/// C interface to [`crate::syscall::sched_yield`] syscall Rust implementation
33#[unsafe(no_mangle)]
34pub extern "C" fn __sys_sched_yield() -> Status {
35    crate::syscall::sched_yield()
36}
37
38/// C interface to [`crate::syscall::sleep`] syscall Rust implementation
39#[unsafe(no_mangle)]
40pub extern "C" fn __sys_sleep(duration_ms: SleepDuration, mode: SleepMode) -> Status {
41    crate::syscall::sleep(duration_ms, mode)
42}
43
44/// C interface to [`crate::syscall::start`] syscall Rust implementation
45#[unsafe(no_mangle)]
46pub extern "C" fn __sys_start(process: TaskLabel) -> Status {
47    crate::syscall::start(process)
48}
49
50/// C interface to [`crate::syscall::map_dev`] syscall Rust implementation
51#[unsafe(no_mangle)]
52pub extern "C" fn __sys_map_dev(dev: DeviceHandle) -> Status {
53    crate::syscall::map_dev(dev as DeviceHandle)
54}
55
56/// C interface to [`crate::syscall::map_shm`] syscall Rust implementation
57#[unsafe(no_mangle)]
58pub extern "C" fn __sys_map_shm(shm: ShmHandle) -> Status {
59    crate::syscall::map_shm(shm as ShmHandle)
60}
61
62/// C interface to [`crate::syscall::unmap_dev`] syscall Rust implementation
63#[unsafe(no_mangle)]
64pub extern "C" fn __sys_unmap_dev(dev: DeviceHandle) -> Status {
65    crate::syscall::unmap_dev(dev as DeviceHandle)
66}
67
68/// C interface to [`crate::syscall::unmap_shm`] syscall Rust implementation
69#[unsafe(no_mangle)]
70pub extern "C" fn __sys_unmap_shm(shm: ShmHandle) -> Status {
71    crate::syscall::unmap_shm(shm as ShmHandle)
72}
73
74/// C interface to [`crate::syscall::shm_set_credential`] syscall Rust implementation
75#[unsafe(no_mangle)]
76pub extern "C" fn __sys_shm_set_credential(
77    shm: ShmHandle,
78    id: TaskHandle,
79    shm_perm: u32,
80) -> Status {
81    crate::syscall::shm_set_credential(shm, id, shm_perm)
82}
83
84/// C interface to [`crate::syscall::send_ipc`] syscall Rust implementation
85#[unsafe(no_mangle)]
86pub extern "C" fn __sys_send_ipc(target: TaskHandle, length: u8) -> Status {
87    crate::syscall::send_ipc(target, length)
88}
89
90/// C interface to [`crate::syscall::send_signal`] syscall Rust implementation
91#[unsafe(no_mangle)]
92pub extern "C" fn __sys_send_signal(resource: u32, signal_type: Signal) -> Status {
93    crate::syscall::send_signal(resource, signal_type)
94}
95
96/// C interface to [`crate::syscall::gpio_get`] syscall Rust implementation
97#[unsafe(no_mangle)]
98pub extern "C" fn __sys_gpio_get(resource: u32, io: u8) -> Status {
99    crate::syscall::gpio_get(resource, io)
100}
101
102/// C interface to [`crate::syscall::gpio_set`] syscall Rust implementation
103#[unsafe(no_mangle)]
104pub extern "C" fn __sys_gpio_set(resource: u32, io: u8, val: bool) -> Status {
105    crate::syscall::gpio_set(resource, io, val)
106}
107
108/// C interface to [`crate::syscall::gpio_reset`] syscall Rust implementation
109#[unsafe(no_mangle)]
110pub extern "C" fn __sys_gpio_reset(resource: u32, io: u8) -> Status {
111    crate::syscall::gpio_reset(resource, io)
112}
113
114/// C interface to [`crate::syscall::gpio_toggle`] syscall Rust implementation
115#[unsafe(no_mangle)]
116pub extern "C" fn __sys_gpio_toggle(resource: u32, io: u8) -> Status {
117    crate::syscall::gpio_toggle(resource, io)
118}
119
120/// C interface to [`crate::syscall::gpio_configure`] syscall Rust implementation
121#[unsafe(no_mangle)]
122pub extern "C" fn __sys_gpio_configure(resource: u32, io: u8) -> Status {
123    crate::syscall::gpio_configure(resource, io)
124}
125
126/// C interface to [`crate::syscall::get_device_handle`] syscall Rust implementation
127#[unsafe(no_mangle)]
128pub extern "C" fn __sys_get_device_handle(devlabel: u8) -> Status {
129    crate::syscall::get_device_handle(devlabel)
130}
131
132/// C interface to [`crate::syscall::irq_acknowledge`] syscall Rust implementation
133#[unsafe(no_mangle)]
134pub extern "C" fn __sys_irq_acknowledge(irq: u16) -> Status {
135    crate::syscall::irq_acknowledge(irq)
136}
137
138/// C interface to [`crate::syscall::irq_enable`] syscall Rust implementation
139#[unsafe(no_mangle)]
140pub extern "C" fn __sys_irq_enable(irq: u16) -> Status {
141    crate::syscall::irq_enable(irq)
142}
143
144/// C interface to [`crate::syscall::irq_disable`] syscall Rust implementation
145#[unsafe(no_mangle)]
146pub extern "C" fn __sys_irq_disable(irq: u16) -> Status {
147    crate::syscall::irq_disable(irq)
148}
149
150/// C interface to [`crate::syscall::wait_for_event`] syscall Rust implementation
151#[unsafe(no_mangle)]
152pub extern "C" fn __sys_wait_for_event(mask: u8, timeout: i32) -> Status {
153    crate::syscall::wait_for_event(mask, timeout)
154}
155
156/// C interface to [`crate::syscall::pm_manage`] syscall Rust implementation
157#[unsafe(no_mangle)]
158pub extern "C" fn __sys_pm_manage(mode: CPUSleep) -> Status {
159    crate::syscall::pm_manage(mode)
160}
161
162/// C interface to [`crate::syscall::alarm`] syscall Rust implementation
163#[unsafe(no_mangle)]
164pub extern "C" fn __sys_alarm(timeout_ms: u32, flag: AlarmFlag) -> Status {
165    crate::syscall::alarm(timeout_ms, flag)
166}
167
168/// C interface to [`crate::syscall::log`] syscall Rust implementation
169#[unsafe(no_mangle)]
170pub extern "C" fn __sys_log(length: usize) -> Status {
171    crate::syscall::log(length)
172}
173
174/// C interface to [`crate::syscall::get_random`] syscall Rust implementation
175#[unsafe(no_mangle)]
176pub extern "C" fn __sys_get_random() -> Status {
177    crate::syscall::get_random()
178}
179
180/// C interface to [`crate::syscall::get_cycle`] syscall Rust implementation
181#[unsafe(no_mangle)]
182pub extern "C" fn __sys_get_cycle(precision: Precision) -> Status {
183    crate::syscall::get_cycle(precision)
184}
185
186/// C interface to [`crate::syscall::pm_set_clock`] syscall Rust implementation
187#[unsafe(no_mangle)]
188pub extern "C" fn __sys_pm_set_clock(clk_reg: u32, clkmsk: u32, val: u32) -> Status {
189    crate::syscall::pm_set_clock(clk_reg, clkmsk, val)
190}
191
192/// C interface to [`crate::syscall::dma_start_stream`] syscall Rust implementation
193#[unsafe(no_mangle)]
194pub extern "C" fn __sys_dma_start_stream(dmah: StreamHandle) -> Status {
195    crate::syscall::dma_start_stream(dmah)
196}
197
198/// C interface to [`crate::syscall::dma_suspend_stream`] syscall Rust implementation
199#[unsafe(no_mangle)]
200pub extern "C" fn __sys_dma_suspend_stream(dmah: StreamHandle) -> Status {
201    crate::syscall::dma_suspend_stream(dmah)
202}
203
204/// C interface to [`crate::syscall::dma_get_stream_status`] syscall Rust implementation
205#[unsafe(no_mangle)]
206pub extern "C" fn __sys_dma_get_stream_status(dmah: StreamHandle) -> Status {
207    crate::syscall::dma_get_stream_status(dmah)
208}
209
210/// C interface to [`crate::syscall::shm_get_infos`] syscall Rust implementation
211#[unsafe(no_mangle)]
212pub extern "C" fn __sys_shm_get_infos(shm: ShmHandle) -> Status {
213    crate::syscall::shm_get_infos(shm)
214}
215
216/// C interface to [`crate::syscall::dma_assign_stream`] syscall Rust implementation
217#[unsafe(no_mangle)]
218pub extern "C" fn __sys_dma_assign_stream(dmah: StreamHandle) -> Status {
219    crate::syscall::dma_assign_stream(dmah)
220}
221
222/// C interface to [`crate::syscall::dma_unassign_stream`] syscall Rust implementation
223#[unsafe(no_mangle)]
224pub extern "C" fn __sys_dma_unassign_stream(dmah: StreamHandle) -> Status {
225    crate::syscall::dma_unassign_stream(dmah)
226}
227
228/// C interface to [`crate::syscall::dma_get_stream_info`] syscall Rust implementation
229#[unsafe(no_mangle)]
230pub extern "C" fn __sys_dma_get_stream_info(dmah: StreamHandle) -> Status {
231    crate::syscall::dma_get_stream_info(dmah)
232}
233
234/// C interface to [`crate::syscall::dma_resume_stream`] syscall Rust implementation
235#[unsafe(no_mangle)]
236pub extern "C" fn __sys_dma_resume_stream(dmah: StreamHandle) -> Status {
237    crate::syscall::dma_resume_stream(dmah)
238}
239
240/// C interface to [`crate::syscall::autotest_set_capa`] syscall Rust implementation
241#[cfg(CONFIG_BUILD_TARGET_AUTOTEST)]
242#[unsafe(no_mangle)]
243pub extern "C" fn __sys_autotest_set_capa(capa: u32) -> Status {
244    crate::syscall::autotest_set_capa(capa)
245}
246
247/// C interface to [`crate::syscall::autotest_clear_capa`] syscall Rust implementation
248#[cfg(CONFIG_BUILD_TARGET_AUTOTEST)]
249#[unsafe(no_mangle)]
250pub extern "C" fn __sys_autotest_clear_capa(capa: u32) -> Status {
251    crate::syscall::autotest_clear_capa(capa)
252}
253
254/// # Safety
255/// Conditions for code::slice::from_raw_parts are not violated
256/// C interface to [`crate::copy_to_kernel`] Rust implementation
257#[unsafe(no_mangle)]
258pub unsafe extern "C" fn copy_to_kernel(from: *mut u8, length: usize) -> Status {
259    let u8_slice: &[u8] = unsafe { core::slice::from_raw_parts(from, length) };
260    match exchange::copy_to_kernel(&u8_slice) {
261        Ok(_) => Status::Ok,
262        Err(err) => err,
263    }
264}
265
266/// # Safety
267/// Conditions for code::slice::from_raw_parts are not violated
268/// C interface to [`crate::copy_from_kernel`] Rust implementation
269#[unsafe(no_mangle)]
270pub unsafe extern "C" fn copy_from_kernel(to: *mut u8, length: usize) -> Status {
271    let mut u8_slice: &mut [u8] =
272        unsafe { core::slice::from_raw_parts_mut(to, length) as &mut [u8] };
273    match exchange::copy_from_kernel(&mut u8_slice) {
274        Ok(_) => Status::Ok,
275        Err(err) => err,
276    }
277}