Compare commits

...

3 Commits

6 changed files with 143 additions and 0 deletions
+31
View File
@@ -95,6 +95,14 @@ pub struct IntRegisters {
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 {
type Target = [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)]
#[repr(C, packed)]
pub struct EnvRegisters {
+31
View File
@@ -96,6 +96,14 @@ pub struct IntRegisters {
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 {
type Target = [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)]
#[repr(packed)]
pub struct EnvRegisters {
+31
View File
@@ -164,6 +164,14 @@ pub struct IntRegisters {
// 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 {
type Target = [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)]
#[repr(C, packed)]
pub struct EnvRegisters {
+31
View File
@@ -81,6 +81,14 @@ pub struct IntRegisters {
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 {
type Target = [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)]
#[repr(C, packed)]
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
pub fn fsync(fd: usize) -> Result<usize> {
unsafe { syscall1(SYS_FSYNC, fd) }
+7
View File
@@ -37,6 +37,11 @@ pub const SYS_LSEEK: usize = SYS_CLASS_FILE | 19;
pub const SYS_FCHOWN: usize = SYS_CLASS_FILE | 207;
pub const SYS_FCNTL: usize = SYS_CLASS_FILE | 55;
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;
// 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)
@@ -53,6 +58,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_FSTAT: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 28;
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_FUTEX: usize = 240;