@@ -327,6 +327,7 @@ pub enum SysCall {
327
327
/// * **Ok**: The Scalar / Send message was successfully sent, or the Borrow has finished
328
328
/// * **Scalar1**: The Server returned a `Scalar1` value
329
329
/// * **Scalar2**: The Server returned a `Scalar2` value
330
+ /// * **Scalar5**: The Server returned a `Scalar5` value
330
331
/// * **BlockedProcess**: In Hosted mode, the target process is now blocked
331
332
///
332
333
/// # Errors
@@ -342,6 +343,7 @@ pub enum SysCall {
342
343
/// * **Ok**: The Scalar / Send message was successfully sent, or the Borrow has finished
343
344
/// * **Scalar1**: The Server returned a `Scalar1` value
344
345
/// * **Scalar2**: The Server returned a `Scalar2` value
346
+ /// * **Scalar5**: The Server returned a `Scalar5` value
345
347
/// * **BlockedProcess**: In Hosted mode, the target process is now blocked
346
348
///
347
349
/// # Errors
@@ -467,10 +469,11 @@ pub enum SysCall {
467
469
///
468
470
/// ## Errors
469
471
/// * **BadAddress**: The mapping does not exist
470
- #[ cfg( feature="v2p" ) ]
471
- VirtToPhys (
472
- usize , /* virtual address */
473
- ) ,
472
+ #[ cfg( feature = "v2p" ) ]
473
+ VirtToPhys ( usize /* virtual address */ ) ,
474
+
475
+ /// Return five scalars to the sender
476
+ ReturnScalar5 ( MessageSender , usize , usize , usize , usize , usize ) ,
474
477
475
478
/// This syscall does not exist. It captures all possible
476
479
/// arguments so detailed analysis can be performed.
@@ -516,8 +519,9 @@ pub enum SysCallNumber {
516
519
JoinThread = 36 ,
517
520
SetExceptionHandler = 37 ,
518
521
AdjustProcessLimit = 38 ,
519
- #[ cfg( feature= "v2p" ) ]
522
+ #[ cfg( feature = "v2p" ) ]
520
523
VirtToPhys = 39 ,
524
+ ReturnScalar5 = 40 ,
521
525
Invalid ,
522
526
}
523
527
@@ -562,8 +566,9 @@ impl SysCallNumber {
562
566
36 => JoinThread ,
563
567
37 => SetExceptionHandler ,
564
568
38 => AdjustProcessLimit ,
565
- #[ cfg( feature= "v2p" ) ]
569
+ #[ cfg( feature = "v2p" ) ]
566
570
39 => VirtToPhys ,
571
+ 40 => ReturnScalar5 ,
567
572
_ => Invalid ,
568
573
}
569
574
}
@@ -928,15 +933,18 @@ impl SysCall {
928
933
0 ,
929
934
0 ,
930
935
] ,
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 ,
936
+ #[ cfg( feature = "v2p" ) ]
937
+ SysCall :: VirtToPhys ( vaddr) => {
938
+ [ SysCallNumber :: VirtToPhys as usize , * vaddr, 0 , 0 , 0 , 0 , 0 , 0 ]
939
+ }
940
+ SysCall :: ReturnScalar5 ( sender, arg1, arg2, arg3, arg4, arg5) => [
941
+ SysCallNumber :: ReturnScalar5 as usize ,
942
+ sender. to_usize ( ) ,
943
+ * arg1,
944
+ * arg2,
945
+ * arg3,
946
+ * arg4,
947
+ * arg5,
940
948
0 ,
941
949
] ,
942
950
SysCall :: Invalid ( a1, a2, a3, a4, a5, a6, a7) => [
@@ -1103,8 +1111,11 @@ impl SysCall {
1103
1111
SysCallNumber :: JoinThread => SysCall :: JoinThread ( a1 as _ ) ,
1104
1112
SysCallNumber :: SetExceptionHandler => SysCall :: SetExceptionHandler ( a1 as _ , a2 as _ ) ,
1105
1113
SysCallNumber :: AdjustProcessLimit => SysCall :: AdjustProcessLimit ( a1, a2, a3) ,
1106
- #[ cfg( feature= "v2p" ) ]
1114
+ #[ cfg( feature = "v2p" ) ]
1107
1115
SysCallNumber :: VirtToPhys => SysCall :: VirtToPhys ( a1 as _ ) ,
1116
+ SysCallNumber :: ReturnScalar5 => {
1117
+ SysCall :: ReturnScalar5 ( MessageSender :: from_usize ( a1) , a2, a3, a4, a5, a6)
1118
+ }
1108
1119
SysCallNumber :: Invalid => SysCall :: Invalid ( a1, a2, a3, a4, a5, a6, a7) ,
1109
1120
} )
1110
1121
}
@@ -1201,6 +1212,7 @@ impl SysCall {
1201
1212
SysCall :: TryConnect ( _)
1202
1213
| SysCall :: TryReceiveMessage ( _)
1203
1214
| SysCall :: ReturnToParent ( _, _)
1215
+ | SysCall :: ReturnScalar5 ( _, _, _, _, _, _)
1204
1216
| SysCall :: ReturnScalar2 ( _, _, _)
1205
1217
| SysCall :: ReturnScalar1 ( _, _)
1206
1218
| SysCall :: ReturnMemory ( _, _, _, _)
@@ -1343,6 +1355,25 @@ pub fn return_scalar2(
1343
1355
}
1344
1356
}
1345
1357
1358
+ /// Return 5 scalars to the provided message.
1359
+ pub fn return_scalar5 (
1360
+ sender : MessageSender ,
1361
+ val1 : usize ,
1362
+ val2 : usize ,
1363
+ val3 : usize ,
1364
+ val4 : usize ,
1365
+ val5 : usize ,
1366
+ ) -> core:: result:: Result < ( ) , Error > {
1367
+ let result = rsyscall ( SysCall :: ReturnScalar5 ( sender, val1, val2, val3, val4, val5) ) ?;
1368
+ if let crate :: Result :: Ok = result {
1369
+ Ok ( ( ) )
1370
+ } else if let Result :: Error ( e) = result {
1371
+ Err ( e)
1372
+ } else {
1373
+ Err ( Error :: InternalError )
1374
+ }
1375
+ }
1376
+
1346
1377
/// Claim a hardware interrupt for this process.
1347
1378
pub fn claim_interrupt (
1348
1379
irq_no : usize ,
@@ -1530,6 +1561,7 @@ pub fn try_send_message(connection: CID, message: Message) -> core::result::Resu
1530
1561
Ok ( Result :: Ok ) => Ok ( Result :: Ok ) ,
1531
1562
Ok ( Result :: Scalar1 ( a) ) => Ok ( Result :: Scalar1 ( a) ) ,
1532
1563
Ok ( Result :: Scalar2 ( a, b) ) => Ok ( Result :: Scalar2 ( a, b) ) ,
1564
+ Ok ( Result :: Scalar5 ( a, b, c, d, e) ) => Ok ( Result :: Scalar5 ( a, b, c, d, e) ) ,
1533
1565
Ok ( Result :: MemoryReturned ( offset, valid) ) => Ok ( Result :: MemoryReturned ( offset, valid) ) ,
1534
1566
Err ( e) => Err ( e) ,
1535
1567
v => panic ! ( "Unexpected return value: {:?}" , v) ,
@@ -1572,6 +1604,7 @@ pub fn send_message(connection: CID, message: Message) -> core::result::Result<R
1572
1604
Ok ( Result :: Ok ) => Ok ( Result :: Ok ) ,
1573
1605
Ok ( Result :: Scalar1 ( a) ) => Ok ( Result :: Scalar1 ( a) ) ,
1574
1606
Ok ( Result :: Scalar2 ( a, b) ) => Ok ( Result :: Scalar2 ( a, b) ) ,
1607
+ Ok ( Result :: Scalar5 ( a, b, c, d, e) ) => Ok ( Result :: Scalar5 ( a, b, c, d, e) ) ,
1575
1608
Ok ( Result :: MemoryReturned ( offset, valid) ) => Ok ( Result :: MemoryReturned ( offset, valid) ) ,
1576
1609
Err ( e) => Err ( e) ,
1577
1610
v => panic ! ( "Unexpected return value: {:?}" , v) ,
@@ -1872,7 +1905,7 @@ pub fn set_exception_handler(
1872
1905
*/
1873
1906
1874
1907
/// Translate a virtual address to a physical address
1875
- #[ cfg( feature= "v2p" ) ]
1908
+ #[ cfg( feature = "v2p" ) ]
1876
1909
pub fn virt_to_phys ( va : usize ) -> core:: result:: Result < usize , Error > {
1877
1910
rsyscall ( SysCall :: VirtToPhys ( va) ) . and_then ( |result| {
1878
1911
if let Result :: Scalar1 ( pa) = result {
0 commit comments