#[inline(never)] pub fn syscall_terminate_process(exit_code: i32) -> !
{
unsafe {
core::arch::asm!(
"mov x0, {exit_code}",
"mov x8, #0",
"svc #0x51",
exit_code = in(reg) exit_code,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
panic!("This function should not return");
}
#[inline(never)] pub fn syscall_publish_to_topic<T: ?Sized>(topic: &str, message: &T, message_size: usize)
{
unsafe {
core::arch::asm!(
"mov x3, {message_size}",
"mov x2, {message_ptr}",
"mov x1, {topic_len}",
"mov x0, {topic_ptr}",
"mov x8, #1", "svc #0x51",
message_size = in(reg) message_size,
message_ptr = in(reg) message as *const T as *const u8,
topic_len = in(reg) topic.len(),
topic_ptr = in(reg) topic.as_ptr(),
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
}
#[deprecated(note = "Use syscall_create_topic() for zero-copy topic creation. This function will be removed in a future version.")]
#[inline(never)] pub fn syscall_create_topic_old<T: ?Sized>(topic: &str)
{
unsafe {
core::arch::asm!(
"mov x1, {topic_len}",
"mov x0, {topic_ptr}",
"mov x8, #2", "svc #0x51",
topic_len = in(reg) topic.len(),
topic_ptr = in(reg) topic.as_ptr(),
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
}
#[inline(never)]
pub fn syscall_subscribe_topic(topic: &str) -> (*const u8, usize) {
let mut message: *const u8;
let mut message_size: usize;
unsafe {
core::arch::asm!(
"mov x1, {topic_len}",
"mov x0, {topic_ptr}",
"mov x8, #3", "svc #0x51",
topic_len = in(reg) topic.len(),
topic_ptr = in(reg) topic.as_ptr(),
out("x0") message,
out("x1") message_size,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
(message, message_size)
}
#[inline(never)]
pub fn syscall_mmap(virtual_address: u64, physical_address: u64, size: usize, prot: u64) -> *mut u8
{
let mut out_virtual_address: *mut u8;
unsafe {
core::arch::asm!(
"mov x3, {prot}",
"mov x2, {size}",
"mov x1, {physical_address}",
"mov x0, {virtual_address}",
"mov x8, #4", "svc #0x51",
prot = in(reg) prot,
size = in(reg) size,
physical_address = in(reg) physical_address,
virtual_address = in(reg) virtual_address,
out("x0") out_virtual_address,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
out_virtual_address
}
#[inline(never)]
pub fn syscall_munmap(virtual_address: u64, size: usize) -> i32
{
let mut result: i32 = 0;
unsafe {
core::arch::asm!(
"mov x1, {size}",
"mov x0, {virtual_address}",
"mov x8, #5", "svc #0x51",
size = in(reg) size,
virtual_address = in(reg) virtual_address,
out("x0") result,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
result
}
#[inline(never)]
pub fn syscall_request_service(server_name: &str, request_message_type: u64, request_message_ptr: *const u8, request_message_size: usize,
reply_message_ptr: *const u8, reply_message_size: usize) -> Result<i64, crate::error_kind::ErrorKind>
{
let mut result: i64 = 0;
unsafe {
core::arch::asm!(
"mov x6, {reply_size}",
"mov x5, {reply_ptr}",
"mov x4, {request_size}",
"mov x3, {request_ptr}",
"mov x2, {msg_type}",
"mov x1, {name_len}",
"mov x0, {name_ptr}",
"mov x8, #6", "svc #0x51",
reply_size = in(reg) reply_message_size,
reply_ptr = in(reg) reply_message_ptr,
request_size = in(reg) request_message_size,
request_ptr = in(reg) request_message_ptr,
msg_type = in(reg) request_message_type,
name_len = in(reg) server_name.len(),
name_ptr = in(reg) server_name.as_ptr(),
out("x0") result,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
if result < 0 {
Err(crate::error_kind::ErrorKind::Other.into())
} else {
Ok(result)
}
}
#[inline(never)]
pub fn syscall_send_service_request_and_wait_for_reply(server_name: &str, request_message_type: u64, request_message_ptr: *const u8,
request_message_size: usize) -> Result<(*const u8, usize, i64), crate::error_kind::ErrorKind>
{
let mut reply_message_ptr: *const u8 = core::ptr::null();
let mut reply_message_size: usize = 0;
let mut reply_message_error: i64 = 0;
unsafe {
core::arch::asm!(
"mov x4, {size}",
"mov x3, {ptr}",
"mov x2, {msg_type}",
"mov x1, {name_len}",
"mov x0, {name_ptr}",
"mov x8, #10", "svc #0x51",
size = in(reg) request_message_size,
ptr = in(reg) request_message_ptr,
msg_type = in(reg) request_message_type,
name_len = in(reg) server_name.len(),
name_ptr = in(reg) server_name.as_ptr(),
out("x0") reply_message_ptr,
out("x1") reply_message_size,
out("x2") reply_message_error,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
if reply_message_error != 0 { Err(crate::error_kind::ErrorKind::from(reply_message_error))
} else {
Ok((reply_message_ptr, reply_message_size, 0))
}
}
#[inline(never)]
pub fn syscall_receive_service_request(server_name: &str) -> Result<(u64, u64, *const u8, usize), crate::error_kind::ErrorKind>
{
let mut client_thread: *const u8;
let mut request_message_type: u64;
let mut request_message_ptr: *const u8;
let mut request_message_size: usize;
unsafe {
core::arch::asm!(
"mov x1, {name_len}",
"mov x0, {name_ptr}",
"mov x8, #11", "svc #0x51",
name_len = in(reg) server_name.len(),
name_ptr = in(reg) server_name.as_ptr(),
out("x0") client_thread,
out("x1") request_message_type,
out("x2") request_message_ptr,
out("x3") request_message_size,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
if client_thread == core::ptr::null() {
Err(crate::error_kind::ErrorKind::Other.into())
} else {
Ok((client_thread as u64, request_message_type, request_message_ptr, request_message_size))
}
}
#[inline(never)]
pub fn syscall_receive_request(server_name: &str) -> Result<(u64, u64, *const u8, usize, *const u8, usize), crate::error_kind::ErrorKind>
{
let client_thread: *const u8;
let request_message_type: u64;
let request_message_ptr: *const u8;
let request_message_size: usize;
let reply_message_ptr: *const u8;
let reply_message_size: usize;
unsafe {
core::arch::asm!(
"mov x1, {name_len}",
"mov x0, {name_ptr}",
"mov x8, #7", "svc #0x51",
name_len = in(reg) server_name.len(),
name_ptr = in(reg) server_name.as_ptr(),
out("x0") client_thread,
out("x1") request_message_type,
out("x2") request_message_ptr,
out("x3") request_message_size,
out("x4") reply_message_ptr,
out("x5") reply_message_size,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
if client_thread == core::ptr::null() {
Err(crate::error_kind::ErrorKind::Other.into())
} else {
Ok((client_thread as u64, request_message_type, request_message_ptr, request_message_size, reply_message_ptr, reply_message_size))
}
}
#[inline(never)]
pub fn syscall_create_server(server_name: &str) -> i32 {
let mut ret: i32 = 0;
unsafe {
core::arch::asm!(
"mov x1, {name_len}",
"mov x0, {name_ptr}",
"mov x8, #8", "svc #0x51",
name_len = in(reg) server_name.len(),
name_ptr = in(reg) server_name.as_ptr(),
out("x0") ret,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
ret
}
#[inline(never)]
pub fn syscall_reply_to_request(server_name: &str, client_thraed: u64, reply_message: i64) -> Result<(), crate::error_kind::ErrorKind>{
let mut result: i32 = 0;
unsafe {
core::arch::asm!(
"mov x3, {reply_message}",
"mov x2, {client_thread}",
"mov x1, {name_len}",
"mov x0, {name_ptr}",
"mov x8, #9", "svc #0x51",
reply_message = in(reg) reply_message,
client_thread = in(reg) client_thraed,
name_len = in(reg) server_name.len(),
name_ptr = in(reg) server_name.as_ptr(),
out("x0") result,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
if result < 0 {
Err(crate::error_kind::ErrorKind::Other.into())
} else {
Ok(())
}
}
pub fn syscall_reply_to_service_request(server_name: &str, request_client_thread_id: u64, reply_message_ptr: *const u8, reply_message_size: usize, reply_message_error: i64) -> Result<(), crate::error_kind::ErrorKind>{
let mut result: i64 = 0;
unsafe {
core::arch::asm!(
"mov x5, {reply_message_error}",
"mov x4, {reply_message_size}",
"mov x3, {reply_message_ptr}",
"mov x2, {request_client_thread_id}",
"mov x1, {name_len}",
"mov x0, {name_ptr}",
"mov x8, #12", "svc #0x51",
reply_message_error = in(reg) reply_message_error,
reply_message_size = in(reg) reply_message_size,
reply_message_ptr = in(reg) reply_message_ptr,
request_client_thread_id = in(reg) request_client_thread_id,
name_len = in(reg) server_name.len(),
name_ptr = in(reg) server_name.as_ptr(),
out("x0") result,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
if result < 0 {
Err(crate::error_kind::ErrorKind::Other.into())
} else {
Ok(())
}
}
#[inline(never)]
pub fn syscall_sleep(secs: u64, nanos: u32) {
unsafe {
core::arch::asm!(
"mov x0, {secs}",
"mov x1, {nanos}",
"mov x8, #14", "svc #0x51",
secs = in(reg) secs,
nanos = in(reg) nanos,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
}
#[inline(never)]
pub fn syscall_create_topic(topic: &str) {
unsafe {
core::arch::asm!(
"mov x1, {topic_len}",
"mov x0, {topic_ptr}",
"mov x8, #15", "svc #0x51",
topic_len = in(reg) topic.len(),
topic_ptr = in(reg) topic.as_ptr(),
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
}
#[inline(never)]
pub fn syscall_get_topic_shared_memory(topic: &str) -> (*mut u8, usize) {
let mut buffer_ptr: *mut u8;
let mut buffer_size: usize;
unsafe {
core::arch::asm!(
"mov x1, {topic_len}",
"mov x0, {topic_ptr}",
"mov x8, #16", "svc #0x51",
topic_len = in(reg) topic.len(),
topic_ptr = in(reg) topic.as_ptr(),
out("x0") buffer_ptr,
out("x1") buffer_size,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
(buffer_ptr, buffer_size)
}
#[inline(never)]
pub fn syscall_commit_publish(topic: &str, message_size: usize) {
unsafe {
core::arch::asm!(
"mov x2, {message_size}",
"mov x1, {topic_len}",
"mov x0, {topic_ptr}",
"mov x8, #17", "svc #0x51",
message_size = in(reg) message_size,
topic_len = in(reg) topic.len(),
topic_ptr = in(reg) topic.as_ptr(),
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
}
#[inline(never)]
pub fn syscall_subscribe_topic_zero_copy(topic: &str) -> (*const u8, usize) {
let mut message_ptr: *const u8;
let mut message_size: usize;
unsafe {
core::arch::asm!(
"mov x1, {topic_len}",
"mov x0, {topic_ptr}",
"mov x8, #18", "svc #0x51",
topic_len = in(reg) topic.len(),
topic_ptr = in(reg) topic.as_ptr(),
out("x0") message_ptr,
out("x1") message_size,
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
(message_ptr, message_size)
}
#[inline(never)]
pub fn syscall_ack_message(topic: &str) {
unsafe {
core::arch::asm!(
"mov x1, {topic_len}",
"mov x0, {topic_ptr}",
"mov x8, #19", "svc #0x51",
topic_len = in(reg) topic.len(),
topic_ptr = in(reg) topic.as_ptr(),
clobber_abi("C"),
options(nostack, preserves_flags),
);
}
}