Skip to content

Commit b8083a9

Browse files
stlankesmkroening
andcommitted
feat(builtins): add support for MASOS apps
Co-authored-by: Martin Kröning <martin.kroening@eonerc.rwth-aachen.de>
1 parent 6dd4029 commit b8083a9

9 files changed

Lines changed: 683 additions & 0 deletions

File tree

hermit-builtins/Cargo.lock

Lines changed: 49 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

hermit-builtins/Cargo.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,23 @@ edition = "2024"
55
[dependencies]
66
libm = "0.2"
77

8+
#! ## MASOS dependencies
9+
hermit-abi = { version = "0.5", optional = true }
10+
spinning_top = { version = "0.3", optional = true }
11+
talc = { version = "5", default-features = false, optional = true }
12+
813
[lib]
914
crate-type = ["staticlib"]
1015
harness = false
1116

17+
[features]
18+
default = []
19+
masos = [
20+
"dep:hermit-abi",
21+
"dep:spinning_top",
22+
"dep:talc",
23+
]
24+
1225
[profile.dist]
1326
inherits = "release"
1427
lto = "thin"

hermit-builtins/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
#![no_std]
22
#![no_main]
33
#![feature(linkage)]
4+
#![cfg_attr(feature = "masos", feature(macro_metavar_expr_concat))]
5+
#![cfg_attr(feature = "masos", feature(thread_local))]
46

7+
#[cfg(feature = "masos")]
8+
extern crate alloc;
9+
10+
#[cfg(feature = "masos")]
11+
mod masos;
512
pub mod math;
613

714
#[panic_handler]

