1#![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}