Replace removed syscalls with redox-rt stubs.

This commit is contained in:
4lDO2
2024-12-25 14:36:13 +01:00
parent 31570e99ab
commit 422a32690d
8 changed files with 110 additions and 61 deletions
+4
View File
@@ -15,3 +15,7 @@ plain = "0.2"
redox_syscall = "0.5.8"
generic-rt = { path = "../generic-rt" }
[features]
proc = []
default = ["proc"]
+17 -3
View File
@@ -63,7 +63,7 @@ impl RtTcb {
unsafe {
if (&*self.thr_fd.get()).is_none() {
self.thr_fd.get().write(Some(FdGuard::new(
syscall::open("/scheme/thisproc/current/open_via_dup", O_CLOEXEC).unwrap(),
syscall::open("/scheme/thisproc/current", O_CLOEXEC).unwrap(),
)));
}
(&*self.thr_fd.get()).as_ref().unwrap()
@@ -178,17 +178,31 @@ pub unsafe fn initialize_freestanding() {
initialize();
}
pub unsafe fn initialize() {
#[cfg(feature = "proc")]
// Find the PID attached to this process
let pid = todo!("getpid");
#[cfg(not(feature = "proc"))]
// Bootstrap mode, don't associate proc fds with PIDs
let pid = 0;
THIS_PID
.get()
.write(Some(syscall::getpid().unwrap().try_into().unwrap()).unwrap());
.write(Some(pid).unwrap());
}
static THIS_PID: SyncUnsafeCell<u32> = SyncUnsafeCell::new(0);
unsafe fn child_hook_common(new_pid_fd: FdGuard) {
// TODO: just pass PID to child rather than obtaining it via IPC?
#[cfg(feature = "proc")]
let pid = todo!("getpid");
#[cfg(not(feature = "proc"))]
let pid = 0;
// TODO: Currently pidfd == threadfd, but this will not be the case later.
RtTcb::current().thr_fd.get().write(Some(new_pid_fd));
THIS_PID
.get()
.write(Some(syscall::getpid().unwrap().try_into().unwrap()).unwrap());
.write(Some(pid).unwrap());
}
+5 -6
View File
@@ -74,8 +74,7 @@ where
{
// Here, we do the minimum part of loading an application, which is what the kernel used to do.
// We load the executable into memory (albeit at different offsets in this executable), fix
// some misalignments, and then execute the SYS_EXEC syscall to replace the program memory
// entirely.
// some misalignments, and then switch address space.
let mut header_bytes = [0_u8; size_of::<Header>()];
pread_all(*image_file, 0, &mut header_bytes)?;
@@ -695,10 +694,10 @@ pub fn fork_inner(initial_rsp: *mut usize) -> Result<usize> {
{
let cur_pid_fd = FdGuard::new(syscall::open(
"/scheme/thisproc/current/open_via_dup",
"/scheme/thisproc/current",
O_CLOEXEC,
)?);
(new_pid_fd, new_pid) = new_child_process()?;
(new_pid_fd, new_pid) = new_child_process(*cur_pid_fd)?;
copy_str(*cur_pid_fd, *new_pid_fd, "name")?;
@@ -823,10 +822,10 @@ pub fn fork_inner(initial_rsp: *mut usize) -> Result<usize> {
Ok(new_pid)
}
pub fn new_child_process() -> Result<(FdGuard, usize)> {
pub fn new_child_process(_cur_pid_fd: usize) -> Result<(FdGuard, usize)> {
// Create a new context (fields such as uid/gid will be inherited from the current context).
let fd = FdGuard::new(syscall::open(
"/scheme/thisproc/new/open_via_dup",
"/scheme/thisproc/new",
O_CLOEXEC,
)?);
+4 -2
View File
@@ -152,7 +152,8 @@ unsafe fn inner(stack: &mut SigStack) {
panic!("ctl {:x?} signal {}", os.control, stack.sig_num)
}
SigactionKind::Default => {
syscall::exit(stack.sig_num as usize);
//syscall::exit(stack.sig_num as usize);
todo!("exit");
unreachable!();
}
SigactionKind::Handled { handler } => handler,
@@ -497,7 +498,8 @@ bitflags::bitflags! {
const STORED_FLAGS: u32 = 0xfe00_0000;
fn default_handler(sig: c_int) {
syscall::exit(sig as usize);
//syscall::exit(sig as usize);
todo!("exit")
}
#[derive(Clone, Copy)]
+47 -5
View File
@@ -43,7 +43,7 @@ pub fn posix_write(fd: usize, buf: &[u8]) -> Result<usize> {
}
#[inline]
pub fn posix_kill(pid: usize, sig: usize) -> Result<()> {
match wrapper(false, || syscall::kill(pid, sig)) {
match wrapper(false, || Ok(todo!("kill"))) {
Ok(_) | Err(Error { errno: EINTR }) => Ok(()),
Err(error) => Err(error),
}
@@ -57,7 +57,8 @@ pub fn posix_sigqueue(pid: usize, sig: usize, arg: usize) -> Result<()> {
pid: posix_getpid(),
};
match wrapper(false, || unsafe {
syscall::syscall3(syscall::SYS_SIGENQUEUE, pid, sig, addr_of!(siginf) as usize)
//syscall::syscall3(syscall::SYS_SIGENQUEUE, pid, sig, addr_of!(siginf) as usize)
Ok(todo!("sigenqueue"))
}) {
Ok(_) | Err(Error { errno: EINTR }) => Ok(()),
Err(error) => Err(error),
@@ -70,7 +71,10 @@ pub fn posix_getpid() -> u32 {
}
#[inline]
pub fn posix_killpg(pgrp: usize, sig: usize) -> Result<()> {
match wrapper(false, || syscall::kill(usize::wrapping_neg(pgrp), sig)) {
match wrapper(false, ||
//syscall::kill(usize::wrapping_neg(pgrp), sig)
Ok(todo!("killpg"))
) {
Ok(_) | Err(Error { errno: EINTR }) => Ok(()),
Err(error) => Err(error),
}
@@ -103,11 +107,12 @@ pub unsafe fn sys_futex_wake(addr: *mut u32, num: u32) -> Result<u32> {
}
pub fn sys_waitpid(pid: usize, status: &mut usize, flags: usize) -> Result<usize> {
wrapper(true, || {
syscall::waitpid(
/*syscall::waitpid(
pid,
status,
syscall::WaitFlags::from_bits(flags).expect("waitpid: invalid bit pattern"),
)
)*/
todo!("waitpid")
})
}
pub fn posix_kill_thread(thread_fd: usize, signal: u32) -> Result<()> {
@@ -134,3 +139,40 @@ pub fn swap_umask(mask: u32) -> u32 {
pub fn get_umask() -> u32 {
UMASK.load(Ordering::Acquire)
}
pub fn posix_setresuid(ruid: Option<u32>, euid: Option<u32>, suid: Option<u32>) -> Result<()> {
todo!("posix_setresuid")
}
pub fn posix_setresgid(rgid: Option<u32>, egid: Option<u32>, sgid: Option<u32>) -> Result<()> {
todo!("posix_setresgid")
}
pub fn posix_getruid() -> u32 {
todo!("posix_getruid")
}
pub fn posix_getrgid() -> u32 {
todo!("posix_getrgid")
}
pub fn posix_geteuid() -> u32 {
todo!("posix_geteuid")
}
pub fn posix_getegid() -> u32 {
todo!("posix_getegid")
}
pub fn posix_getppid() -> usize {
todo!("posix_getppid")
}
pub fn posix_exit(status: i32) -> ! {
todo!("posix_exit")
}
pub fn setrens(rns: usize, ens: usize) -> Result<()> {
todo!("setrens")
}
pub fn posix_getpgid(pid: usize) -> Result<usize> {
todo!("posix_getpgid")
}
pub fn posix_setpgid(pid: usize, pgid: usize) -> Result<()> {
todo!("posix_setpgid")
}
pub fn posix_getsid(pid: usize) -> Result<usize> {
todo!("posix_getsid")
}
+2 -2
View File
@@ -119,8 +119,8 @@ pub fn execve(
let mut stat = Stat::default();
syscall::fstat(*image_file as usize, &mut stat)?;
let uid = syscall::getuid()?;
let gid = syscall::getuid()?;
let uid = redox_rt::sys::posix_getruid() as usize;
let gid = redox_rt::sys::posix_getrgid() as usize;
let mode = if uid == stat.st_uid as usize {
(stat.st_mode >> 3 * 2) & 0o7
+9 -9
View File
@@ -219,36 +219,36 @@ pub unsafe extern "C" fn redox_close_v1(fd: usize) -> RawResult {
#[no_mangle]
pub unsafe extern "C" fn redox_get_pid_v1() -> RawResult {
Error::mux(syscall::getpid())
redox_rt::sys::posix_getpid() as _
}
#[no_mangle]
pub unsafe extern "C" fn redox_get_euid_v1() -> RawResult {
Error::mux(syscall::geteuid())
redox_rt::sys::posix_geteuid() as _
}
#[no_mangle]
pub unsafe extern "C" fn redox_get_ruid_v1() -> RawResult {
Error::mux(syscall::getuid())
redox_rt::sys::posix_getruid() as _
}
#[no_mangle]
pub unsafe extern "C" fn redox_get_egid_v1() -> RawResult {
Error::mux(syscall::getegid())
redox_rt::sys::posix_getegid() as _
}
#[no_mangle]
pub unsafe extern "C" fn redox_get_rgid_v1() -> RawResult {
Error::mux(syscall::getgid())
redox_rt::sys::posix_getrgid() as _
}
#[no_mangle]
pub unsafe extern "C" fn redox_setrens_v1(rns: usize, ens: usize) -> RawResult {
Error::mux(syscall::setrens(rns, ens))
Error::mux(redox_rt::sys::setrens(rns, ens).map(|()| 0))
}
#[no_mangle]
pub unsafe extern "C" fn redox_waitpid_v1(pid: usize, status: *mut i32, options: u32) -> RawResult {
let mut sts = 0_usize;
let res = Error::mux(syscall::waitpid(
let res = Error::mux(redox_rt::sys::sys_waitpid(
pid,
&mut sts,
WaitFlags::from_bits_truncate(options as usize),
WaitFlags::from_bits_truncate(options as usize).bits(),
));
status.write(sts as i32);
res
@@ -256,7 +256,7 @@ pub unsafe extern "C" fn redox_waitpid_v1(pid: usize, status: *mut i32, options:
#[no_mangle]
pub unsafe extern "C" fn redox_kill_v1(pid: usize, signal: u32) -> RawResult {
Error::mux(syscall::kill(pid, signal as usize))
Error::mux(redox_rt::sys::posix_kill(pid, signal as usize).map(|()| 0))
}
#[no_mangle]
+22 -34
View File
@@ -50,6 +50,13 @@ fn round_up_to_page_size(val: usize) -> Option<usize> {
.map(|val| (val - 1) / PAGE_SIZE * PAGE_SIZE)
}
fn cvt_uid(id: c_int) -> Result<Option<u32>> {
if id == -1 {
return Ok(None);
}
Ok(Some(id.try_into().map_err(|_| Errno(EINVAL))?))
}
mod clone;
mod epoll;
mod event;
@@ -93,8 +100,8 @@ impl Pal for Sys {
syscall::fstat(*fd as usize, &mut stat)?;
let uid = syscall::getuid()?;
let gid = syscall::getgid()?;
let uid = redox_rt::sys::posix_getruid() as usize;
let gid = redox_rt::sys::posix_getrgid() as usize;
let perms = if stat.st_uid as usize == uid {
stat.st_mode >> (3 * 2 & 0o7)
@@ -199,7 +206,7 @@ impl Pal for Sys {
}
fn exit(status: c_int) -> ! {
let _ = syscall::exit((status as usize) << 8);
let _ = redox_rt::sys::posix_exit(status);
loop {}
}
@@ -401,15 +408,15 @@ impl Pal for Sys {
}
fn getegid() -> gid_t {
syscall::getegid().unwrap() as gid_t
redox_rt::sys::posix_getegid() as gid_t
}
fn geteuid() -> uid_t {
syscall::geteuid().unwrap() as uid_t
redox_rt::sys::posix_geteuid() as uid_t
}
fn getgid() -> gid_t {
syscall::getgid().unwrap() as gid_t
redox_rt::sys::posix_getrgid() as gid_t
}
unsafe fn getgroups(size: c_int, list: *mut gid_t) -> Result<c_int> {
@@ -423,7 +430,7 @@ impl Pal for Sys {
}
fn getpgid(pid: pid_t) -> Result<pid_t> {
Ok(syscall::getpgid(pid as usize)? as pid_t)
Ok(redox_rt::sys::posix_getpgid(pid as usize)? as pid_t)
}
fn getpid() -> pid_t {
@@ -431,7 +438,7 @@ impl Pal for Sys {
}
fn getppid() -> pid_t {
syscall::getppid().unwrap() as pid_t
redox_rt::sys::posix_getppid() as pid_t
}
fn getpriority(which: c_int, who: id_t) -> Result<c_int> {
@@ -487,17 +494,7 @@ impl Pal for Sys {
}
fn getsid(pid: pid_t) -> Result<pid_t> {
let mut buf = [0; mem::size_of::<usize>()];
let path = if pid == 0 {
format!("/scheme/thisproc/current/session_id")
} else {
format!("/scheme/proc/{}/session_id", pid)
};
let path_c = CString::new(path).unwrap();
let mut file = File::open(CStr::borrow(&path_c), fcntl::O_RDONLY | fcntl::O_CLOEXEC)?;
file.read(&mut buf)
.map_err(|err| Errno(err.raw_os_error().unwrap_or(EIO)))?;
Ok(usize::from_ne_bytes(buf).try_into().unwrap())
Ok(redox_rt::sys::posix_getsid(pid as usize)? as _)
}
fn gettid() -> pid_t {
@@ -527,7 +524,7 @@ impl Pal for Sys {
}
fn getuid() -> uid_t {
syscall::getuid().unwrap() as pid_t
redox_rt::sys::posix_getruid() as uid_t
}
fn lchown(path: CStr, owner: uid_t, group: gid_t) -> Result<()> {
@@ -838,8 +835,7 @@ impl Pal for Sys {
}
fn setpgid(pid: pid_t, pgid: pid_t) -> Result<()> {
syscall::setpgid(pid as usize, pgid as usize)?;
Ok(())
Ok(redox_rt::sys::posix_setpgid(pid as usize, pgid as usize)?)
}
fn setpriority(which: c_int, who: id_t, prio: c_int) -> Result<()> {
@@ -864,19 +860,11 @@ impl Pal for Sys {
}
fn setresgid(rgid: gid_t, egid: gid_t, sgid: gid_t) -> Result<()> {
if sgid != -1 {
println!("TODO: suid");
}
syscall::setregid(rgid as usize, egid as usize)?;
Ok(())
Ok(redox_rt::sys::posix_setresgid(cvt_uid(rgid)?, cvt_uid(egid)?, cvt_uid(sgid)?)?)
}
fn setresuid(ruid: uid_t, euid: uid_t, suid: uid_t) -> Result<()> {
if suid != -1 {
println!("TODO: suid");
}
syscall::setreuid(ruid as usize, euid as usize)?;
Ok(())
Ok(redox_rt::sys::posix_setresuid(cvt_uid(ruid)?, cvt_uid(euid)?, cvt_uid(suid)?)?)
}
fn symlink(path1: CStr, path2: CStr) -> Result<()> {
@@ -1057,8 +1045,8 @@ impl Pal for Sys {
}
fn verify() -> bool {
// GETPID on Redox is 20, which is WRITEV on Linux
(unsafe { syscall::syscall5(syscall::number::SYS_GETPID, !0, !0, !0, !0, !0) }).is_ok()
// YIELD on Redox is 20, which is SYS_ARCH_PRCTL on Linux
(unsafe { syscall::syscall5(syscall::number::SYS_YIELD, !0, !0, !0, !0, !0) }).is_ok()
}
unsafe fn exit_thread(stack_base: *mut (), stack_size: usize) -> ! {