Skip to main content

syscalls_rs/
test.rs

1// Copyright 2026 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#![no_std]
6
7use object::HandleValue;
8use syscalls_macro::syscall;
9use user_copy::{UserInOutPtr, UserInPtr, UserOutPtr};
10use zx_status::Status;
11
12#[syscall]
13pub fn sys_syscall_test_rust_0() -> Status {
14    Status::OK
15}
16
17#[syscall]
18pub fn sys_syscall_test_rust_1(a: i32) -> Status {
19    Status::from_raw(a)
20}
21
22#[syscall]
23pub fn sys_syscall_test_rust_2(a: i32, b: i32) -> Status {
24    Status::from_raw(a.wrapping_add(b))
25}
26
27#[syscall]
28pub fn sys_syscall_test_rust_3(a: i32, b: i32, c: i32) -> Status {
29    Status::from_raw(a.wrapping_add(b).wrapping_add(c))
30}
31
32#[syscall]
33pub fn sys_syscall_test_rust_4(a: i32, b: i32, c: i32, d: i32) -> Status {
34    Status::from_raw(a.wrapping_add(b).wrapping_add(c).wrapping_add(d))
35}
36
37#[syscall]
38pub fn sys_syscall_test_rust_5(a: i32, b: i32, c: i32, d: i32, e: i32) -> Status {
39    Status::from_raw(a.wrapping_add(b).wrapping_add(c).wrapping_add(d).wrapping_add(e))
40}
41
42#[syscall]
43pub fn sys_syscall_test_rust_6(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32) -> Status {
44    Status::from_raw(
45        a.wrapping_add(b).wrapping_add(c).wrapping_add(d).wrapping_add(e).wrapping_add(f),
46    )
47}
48
49#[syscall]
50pub fn sys_syscall_test_rust_7(a: i32, b: i32, c: i32, d: i32, e: i32, f: i32, g: i32) -> Status {
51    Status::from_raw(
52        a.wrapping_add(b)
53            .wrapping_add(c)
54            .wrapping_add(d)
55            .wrapping_add(e)
56            .wrapping_add(f)
57            .wrapping_add(g),
58    )
59}
60
61#[syscall]
62pub fn sys_syscall_test_rust_8(
63    a: i32,
64    b: i32,
65    c: i32,
66    d: i32,
67    e: i32,
68    f: i32,
69    g: i32,
70    h: i32,
71) -> Status {
72    Status::from_raw(
73        a.wrapping_add(b)
74            .wrapping_add(c)
75            .wrapping_add(d)
76            .wrapping_add(e)
77            .wrapping_add(f)
78            .wrapping_add(g)
79            .wrapping_add(h),
80    )
81}
82
83#[syscall]
84pub fn sys_syscall_test_rust_wrapper(a: i32, b: i32, c: i32) -> Status {
85    if a < 0 || b < 0 || c < 0 {
86        return Status::INVALID_ARGS;
87    }
88    let ret = a.wrapping_add(b).wrapping_add(c);
89    if ret > 50 { Status::OUT_OF_RANGE } else { Status::from_raw(ret) }
90}
91
92#[syscall]
93pub fn sys_syscall_test_rust_inptr(ptr: UserInPtr<i32>, value: UserOutPtr<i32>) -> Status {
94    if ptr.is_null() || value.is_null() {
95        return Status::INVALID_ARGS;
96    }
97    match ptr.read() {
98        Ok(val) => match value.write(val) {
99            Ok(()) => Status::OK,
100            Err(err) => err,
101        },
102        Err(err) => err,
103    }
104}
105
106#[syscall]
107pub fn sys_syscall_test_rust_outptr(value: i32, ptr: UserOutPtr<i32>) -> Status {
108    if ptr.is_null() {
109        return Status::INVALID_ARGS;
110    }
111    match ptr.write(value) {
112        Ok(()) => Status::OK,
113        Err(err) => err,
114    }
115}
116
117#[syscall]
118pub fn sys_syscall_test_rust_inoutptr(ptr: UserInOutPtr<i32>) -> Status {
119    if ptr.is_null() {
120        return Status::INVALID_ARGS;
121    }
122    match ptr.read() {
123        Ok(val) => match ptr.write(val.wrapping_add(val)) {
124            Ok(()) => Status::OK,
125            Err(err) => err,
126        },
127        Err(err) => err,
128    }
129}
130
131#[syscall]
132pub fn sys_syscall_test_rust_handle(handle: HandleValue, value: UserOutPtr<u32>) -> Status {
133    if value.is_null() {
134        return Status::INVALID_ARGS;
135    }
136    match value.write(handle.raw_value()) {
137        Ok(()) => Status::OK,
138        Err(err) => err,
139    }
140}