use moa_uapi::{
error::{
ERR_BUSY, ERR_FAULT, ERR_INVAL, ERR_NO_RESOURCE, ERR_NOT_FOUND, ERR_NOT_SUPPORTED, ERR_PERM,
},
mem::{CacheOp, MemCreateArgs, MemHandle, Paddr},
sysnr::{
SYSNR_MEM_CACHE_OP, SYSNR_MEM_COPY, SYSNR_MEM_CREATE, SYSNR_MEM_PHYS_ADDR, SYSNR_MEM_READ,
SYSNR_MEM_RELEASE, SYSNR_MEM_WRITE,
},
};
pub type Result<T> = core::result::Result<T, MemError>;
define_syscall_error! {
pub enum MemError {
Perm = ERR_PERM,
NotFound = ERR_NOT_FOUND,
Inval = ERR_INVAL,
NoResource = ERR_NO_RESOURCE,
Fault = ERR_FAULT,
NotSupported = ERR_NOT_SUPPORTED,
Busy = ERR_BUSY,
}
}
pub fn mem_create(args: &MemCreateArgs) -> Result<MemHandle> {
let ret =
unsafe { super::arch::syscall1(SYSNR_MEM_CREATE, args as *const MemCreateArgs as usize) };
if ret < 0 { Err(MemError::from_raw(ret)) } else { Ok(MemHandle::from_raw(ret as u32)) }
}
pub fn mem_release(mem: MemHandle) -> Result<()> {
let ret = unsafe { super::arch::syscall1(SYSNR_MEM_RELEASE, mem.raw() as usize) };
if ret < 0 { Err(MemError::from_raw(ret)) } else { Ok(()) }
}
pub fn mem_write(mem: MemHandle, offset: usize, data: &[u8]) -> Result<()> {
let ret = unsafe {
super::arch::syscall4(
SYSNR_MEM_WRITE,
mem.raw() as usize,
offset,
data.as_ptr() as usize,
data.len(),
)
};
if ret < 0 { Err(MemError::from_raw(ret)) } else { Ok(()) }
}
pub fn mem_read(mem: MemHandle, offset: usize, buf: &mut [u8]) -> Result<()> {
let ret = unsafe {
super::arch::syscall4(
SYSNR_MEM_READ,
mem.raw() as usize,
offset,
buf.as_mut_ptr() as usize,
buf.len(),
)
};
if ret < 0 { Err(MemError::from_raw(ret)) } else { Ok(()) }
}
pub fn mem_copy(
dst: MemHandle,
dst_offset: usize,
src: MemHandle,
src_offset: usize,
len: usize,
) -> Result<()> {
let ret = unsafe {
super::arch::syscall5(
SYSNR_MEM_COPY,
dst.raw() as usize,
dst_offset,
src.raw() as usize,
src_offset,
len,
)
};
if ret < 0 { Err(MemError::from_raw(ret)) } else { Ok(()) }
}
pub fn mem_phys_addr(mem: MemHandle, offset: usize) -> Result<Paddr> {
let ret = unsafe { super::arch::syscall2(SYSNR_MEM_PHYS_ADDR, mem.raw() as usize, offset) };
if ret < 0 { Err(MemError::from_raw(ret)) } else { Ok(Paddr::from_raw(ret as usize)) }
}
pub fn mem_cache_op(mem: MemHandle, offset: usize, len: usize, op: CacheOp) -> Result<()> {
let ret = unsafe {
super::arch::syscall4(SYSNR_MEM_CACHE_OP, mem.raw() as usize, offset, len, op as usize)
};
if ret < 0 { Err(MemError::from_raw(ret)) } else { Ok(()) }
}