Get Linux to compile again

This commit is contained in:
Jeremy Soller
2022-07-27 10:10:41 -06:00
parent aa2397ce29
commit dc865148fc
3 changed files with 25 additions and 11 deletions
+2
View File
@@ -1,3 +1,5 @@
use core::arch::global_asm;
// Needs to be defined in assembly because it can't have a function prologue
// rax is register, 15 is RT_SIGRETURN
#[cfg(target_arch = "x86_64")]
+20 -11
View File
@@ -1,4 +1,4 @@
use core::ptr;
use core::{arch::asm, ptr};
use core_io::Write;
use super::{errno, types::*, Pal};
@@ -280,7 +280,7 @@ impl Pal for Sys {
}
fn lchown(path: &CStr, owner: uid_t, group: gid_t) -> c_int {
e(unsafe { syscall!(LCHOWN, path.as_ptr(), owner, group) })
e(unsafe { syscall!(LCHOWN, path.as_ptr(), owner, group) }) as c_int
}
fn link(path1: &CStr, path2: &CStr) -> c_int {
@@ -363,13 +363,13 @@ impl Pal for Sys {
unsafe fn pte_clone(stack: *mut usize) -> pid_t {
let flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD;
let pid;
llvm_asm!("
asm!("
# Call clone syscall
syscall
# Check if child or parent
test rax, rax
jnz .parent
jnz 1f
# Load registers
pop rax
@@ -392,13 +392,22 @@ impl Pal for Sys {
ud2
# Return PID if parent
.parent:
"
: "={rax}"(pid)
: "{rax}"(SYS_CLONE), "{rdi}"(flags), "{rsi}"(stack), "{rdx}"(0), "{r10}"(0), "{r8}"(0)
: "memory", "rbx", "rcx", "rdx", "rsi", "rdi", "r8",
"r9", "r10", "r11", "r12", "r13", "r14", "r15"
: "intel", "volatile"
1:
",
inout("rax") SYS_CLONE => pid,
inout("rdi") flags => _,
inout("rsi") stack => _,
inout("rdx") 0 => _,
inout("r10") 0 => _,
inout("r8") 0 => _,
//TODO: out("rbx") _,
out("rcx") _,
out("r9") _,
out("r11") _,
out("r12") _,
out("r13") _,
out("r14") _,
out("r15") _,
);
e(pid) as pid_t
}
+3
View File
@@ -127,6 +127,8 @@ fn io_init() {
stdio::stderr = stdio::default_stderr.get();
}
}
#[cfg(target_os = "redox")]
fn setup_sigstack() {
use syscall::{Map, MapFlags};
const SIGSTACK_SIZE: usize = 1024 * 256;
@@ -185,6 +187,7 @@ pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! {
}
// Setup signal stack, otherwise we cannot handle any signals besides SIG_IGN/SIG_DFL behavior.
#[cfg(target_os = "redox")]
setup_sigstack();
init_array();