-
Notifications
You must be signed in to change notification settings - Fork 133
Expand file tree
/
Copy pathmock.rs
More file actions
123 lines (104 loc) · 3.42 KB
/
Copy pathmock.rs
File metadata and controls
123 lines (104 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
use core::sync::atomic::AtomicU32;
use litebox::utils::ReinterpretUnsignedExt as _;
use litebox::utils::TruncateExt as _;
use crate::HostInterface;
pub struct MockHostInterface {}
pub type MockKernel = crate::LinuxKernel<MockHostInterface>;
#[macro_export]
macro_rules! mock_log_println {
($($tt:tt)*) => {{
use core::fmt::Write;
let mut t: arrayvec::ArrayString<1024> = arrayvec::ArrayString::new();
writeln!(t, $($tt)*).unwrap();
<$crate::host::mock::MockHostInterface as $crate::HostInterface>::log(&t);
}};
}
impl HostInterface for MockHostInterface {
fn alloc(layout: &core::alloc::Layout) -> Option<(usize, usize)> {
let size = core::cmp::max(
layout.size().next_power_of_two(),
// Note `mmap` provides no guarantee of alignment, so we double the size to ensure we
// can always find a required chunk within the returned memory region.
core::cmp::max(layout.align(), 0x1000) << 1,
);
let addr = unsafe {
syscalls::syscall6(
syscalls::Sysno::mmap,
0,
size << 1,
litebox_common_linux::ProtFlags::PROT_READ_WRITE
.bits()
.reinterpret_as_unsigned() as usize,
(litebox_common_linux::MapFlags::MAP_PRIVATE
| litebox_common_linux::MapFlags::MAP_ANON)
.bits()
.reinterpret_as_unsigned() as usize,
usize::MAX,
0,
)
}
.ok()?;
Some((addr, size << 1))
}
unsafe fn free(_addr: usize) {
todo!()
}
fn terminate(_reason_set: u64, _reason_code: u64) -> ! {
todo!()
}
fn send_ip_packet(_packet: &[u8]) -> Result<usize, crate::Errno> {
todo!()
}
fn receive_ip_packet(_packet: &mut [u8]) -> Result<usize, crate::Errno> {
todo!()
}
fn log(msg: &str) {
let _ = unsafe {
syscalls::syscall3(
syscalls::Sysno::write,
litebox_common_linux::STDERR_FILENO as usize,
msg.as_ptr() as usize,
msg.len(),
)
};
}
fn wake_many(_mutex: &AtomicU32, _n: usize) -> Result<usize, crate::Errno> {
todo!()
}
fn block_or_maybe_timeout(
_mutex: &AtomicU32,
_val: u32,
_timeout: Option<core::time::Duration>,
) -> Result<(), crate::Errno> {
todo!()
}
fn read_from_stdin(_buf: &mut [u8]) -> Result<usize, litebox_common_linux::errno::Errno> {
todo!()
}
fn write_to(
_stream: litebox::platform::StdioOutStream,
_buf: &[u8],
) -> Result<usize, litebox_common_linux::errno::Errno> {
todo!()
}
fn current_system_time() -> core::time::Duration {
let mut t = litebox_common_linux::Timespec::default();
let ret = unsafe {
syscalls::syscall2(
syscalls::Sysno::clock_gettime,
0, // CLOCK_REALTIME
&raw mut t as usize,
)
};
assert!(ret.is_ok(), "clock_gettime failed");
core::time::Duration::new(t.tv_sec.reinterpret_as_unsigned(), t.tv_nsec.trunc())
}
fn return_to_host() -> ! {
todo!()
}
fn terminate_process(_code: i32) -> ! {
todo!()
}
}