Compare commits

..

5 Commits

Author SHA1 Message Date
vasilito c8bc43a5ef syscall: data and flag module updates 2026-07-10 22:51:32 +03:00
vasilito 20dd16542c syscall: add SYS_SETNS syscall number
Red Bear OS needs SYS_SETNS for the init process to enter a null
namespace before its waitpid loop (used by redox_setrens_v1).
SYS_MKNS was already defined; this adds the matching SETNS.
2026-07-10 16:13:15 +03:00
vasilito 8e4643c9de syscall: add SYS_SYNC and SYS_SYNCFS numbers 2026-07-09 11:25:04 +03:00
vasilito 9fad5e653c syscall: add FullContextRegs arch types for /proc/{pid}/ctx 2026-07-08 17:57:54 +03:00
vasilito c59951c038 Add missing syscall numbers and wrapper 2026-07-08 00:58:27 +03:00
8 changed files with 182 additions and 0 deletions
+31
View File
@@ -95,6 +95,14 @@ pub struct IntRegisters {
pub x0: usize, pub x0: usize,
} }
#[derive(Clone, Copy, Debug, Default)]
#[repr(C)]
pub struct FullContextRegs {
pub int: IntRegisters,
pub float: FloatRegisters,
pub env: EnvRegisters,
}
impl Deref for IntRegisters { impl Deref for IntRegisters {
type Target = [u8]; type Target = [u8];
fn deref(&self) -> &[u8] { fn deref(&self) -> &[u8] {
@@ -149,6 +157,29 @@ impl DerefMut for FloatRegisters {
} }
} }
impl Deref for FullContextRegs {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe {
slice::from_raw_parts(
self as *const FullContextRegs as *const u8,
mem::size_of::<FullContextRegs>(),
)
}
}
}
impl DerefMut for FullContextRegs {
fn deref_mut(&mut self) -> &mut [u8] {
unsafe {
slice::from_raw_parts_mut(
self as *mut FullContextRegs as *mut u8,
mem::size_of::<FullContextRegs>(),
)
}
}
}
#[derive(Clone, Copy, Debug, Default)] #[derive(Clone, Copy, Debug, Default)]
#[repr(C, packed)] #[repr(C, packed)]
pub struct EnvRegisters { pub struct EnvRegisters {
+31
View File
@@ -96,6 +96,14 @@ pub struct IntRegisters {
pub x1: usize, pub x1: usize,
} }
#[derive(Clone, Copy, Debug, Default)]
#[repr(C)]
pub struct FullContextRegs {
pub int: IntRegisters,
pub float: FloatRegisters,
pub env: EnvRegisters,
}
impl Deref for IntRegisters { impl Deref for IntRegisters {
type Target = [u8]; type Target = [u8];
fn deref(&self) -> &[u8] { fn deref(&self) -> &[u8] {
@@ -149,6 +157,29 @@ impl DerefMut for FloatRegisters {
} }
} }
impl Deref for FullContextRegs {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe {
slice::from_raw_parts(
self as *const FullContextRegs as *const u8,
mem::size_of::<FullContextRegs>(),
)
}
}
}
impl DerefMut for FullContextRegs {
fn deref_mut(&mut self) -> &mut [u8] {
unsafe {
slice::from_raw_parts_mut(
self as *mut FullContextRegs as *mut u8,
mem::size_of::<FullContextRegs>(),
)
}
}
}
#[derive(Clone, Copy, Debug, Default)] #[derive(Clone, Copy, Debug, Default)]
#[repr(packed)] #[repr(packed)]
pub struct EnvRegisters { pub struct EnvRegisters {
+31
View File
@@ -164,6 +164,14 @@ pub struct IntRegisters {
// pub gs: usize // pub gs: usize
} }
#[derive(Clone, Copy, Debug, Default)]
#[repr(C)]
pub struct FullContextRegs {
pub int: IntRegisters,
pub float: FloatRegisters,
pub env: EnvRegisters,
}
impl Deref for IntRegisters { impl Deref for IntRegisters {
type Target = [u8]; type Target = [u8];
fn deref(&self) -> &[u8] { fn deref(&self) -> &[u8] {
@@ -227,6 +235,29 @@ impl DerefMut for FloatRegisters {
} }
} }
impl Deref for FullContextRegs {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe {
slice::from_raw_parts(
self as *const FullContextRegs as *const u8,
mem::size_of::<FullContextRegs>(),
)
}
}
}
impl DerefMut for FullContextRegs {
fn deref_mut(&mut self) -> &mut [u8] {
unsafe {
slice::from_raw_parts_mut(
self as *mut FullContextRegs as *mut u8,
mem::size_of::<FullContextRegs>(),
)
}
}
}
#[derive(Clone, Copy, Debug, Default)] #[derive(Clone, Copy, Debug, Default)]
#[repr(C, packed)] #[repr(C, packed)]
pub struct EnvRegisters { pub struct EnvRegisters {
+31
View File
@@ -81,6 +81,14 @@ pub struct IntRegisters {
pub ss: usize, pub ss: usize,
} }
#[derive(Clone, Copy, Debug, Default)]
#[repr(C)]
pub struct FullContextRegs {
pub int: IntRegisters,
pub float: FloatRegisters,
pub env: EnvRegisters,
}
impl Deref for IntRegisters { impl Deref for IntRegisters {
type Target = [u8]; type Target = [u8];
fn deref(&self) -> &[u8] { fn deref(&self) -> &[u8] {
@@ -133,6 +141,29 @@ impl DerefMut for FloatRegisters {
} }
} }
} }
impl Deref for FullContextRegs {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe {
slice::from_raw_parts(
self as *const FullContextRegs as *const u8,
mem::size_of::<FullContextRegs>(),
)
}
}
}
impl DerefMut for FullContextRegs {
fn deref_mut(&mut self) -> &mut [u8] {
unsafe {
slice::from_raw_parts_mut(
self as *mut FullContextRegs as *mut u8,
mem::size_of::<FullContextRegs>(),
)
}
}
}
#[derive(Clone, Copy, Debug, Default)] #[derive(Clone, Copy, Debug, Default)]
#[repr(C, packed)] #[repr(C, packed)]
pub struct EnvRegisters { pub struct EnvRegisters {
+12
View File
@@ -101,6 +101,18 @@ pub fn fstat(fd: usize, stat: &mut Stat) -> Result<usize> {
} }
} }
/// Get filesystem metadata about a file descriptor
pub fn fstatvfs(fd: usize, stat: &mut Stat) -> Result<usize> {
unsafe {
syscall3(
SYS_FSTATVFS,
fd,
stat as *mut Stat as usize,
mem::size_of::<Stat>(),
)
}
}
/// Sync a file descriptor to its underlying medium /// Sync a file descriptor to its underlying medium
pub fn fsync(fd: usize) -> Result<usize> { pub fn fsync(fd: usize) -> Result<usize> {
unsafe { syscall1(SYS_FSYNC, fd) } unsafe { syscall1(SYS_FSYNC, fd) }
+32
View File
@@ -224,6 +224,38 @@ pub struct TimeSpec {
pub tv_nsec: i32, pub tv_nsec: i32,
} }
#[derive(Copy, Clone, Debug, Default)]
#[repr(C)]
pub struct FutexWaitv {
pub uaddr: usize,
pub val: usize,
pub flags: u32,
pub __reserved: u32,
}
impl Deref for FutexWaitv {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe {
slice::from_raw_parts(
self as *const FutexWaitv as *const u8,
mem::size_of::<FutexWaitv>(),
)
}
}
}
impl DerefMut for FutexWaitv {
fn deref_mut(&mut self) -> &mut [u8] {
unsafe {
slice::from_raw_parts_mut(
self as *mut FutexWaitv as *mut u8,
mem::size_of::<FutexWaitv>(),
)
}
}
}
const NANOS_PER_SEC: u128 = 1_000_000_000; const NANOS_PER_SEC: u128 = 1_000_000_000;
impl TimeSpec { impl TimeSpec {
+2
View File
@@ -63,6 +63,8 @@ pub const FUTEX_WAIT: usize = 0;
pub const FUTEX_WAKE: usize = 1; pub const FUTEX_WAKE: usize = 1;
pub const FUTEX_REQUEUE: usize = 2; pub const FUTEX_REQUEUE: usize = 2;
pub const FUTEX_WAIT64: usize = 3; pub const FUTEX_WAIT64: usize = 3;
/// Wait on multiple futexes atomically and return the index of the first one woken.
pub const FUTEX_WAIT_MULTIPLE: usize = 4;
// TODO: Split SendFdFlags into caller flags and flags that the scheme receives? // TODO: Split SendFdFlags into caller flags and flags that the scheme receives?
bitflags::bitflags! { bitflags::bitflags! {
+12
View File
@@ -37,6 +37,16 @@ pub const SYS_LSEEK: usize = SYS_CLASS_FILE | 19;
pub const SYS_FCHOWN: usize = SYS_CLASS_FILE | 207; pub const SYS_FCHOWN: usize = SYS_CLASS_FILE | 207;
pub const SYS_FCNTL: usize = SYS_CLASS_FILE | 55; pub const SYS_FCNTL: usize = SYS_CLASS_FILE | 55;
pub const SYS_FEVENT: usize = SYS_CLASS_FILE | 927; pub const SYS_FEVENT: usize = SYS_CLASS_FILE | 927;
pub const SYS_GETDENTS: usize = SYS_CLASS_FILE | 0x1B2;
pub const SYS_FTRUNCATE: usize = SYS_CLASS_FILE | 0x1B3;
pub const SYS_FUTIMENS: usize = SYS_CLASS_FILE | 0x1B4;
pub const SYS_FSTATVFS: usize = SYS_CLASS_FILE | 0x1B5;
pub const SYS_MKNS: usize = SYS_CLASS_FILE | 0x1B6;
/// Red Bear: set current namespace to the one referenced by `fd`.
/// `SYS_SETNS = SYS_CLASS_FILE | 0x1B7`. Pairs with `SYS_MKNS` for the
/// `redox_setrens_v1` / `redox-rt::sys::mkns` + `setns` pair that init uses
/// to enter a "null namespace" before its waitpid loop.
pub const SYS_SETNS: usize = SYS_CLASS_FILE | 0x1B7;
// SYS_CALL, fd, inout buf ptr, inout buf len, flags, metadata buf ptr, metadata buf len // SYS_CALL, fd, inout buf ptr, inout buf len, flags, metadata buf ptr, metadata buf len
// TODO: new number for SYS_CALL where flags are sent as 6th argument (using syscall6) // TODO: new number for SYS_CALL where flags are sent as 6th argument (using syscall6)
@@ -53,6 +63,8 @@ pub const SYS_FPATH: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 928;
pub const SYS_FRENAME: usize = SYS_CLASS_FILE | SYS_ARG_PATH | 38; pub const SYS_FRENAME: usize = SYS_CLASS_FILE | SYS_ARG_PATH | 38;
pub const SYS_FSTAT: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 28; pub const SYS_FSTAT: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 28;
pub const SYS_FSYNC: usize = SYS_CLASS_FILE | 118; pub const SYS_FSYNC: usize = SYS_CLASS_FILE | 118;
pub const SYS_SYNC: usize = SYS_CLASS_FILE | 119;
pub const SYS_SYNCFS: usize = SYS_CLASS_FILE | 120;
pub const SYS_CLOCK_GETTIME: usize = 265; pub const SYS_CLOCK_GETTIME: usize = 265;
pub const SYS_FUTEX: usize = 240; pub const SYS_FUTEX: usize = 240;