Skip to content

Commit 5ebd4d9

Browse files
committed
move interface to the unikernel in the crate hermit-abi
=> simplifies the maintenance of the interface
1 parent dc094bf commit 5ebd4d9

File tree

12 files changed

+70
-114
lines changed

12 files changed

+70
-114
lines changed

Cargo.lock

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,17 @@ dependencies = [
12911291
"unicode-segmentation",
12921292
]
12931293

1294+
[[package]]
1295+
name = "hermit-abi"
1296+
version = "0.1.1"
1297+
source = "registry+https://github.com/rust-lang/crates.io-index"
1298+
checksum = "f22b8f315b98f415780ddbe9163c7dbbc5a07225b6d102ace1d8aeef85775140"
1299+
dependencies = [
1300+
"compiler_builtins",
1301+
"libc",
1302+
"rustc-std-workspace-core",
1303+
]
1304+
12941305
[[package]]
12951306
name = "hex"
12961307
version = "0.3.2"
@@ -4073,7 +4084,8 @@ dependencies = [
40734084
"core",
40744085
"dlmalloc",
40754086
"fortanix-sgx-abi",
4076-
"hashbrown",
4087+
"hashbrown 0.6.1",
4088+
"hermit-abi",
40774089
"libc",
40784090
"panic_abort",
40794091
"panic_unwind",

src/libstd/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ dlmalloc = { version = "0.1", features = ['rustc-dep-of-std'] }
5050
[target.x86_64-fortanix-unknown-sgx.dependencies]
5151
fortanix-sgx-abi = { version = "0.3.2", features = ['rustc-dep-of-std'] }
5252

53+
[target.x86_64-unknown-hermit.dependencies]
54+
hermit-abi = { version = "0.1", features = ['rustc-dep-of-std'] }
55+
5356
[target.wasm32-wasi.dependencies]
5457
wasi = { version = "0.7.0", features = ['rustc-dep-of-std', 'alloc'] }
5558

src/libstd/sys/hermit/alloc.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
use crate::alloc::{GlobalAlloc, Layout, System};
22
use crate::ptr;
3-
4-
extern "C" {
5-
fn sys_malloc(size: usize, align: usize) -> *mut u8;
6-
fn sys_realloc(ptr: *mut u8, size: usize, align: usize, new_size: usize) -> *mut u8;
7-
fn sys_free(ptr: *mut u8, size: usize, align: usize);
8-
}
3+
use crate::sys::hermit::abi;
94

105
#[stable(feature = "alloc_system_type", since = "1.28.0")]
116
unsafe impl GlobalAlloc for System {
127
#[inline]
138
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
14-
sys_malloc(layout.size(), layout.align())
9+
abi::malloc(layout.size(), layout.align())
1510
}
1611

1712
unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 {
18-
let addr = sys_malloc(layout.size(), layout.align());
13+
let addr = abi::malloc(layout.size(), layout.align());
1914

2015
if !addr.is_null() {
2116
ptr::write_bytes(
@@ -30,11 +25,11 @@ unsafe impl GlobalAlloc for System {
3025

3126
#[inline]
3227
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
33-
sys_free(ptr, layout.size(), layout.align())
28+
abi::free(ptr, layout.size(), layout.align())
3429
}
3530

3631
#[inline]
3732
unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 {
38-
sys_realloc(ptr, layout.size(), layout.align(), new_size)
33+
abi::realloc(ptr, layout.size(), layout.align(), new_size)
3934
}
4035
}

src/libstd/sys/hermit/condvar.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
use crate::cmp;
2+
use crate::sys::hermit::abi;
23
use crate::sys::mutex::Mutex;
34
use crate::time::Duration;
45

56
pub struct Condvar {
67
identifier: usize,
78
}
89

9-
extern "C" {
10-
fn sys_notify(id: usize, count: i32) -> i32;
11-
fn sys_add_queue(id: usize, timeout_ns: i64) -> i32;
12-
fn sys_wait(id: usize) -> i32;
13-
fn sys_destroy_queue(id: usize) -> i32;
14-
}
15-
1610
impl Condvar {
1711
pub const fn new() -> Condvar {
1812
Condvar { identifier: 0 }
@@ -24,19 +18,19 @@ impl Condvar {
2418
}
2519

2620
pub unsafe fn notify_one(&self) {
27-
let _ = sys_notify(self.id(), 1);
21+
let _ = abi::notify(self.id(), 1);
2822
}
2923

3024
#[inline]
3125
pub unsafe fn notify_all(&self) {
32-
let _ = sys_notify(self.id(), -1 /* =all */);
26+
let _ = abi::notify(self.id(), -1 /* =all */);
3327
}
3428

3529
pub unsafe fn wait(&self, mutex: &Mutex) {
3630
// add current task to the wait queue
37-
let _ = sys_add_queue(self.id(), -1 /* no timeout */);
31+
let _ = abi::add_queue(self.id(), -1 /* no timeout */);
3832
mutex.unlock();
39-
let _ = sys_wait(self.id());
33+
let _ = abi::wait(self.id());
4034
mutex.lock();
4135
}
4236

@@ -45,20 +39,20 @@ impl Condvar {
4539
let nanos = cmp::min(i64::max_value() as u128, nanos);
4640

4741
// add current task to the wait queue
48-
let _ = sys_add_queue(self.id(), nanos as i64);
42+
let _ = abi::add_queue(self.id(), nanos as i64);
4943

5044
mutex.unlock();
5145
// If the return value is !0 then a timeout happened, so we return
5246
// `false` as we weren't actually notified.
53-
let ret = sys_wait(self.id()) == 0;
47+
let ret = abi::wait(self.id()) == 0;
5448
mutex.lock();
5549

5650
ret
5751
}
5852

5953
#[inline]
6054
pub unsafe fn destroy(&self) {
61-
let _ = sys_destroy_queue(self.id());
55+
let _ = abi::destroy_queue(self.id());
6256
}
6357

6458
#[inline]

src/libstd/sys/hermit/fd.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,9 @@
33
use crate::io::{self, Read, ErrorKind};
44
use crate::mem;
55
use crate::sys::cvt;
6+
use crate::sys::hermit::abi;
67
use crate::sys_common::AsInner;
78

8-
extern {
9-
fn sys_read(fd: i32, buf: *mut u8, len: usize) -> isize;
10-
fn sys_write(fd: i32, buf: *const u8, len: usize) -> isize;
11-
fn sys_close(fd: i32) -> i32;
12-
}
13-
149
#[derive(Debug)]
1510
pub struct FileDesc {
1611
fd: i32,
@@ -31,7 +26,7 @@ impl FileDesc {
3126
}
3227

3328
pub fn read(&self, buf: &mut [u8]) -> io::Result<usize> {
34-
let result = unsafe { sys_read(self.fd, buf.as_mut_ptr(), buf.len()) };
29+
let result = unsafe { abi::read(self.fd, buf.as_mut_ptr(), buf.len()) };
3530
cvt(result as i32)
3631
}
3732

@@ -41,7 +36,7 @@ impl FileDesc {
4136
}
4237

4338
pub fn write(&self, buf: &[u8]) -> io::Result<usize> {
44-
let result = unsafe { sys_write(self.fd, buf.as_ptr(), buf.len()) };
39+
let result = unsafe { abi::write(self.fd, buf.as_ptr(), buf.len()) };
4540
cvt(result as i32)
4641
}
4742

@@ -82,6 +77,6 @@ impl Drop for FileDesc {
8277
// the file descriptor was closed or not, and if we retried (for
8378
// something like EINTR), we might close another valid file descriptor
8479
// (opened after we closed ours.
85-
let _ = unsafe { sys_close(self.fd) };
80+
let _ = unsafe { abi::close(self.fd) };
8681
}
8782
}

src/libstd/sys/hermit/fs.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,14 @@ use crate::io::{SeekFrom, IoSlice, IoSliceMut};
66
use crate::path::{Path, PathBuf};
77
use crate::sys::time::SystemTime;
88
use crate::sys::{unsupported, Void};
9+
use crate::sys::hermit::abi;
910
use crate::sys::hermit::fd::FileDesc;
1011
use crate::sys::cvt;
1112
use crate::sys_common::os_str_bytes::OsStrExt;
1213

1314
pub use crate::sys_common::fs::copy;
1415
//pub use crate::sys_common::fs::remove_dir_all;
1516

16-
extern {
17-
fn sys_open(name: *const i8, flags: i32, mode: i32) -> i32;
18-
fn sys_unlink(name: *const i8) -> i32;
19-
}
20-
2117
fn cstr(path: &Path) -> io::Result<CString> {
2218
Ok(CString::new(path.as_os_str().as_bytes())?)
2319
}
@@ -272,7 +268,7 @@ impl File {
272268
mode = 0;
273269
}
274270

275-
let fd = unsafe { cvt(sys_open(path.as_ptr(), flags, mode))? };
271+
let fd = unsafe { cvt(abi::open(path.as_ptr(), flags, mode))? };
276272
Ok(File(FileDesc::new(fd as i32)))
277273
}
278274

@@ -345,7 +341,7 @@ pub fn readdir(_p: &Path) -> io::Result<ReadDir> {
345341

346342
pub fn unlink(path: &Path) -> io::Result<()> {
347343
let name = cstr(path)?;
348-
let _ = unsafe { cvt(sys_unlink(name.as_ptr()))? };
344+
let _ = unsafe { cvt(abi::unlink(name.as_ptr()))? };
349345
Ok(())
350346
}
351347

src/libstd/sys/hermit/mod.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ pub mod fast_thread_local;
4242
pub use crate::sys_common::os_str_bytes as os_str;
4343
use crate::io::ErrorKind;
4444

45+
#[allow(unused_extern_crates)]
46+
pub extern crate hermit_abi as abi;
47+
4548
pub fn unsupported<T>() -> crate::io::Result<T> {
4649
Err(unsupported_err())
4750
}
@@ -74,11 +77,7 @@ pub extern "C" fn floor(x: f64) -> f64 {
7477
}
7578

7679
pub unsafe fn abort_internal() -> ! {
77-
extern "C" {
78-
fn sys_abort() ->!;
79-
}
80-
81-
sys_abort();
80+
abi::abort();
8281
}
8382

8483
// FIXME: just a workaround to test the system
@@ -108,15 +107,14 @@ pub unsafe extern "C" fn runtime_entry(argc: i32, argv: *const *const c_char,
108107
env: *const *const c_char) -> ! {
109108
extern "C" {
110109
fn main(argc: isize, argv: *const *const c_char) -> i32;
111-
fn sys_exit(arg: i32) ->!;
112110
}
113111

114112
// initialize environment
115113
os::init_environment(env as *const *const i8);
116114

117115
let result = main(argc as isize, argv);
118116

119-
sys_exit(result);
117+
abi::exit(result);
120118
}
121119

122120
pub fn decode_error_kind(errno: i32) -> ErrorKind {

src/libstd/sys/hermit/mutex.rs

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,6 @@
11
use crate::ptr;
22
use crate::ffi::c_void;
3-
4-
extern "C" {
5-
fn sys_sem_init(sem: *mut *const c_void, value: u32) -> i32;
6-
fn sys_sem_destroy(sem: *const c_void) -> i32;
7-
fn sys_sem_post(sem: *const c_void) -> i32;
8-
fn sys_sem_trywait(sem: *const c_void) -> i32;
9-
fn sys_sem_timedwait(sem: *const c_void, ms: u32) -> i32;
10-
fn sys_recmutex_init(recmutex: *mut *const c_void) -> i32;
11-
fn sys_recmutex_destroy(recmutex: *const c_void) -> i32;
12-
fn sys_recmutex_lock(recmutex: *const c_void) -> i32;
13-
fn sys_recmutex_unlock(recmutex: *const c_void) -> i32;
14-
}
3+
use crate::sys::hermit::abi;
154

165
pub struct Mutex {
176
inner: *const c_void
@@ -27,28 +16,28 @@ impl Mutex {
2716

2817
#[inline]
2918
pub unsafe fn init(&mut self) {
30-
let _ = sys_sem_init(&mut self.inner as *mut *const c_void, 1);
19+
let _ = abi::sem_init(&mut self.inner as *mut *const c_void, 1);
3120
}
3221

3322
#[inline]
3423
pub unsafe fn lock(&self) {
35-
let _ = sys_sem_timedwait(self.inner, 0);
24+
let _ = abi::sem_timedwait(self.inner, 0);
3625
}
3726

3827
#[inline]
3928
pub unsafe fn unlock(&self) {
40-
let _ = sys_sem_post(self.inner);
29+
let _ = abi::sem_post(self.inner);
4130
}
4231

4332
#[inline]
4433
pub unsafe fn try_lock(&self) -> bool {
45-
let result = sys_sem_trywait(self.inner);
34+
let result = abi::sem_trywait(self.inner);
4635
result == 0
4736
}
4837

4938
#[inline]
5039
pub unsafe fn destroy(&self) {
51-
let _ = sys_sem_destroy(self.inner);
40+
let _ = abi::sem_destroy(self.inner);
5241
}
5342
}
5443

@@ -63,12 +52,12 @@ impl ReentrantMutex {
6352

6453
#[inline]
6554
pub unsafe fn init(&mut self) {
66-
let _ = sys_recmutex_init(&mut self.inner as *mut *const c_void);
55+
let _ = abi::recmutex_init(&mut self.inner as *mut *const c_void);
6756
}
6857

6958
#[inline]
7059
pub unsafe fn lock(&self) {
71-
let _ = sys_recmutex_lock(self.inner);
60+
let _ = abi::recmutex_lock(self.inner);
7261
}
7362

7463
#[inline]
@@ -78,11 +67,11 @@ impl ReentrantMutex {
7867

7968
#[inline]
8069
pub unsafe fn unlock(&self) {
81-
let _ = sys_recmutex_unlock(self.inner);
70+
let _ = abi::recmutex_unlock(self.inner);
8271
}
8372

8473
#[inline]
8574
pub unsafe fn destroy(&self) {
86-
let _ = sys_recmutex_destroy(self.inner);
75+
let _ = abi::recmutex_destroy(self.inner);
8776
}
8877
}

src/libstd/sys/hermit/os.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ use crate::collections::HashMap;
1212
use crate::vec;
1313
use crate::sync::Mutex;
1414
use crate::sys_common::os_str_bytes::*;
15-
16-
extern "C" {
17-
fn sys_getpid() -> u32;
18-
fn sys_exit(arg: i32) ->!;
19-
}
15+
use crate::sys::hermit::abi;
2016

2117
pub fn errno() -> i32 {
2218
0
@@ -167,12 +163,12 @@ pub fn home_dir() -> Option<PathBuf> {
167163

168164
pub fn exit(code: i32) -> ! {
169165
unsafe {
170-
sys_exit(code);
166+
abi::exit(code);
171167
}
172168
}
173169

174170
pub fn getpid() -> u32 {
175171
unsafe {
176-
sys_getpid()
172+
abi::getpid()
177173
}
178174
}

0 commit comments

Comments
 (0)