Skip to content

Commit c8bb039

Browse files
committed
xous: add api support for Scalar5
Add syscall and return definitions for Scalar5, as well as ReturnScalar5. This will enable us to pass up to five scalars as a return from a blockingscalar call. Signed-off-by: Sean Cross <[email protected]>
1 parent f861af7 commit c8bb039

File tree

2 files changed

+31
-17
lines changed

2 files changed

+31
-17
lines changed

xous-rs/src/definitions.rs

+5
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,9 @@ pub enum Result {
460460
/// the caller.
461461
NewProcess(ProcessStartup),
462462

463+
/// 20: A scalar with five values
464+
Scalar5(usize, usize, usize, usize, usize),
465+
463466
UnknownResult(usize, usize, usize, usize, usize, usize, usize),
464467
}
465468

@@ -523,6 +526,7 @@ impl Result {
523526
0,
524527
],
525528
Result::NewProcess(p) => Self::add_opcode(19, p.into()),
529+
Result::Scalar5(a, b, c, d, e) => [15, *a, *b, *c, *d, *e, 0, 0],
526530
Result::UnknownResult(arg1, arg2, arg3, arg4, arg5, arg6, arg7) => {
527531
[usize::MAX, *arg1, *arg2, *arg3, *arg4, *arg5, *arg6, *arg7]
528532
}
@@ -600,6 +604,7 @@ impl Result {
600604
17 => Result::None,
601605
18 => Result::MemoryReturned(MemorySize::new(src[1]), MemorySize::new(src[2])),
602606
19 => Result::NewProcess(src.into()),
607+
20 => Result::Scalar5(src[1], src[2], src[3], src[4], src[5]),
603608
_ => Result::UnknownResult(src[0], src[1], src[2], src[3], src[4], src[5], src[6]),
604609
}
605610
}

xous-rs/src/syscall.rs

+26-17
Original file line numberDiff line numberDiff line change
@@ -467,10 +467,11 @@ pub enum SysCall {
467467
///
468468
/// ## Errors
469469
/// * **BadAddress**: The mapping does not exist
470-
#[cfg(feature="v2p")]
471-
VirtToPhys(
472-
usize, /* virtual address */
473-
),
470+
#[cfg(feature = "v2p")]
471+
VirtToPhys(usize /* virtual address */),
472+
473+
/// Return five scalars to the sender
474+
ReturnScalar5(MessageSender, usize, usize, usize, usize, usize),
474475

475476
/// This syscall does not exist. It captures all possible
476477
/// arguments so detailed analysis can be performed.
@@ -516,8 +517,9 @@ pub enum SysCallNumber {
516517
JoinThread = 36,
517518
SetExceptionHandler = 37,
518519
AdjustProcessLimit = 38,
519-
#[cfg(feature="v2p")]
520+
#[cfg(feature = "v2p")]
520521
VirtToPhys = 39,
522+
ReturnScalar5 = 40,
521523
Invalid,
522524
}
523525

@@ -562,8 +564,9 @@ impl SysCallNumber {
562564
36 => JoinThread,
563565
37 => SetExceptionHandler,
564566
38 => AdjustProcessLimit,
565-
#[cfg(feature="v2p")]
567+
#[cfg(feature = "v2p")]
566568
39 => VirtToPhys,
569+
40 => ReturnScalar5,
567570
_ => Invalid,
568571
}
569572
}
@@ -928,15 +931,18 @@ impl SysCall {
928931
0,
929932
0,
930933
],
931-
#[cfg(feature="v2p")]
932-
SysCall::VirtToPhys(vaddr) => [
933-
SysCallNumber::VirtToPhys as usize,
934-
*vaddr,
935-
0,
936-
0,
937-
0,
938-
0,
939-
0,
934+
#[cfg(feature = "v2p")]
935+
SysCall::VirtToPhys(vaddr) => {
936+
[SysCallNumber::VirtToPhys as usize, *vaddr, 0, 0, 0, 0, 0, 0]
937+
}
938+
SysCall::ReturnScalar5(sender, arg1, arg2, arg3, arg4, arg5) => [
939+
SysCallNumber::ReturnScalar5 as usize,
940+
sender.to_usize(),
941+
*arg1,
942+
*arg2,
943+
*arg3,
944+
*arg4,
945+
*arg5,
940946
0,
941947
],
942948
SysCall::Invalid(a1, a2, a3, a4, a5, a6, a7) => [
@@ -1103,8 +1109,11 @@ impl SysCall {
11031109
SysCallNumber::JoinThread => SysCall::JoinThread(a1 as _),
11041110
SysCallNumber::SetExceptionHandler => SysCall::SetExceptionHandler(a1 as _, a2 as _),
11051111
SysCallNumber::AdjustProcessLimit => SysCall::AdjustProcessLimit(a1, a2, a3),
1106-
#[cfg(feature="v2p")]
1112+
#[cfg(feature = "v2p")]
11071113
SysCallNumber::VirtToPhys => SysCall::VirtToPhys(a1 as _),
1114+
SysCallNumber::ReturnScalar5 => {
1115+
SysCall::ReturnScalar5(MessageSender::from_usize(a1), a2, a3, a4, a5, a6)
1116+
}
11081117
SysCallNumber::Invalid => SysCall::Invalid(a1, a2, a3, a4, a5, a6, a7),
11091118
})
11101119
}
@@ -1872,7 +1881,7 @@ pub fn set_exception_handler(
18721881
*/
18731882

18741883
/// Translate a virtual address to a physical address
1875-
#[cfg(feature="v2p")]
1884+
#[cfg(feature = "v2p")]
18761885
pub fn virt_to_phys(va: usize) -> core::result::Result<usize, Error> {
18771886
rsyscall(SysCall::VirtToPhys(va)).and_then(|result| {
18781887
if let Result::Scalar1(pa) = result {

0 commit comments

Comments
 (0)