hermit-builtins/src/masos/alloc.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use alloc::alloc::{alloc, alloc_zeroed, dealloc, realloc};
2+
use core::alloc::Layout;
3+
use core::mem::MaybeUninit;
4+
5+
use spinning_top::RawSpinlock;
6+
use talc::TalcLock;
7+
use talc::source::Claim;
8+
9+
#[global_allocator]
10+
static TALC: TalcLock<RawSpinlock, Claim> = TalcLock::new(unsafe {
11+
#[repr(C, align(0x1000))]
12+
struct Heap([MaybeUninit<u8>; 0x1_0000]);
13+
14+
static mut HEAP: Heap = Heap([MaybeUninit::uninit(); _]);
15+
16+
let base = (&raw mut HEAP).cast::<u8>();
17+
let size = size_of::<Heap>();
18+
Claim::new(base, size)
19+
});
20+
21+
#[unsafe(no_mangle)]
22+
unsafe extern "C" fn sys_alloc(size: usize, align: usize) -> *mut u8 {
23+
unsafe { alloc(layout_from_size_align(size, align)) }
24+
}
25+
26+
#[unsafe(no_mangle)]
27+
unsafe extern "C" fn sys_dealloc(ptr: *mut u8, size: usize, align: usize) {
28+
unsafe { dealloc(ptr, layout_from_size_align(size, align)) }
29+
}
30+
31+
#[unsafe(no_mangle)]
32+
unsafe extern "C" fn sys_alloc_zeroed(size: usize, align: usize) -> *mut u8 {
33+
unsafe { alloc_zeroed(layout_from_size_align(size, align)) }
34+
}
35+
36+
#[unsafe(no_mangle)]
37+
unsafe extern "C" fn sys_realloc(
38+
ptr: *mut u8,
39+
size: usize,
40+
align: usize,
41+
new_size: usize,
42+
) -> *mut u8 {
43+
unsafe { realloc(ptr, layout_from_size_align(size, align), new_size) }
44+
}
45+
46+
/// Deprecated
47+
#[unsafe(no_mangle)]
48+
unsafe extern "C" fn sys_malloc(size: usize, align: usize) -> *mut u8 {
49+
unsafe { sys_alloc(size, align) }
50+
}
51+
52+
/// Deprecated
53+
#[unsafe(no_mangle)]
54+
unsafe extern "C" fn sys_free(ptr: *mut u8, size: usize, align: usize) {
55+
unsafe { sys_dealloc(ptr, size, align) }
56+
}
57+
58+
unsafe fn layout_from_size_align(size: usize, align: usize) -> Layout {
59+
if cfg!(debug_assertions) {
60+
Layout::from_size_align(size, align).unwrap()
61+
} else {
62+
unsafe { Layout::from_size_align_unchecked(size, align) }
63+
}
64+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
use core::arch::asm;
2+
3+
#[inline]
4+
pub(crate) unsafe fn syscall0(nr: usize) -> usize {
5+
let r0;
6+
unsafe {
7+
asm!(
8+
"svc 0",
9+
in("x8") nr,
10+
lateout("x0") r0,
11+
options(preserves_flags),
12+
);
13+
}
14+
r0
15+
}
16+
17+
#[inline]
18+
pub(crate) unsafe fn syscall1(nr: usize, a0: usize) -> usize {
19+
let r0;
20+
unsafe {
21+
asm!(
22+
"svc 0",
23+
in("x8") nr,
24+
inlateout("x0") a0 => r0,
25+
options(preserves_flags),
26+
);
27+
}
28+
r0
29+
}
30+
31+
#[inline]
32+
pub(crate) unsafe fn syscall2(nr: usize, a0: usize, a1: usize) -> usize {
33+
let r0;
34+
unsafe {
35+
asm!(
36+
"svc 0",
37+
in("x8") nr,
38+
inlateout("x0") a0 => r0,
39+
in("x1") a1,
40+
options(preserves_flags),
41+
);
42+
}
43+
r0
44+
}
45+
46+
#[inline]
47+
pub(crate) unsafe fn syscall3(nr: usize, a0: usize, a1: usize, a2: usize) -> usize {
48+
let r0;
49+
unsafe {
50+
asm!(
51+
"svc 0",
52+
in("x8") nr,
53+
inlateout("x0") a0 => r0,
54+
in("x1") a1,
55+
in("x2") a2,
56+
options(preserves_flags),
57+
);
58+
}
59+
r0
60+
}
61+
62+
#[inline]
63+
pub(crate) unsafe fn syscall4(nr: usize, a0: usize, a1: usize, a2: usize, a3: usize) -> usize {
64+
let r0;
65+
unsafe {
66+
asm!(
67+
"svc 0",
68+
in("x8") nr,
69+
inlateout("x0") a0 => r0,
70+
in("x1") a1,
71+
in("x2") a2,
72+
in("x3") a3,
73+
options(preserves_flags),
74+
);
75+
}
76+
r0
77+
}
78+
79+
#[inline]
80+
pub(crate) unsafe fn syscall5(nr: usize, a0: usize, a1: usize, a2: usize, a3: usize, a4: usize) -> usize {
81+
let r0;
82+
unsafe {
83+
asm!(
84+
"svc 0",
85+
in("x8") nr,
86+
inlateout("x0") a0 => r0,
87+
in("x1") a1,
88+
in("x2") a2,
89+
in("x3") a3,
90+
in("x4") a4,
91+
options(preserves_flags),
92+
);
93+
}
94+
r0
95+
}
96+
97+
#[inline]
98+
pub(crate) unsafe fn syscall6(
99+
nr: usize,
100+
a0: usize,
101+
a1: usize,
102+
a2: usize,
103+
a3: usize,
104+
a4: usize,
105+
a5: usize,
106+
) -> usize {
107+
let r0;
108+
unsafe {
109+
asm!(
110+
"svc 0",
111+
in("x8") nr,
112+
inlateout("x0") a0 => r0,
113+
in("x1") a1,
114+
in("x2") a2,
115+
in("x3") a3,
116+
in("x4") a4,
117+
in("x5") a5,
118+
options(preserves_flags),
119+
);
120+
}
121+
r0
122+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
cfg_select! {
2+
target_arch = "aarch64" => {
3+
mod aarch64;
4+
pub(crate) use aarch64::*;
5+
}
6+
target_arch = "x86_64" => {
7+
mod x86_64;
8+
pub(crate) use x86_64::*;
9+
}
10+
_ => {}
11+
}
12+
13+
macro_rules! syscall {
14+
($nr:expr $(,)?) => {
15+
$crate::masos::arch::syscall0($nr as usize)
16+
};
17+
18+
($nr:expr, $a0:expr $(,)?) => {
19+
$crate::masos::arch::syscall1($nr as usize, $a0 as usize)
20+
};
21+
22+
($nr:expr, $a0:expr, $a1:expr $(,)?) => {
23+
$crate::masos::arch::syscall2($nr as usize, $a0 as usize, $a1 as usize)
24+
};
25+
26+
($nr:expr, $a0:expr, $a1:expr, $a2:expr $(,)?) => {
27+
$crate::masos::arch::syscall3($nr as usize, $a0 as usize, $a1 as usize, $a2 as usize)
28+
};
29+
30+
($nr:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr $(,)?) => {
31+
$crate::masos::arch::syscall4(
32+
$nr as usize,
33+
$a0 as usize,
34+
$a1 as usize,
35+
$a2 as usize,
36+
$a3 as usize,
37+
)
38+
};
39+
40+
($nr:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr $(,)?) => {
41+
$crate::masos::arch::syscall5(
42+
$nr as usize,
43+
$a0 as usize,
44+
$a1 as usize,
45+
$a2 as usize,
46+
$a3 as usize,
47+
$a4 as usize,
48+
)
49+
};
50+
51+
($nr:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr $(,)?) => {
52+
$crate::masos::arch::syscall6(
53+
$nr as usize,
54+
$a0 as usize,
55+
$a1 as usize,
56+
$a2 as usize,
57+
$a3 as usize,
58+
$a4 as usize,
59+
$a5 as usize,
60+
)
61+
};
62+
}

0 commit comments

Comments
 (0)