Add the rust std as a custom sysroot
This commit is contained in:
104
library/std/src/sys/alloc/survos.rs
Normal file
104
library/std/src/sys/alloc/survos.rs
Normal file
@@ -0,0 +1,104 @@
|
||||
#![allow(fuzzy_provenance_casts)]
|
||||
|
||||
use crate::alloc::{GlobalAlloc, Layout, System};
|
||||
|
||||
#[stable(feature = "alloc_system_type", since = "1.28.0")]
|
||||
unsafe impl GlobalAlloc for System {
|
||||
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
|
||||
alloc(layout)
|
||||
}
|
||||
|
||||
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
|
||||
dealloc(ptr, layout)
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(u64)]
|
||||
enum SysCall {
|
||||
Read = 0,
|
||||
Write = 1,
|
||||
Open = 2,
|
||||
Close = 3,
|
||||
Seek = 8,
|
||||
Alloc = 40,
|
||||
Dealloc = 41,
|
||||
Spawn = 58,
|
||||
ExecVE = 59,
|
||||
Exit = 60,
|
||||
NanoSleep = 101,
|
||||
WriteIntTemp = 998,
|
||||
WriteTemp = 999,
|
||||
Unimplemented = 1 << 31,
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
unsafe fn _syscall(
|
||||
syscall: SysCall,
|
||||
mut a1: u64,
|
||||
mut a2: u64,
|
||||
mut a3: u64,
|
||||
mut a4: u64,
|
||||
mut a5: u64,
|
||||
mut a6: u64,
|
||||
mut a7: u64,
|
||||
) -> (u64, u64, u64, u64, u64, u64, u64, u64) {
|
||||
let mut a0 = syscall as u64;
|
||||
unsafe {
|
||||
core::arch::asm!(
|
||||
"ecall",
|
||||
inlateout("a0") a0,
|
||||
inlateout("a1") a1,
|
||||
inlateout("a2") a2,
|
||||
inlateout("a3") a3,
|
||||
inlateout("a4") a4,
|
||||
inlateout("a5") a5,
|
||||
inlateout("a6") a6,
|
||||
inlateout("a7") a7,
|
||||
clobber_abi("system")
|
||||
);
|
||||
}
|
||||
(a0, a1, a2, a3, a4, a5, a6, a7)
|
||||
}
|
||||
|
||||
macro_rules! syscall {
|
||||
($syscall:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr, $a6:expr, $a7:expr) => {
|
||||
_syscall($syscall, $a1, $a2, $a3, $a4, $a5, $a6, $a7)
|
||||
};
|
||||
($syscall:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr, $a6:expr) => {
|
||||
syscall!($syscall, $a1, $a2, $a3, $a4, $a5, $a6, 0)
|
||||
};
|
||||
($syscall:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr, $a5:expr) => {
|
||||
syscall!($syscall, $a1, $a2, $a3, $a4, $a5, 0)
|
||||
};
|
||||
($syscall:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {
|
||||
syscall!($syscall, $a1, $a2, $a3, $a4, 0)
|
||||
};
|
||||
($syscall:expr, $a1:expr, $a2:expr, $a3:expr) => {
|
||||
syscall!($syscall, $a1, $a2, $a3, 0)
|
||||
};
|
||||
($syscall:expr, $a1:expr, $a2:expr) => {
|
||||
syscall!($syscall, $a1, $a2, 0)
|
||||
};
|
||||
($syscall:expr, $a1:expr) => {
|
||||
syscall!($syscall, $a1, 0)
|
||||
};
|
||||
($syscall:expr) => {
|
||||
syscall!($syscall, 0)
|
||||
};
|
||||
}
|
||||
|
||||
fn alloc(layout: Layout) -> *mut u8 {
|
||||
unsafe {
|
||||
let size = layout.size();
|
||||
let align = layout.align();
|
||||
let (ptr, ..) = syscall!(SysCall::Alloc, size as u64, align as u64);
|
||||
ptr as *mut u8
|
||||
}
|
||||
}
|
||||
fn dealloc(ptr: *mut u8, layout: core::alloc::Layout) {
|
||||
unsafe {
|
||||
let size = layout.size();
|
||||
let align = layout.align();
|
||||
syscall!(SysCall::Dealloc, ptr as u64, size as u64, align as u64);
|
||||
}
|
||||
}
|
||||
11
library/std/src/sys/pal/survos.rs
Normal file
11
library/std/src/sys/pal/survos.rs
Normal file
@@ -0,0 +1,11 @@
|
||||
/// # Safety
|
||||
/// `argc` and `argv` are passed by the kernel
|
||||
#[unsafe(no_mangle)]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub unsafe extern "C" fn _start(argc: isize, argv: *const *const u8) -> isize {
|
||||
unsafe extern "C" {
|
||||
fn main(argc: isize, argv: *const *const u8) -> isize;
|
||||
}
|
||||
|
||||
unsafe { main(argc, argv) }
|
||||
}
|
||||
Reference in New Issue
Block a user