|
@@ -2,12 +2,15 @@ use crate::{
|
|
|
kernel::{
|
|
kernel::{
|
|
|
constants::{CLOCK_MONOTONIC, CLOCK_REALTIME, EINVAL},
|
|
constants::{CLOCK_MONOTONIC, CLOCK_REALTIME, EINVAL},
|
|
|
task::Thread,
|
|
task::Thread,
|
|
|
- timer::ticks,
|
|
|
|
|
|
|
+ timer::{Instant, Ticks},
|
|
|
user::UserPointerMut,
|
|
user::UserPointerMut,
|
|
|
},
|
|
},
|
|
|
prelude::*,
|
|
prelude::*,
|
|
|
};
|
|
};
|
|
|
-use posix_types::syscall_no::*;
|
|
|
|
|
|
|
+use posix_types::{
|
|
|
|
|
+ stat::{TimeSpec, TimeVal},
|
|
|
|
|
+ syscall_no::*,
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
#[derive(Clone, Copy)]
|
|
#[derive(Clone, Copy)]
|
|
|
struct NewUTSName {
|
|
struct NewUTSName {
|
|
@@ -54,20 +57,6 @@ fn newuname(buffer: *mut NewUTSName) -> KResult<()> {
|
|
|
buffer.write(uname)
|
|
buffer.write(uname)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[allow(dead_code)]
|
|
|
|
|
-#[derive(Default, Clone, Copy)]
|
|
|
|
|
-pub struct TimeVal {
|
|
|
|
|
- sec: u64,
|
|
|
|
|
- usec: u64,
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-#[allow(dead_code)]
|
|
|
|
|
-#[derive(Clone, Copy)]
|
|
|
|
|
-pub struct TimeSpec {
|
|
|
|
|
- sec: u64,
|
|
|
|
|
- nsec: u64,
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
#[eonix_macros::define_syscall(SYS_GETTIMEOFDAY)]
|
|
#[eonix_macros::define_syscall(SYS_GETTIMEOFDAY)]
|
|
|
fn gettimeofday(timeval: *mut TimeVal, timezone: *mut ()) -> KResult<()> {
|
|
fn gettimeofday(timeval: *mut TimeVal, timezone: *mut ()) -> KResult<()> {
|
|
|
if !timezone.is_null() {
|
|
if !timezone.is_null() {
|
|
@@ -76,10 +65,12 @@ fn gettimeofday(timeval: *mut TimeVal, timezone: *mut ()) -> KResult<()> {
|
|
|
|
|
|
|
|
if !timeval.is_null() {
|
|
if !timeval.is_null() {
|
|
|
let timeval = UserPointerMut::new(timeval)?;
|
|
let timeval = UserPointerMut::new(timeval)?;
|
|
|
- let ticks = ticks();
|
|
|
|
|
|
|
+ let now = Instant::now();
|
|
|
|
|
+ let since_epoch = now.since_epoch();
|
|
|
|
|
+
|
|
|
timeval.write(TimeVal {
|
|
timeval.write(TimeVal {
|
|
|
- sec: ticks.in_secs() as u64,
|
|
|
|
|
- usec: ticks.in_usecs() as u64 % 1_000_000,
|
|
|
|
|
|
|
+ tv_sec: since_epoch.as_secs(),
|
|
|
|
|
+ tv_usec: since_epoch.subsec_micros(),
|
|
|
})?;
|
|
})?;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -92,10 +83,12 @@ fn do_clock_gettime64(_thread: &Thread, clock_id: u32, timespec: *mut TimeSpec)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
let timespec = UserPointerMut::new(timespec)?;
|
|
let timespec = UserPointerMut::new(timespec)?;
|
|
|
- let ticks = ticks();
|
|
|
|
|
|
|
+ let now = Instant::now();
|
|
|
|
|
+ let since_epoch = now.since_epoch();
|
|
|
|
|
+
|
|
|
timespec.write(TimeSpec {
|
|
timespec.write(TimeSpec {
|
|
|
- sec: ticks.in_secs() as u64,
|
|
|
|
|
- nsec: ticks.in_nsecs() as u64 % 1_000_000_000,
|
|
|
|
|
|
|
+ tv_sec: since_epoch.as_secs(),
|
|
|
|
|
+ tv_nsec: since_epoch.subsec_nanos(),
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -133,7 +126,7 @@ struct Sysinfo {
|
|
|
fn sysinfo(info: *mut Sysinfo) -> KResult<()> {
|
|
fn sysinfo(info: *mut Sysinfo) -> KResult<()> {
|
|
|
let info = UserPointerMut::new(info)?;
|
|
let info = UserPointerMut::new(info)?;
|
|
|
info.write(Sysinfo {
|
|
info.write(Sysinfo {
|
|
|
- uptime: ticks().in_secs() as u32,
|
|
|
|
|
|
|
+ uptime: Ticks::since_boot().as_secs() as u32,
|
|
|
loads: [0; 3],
|
|
loads: [0; 3],
|
|
|
totalram: 100,
|
|
totalram: 100,
|
|
|
freeram: 50,
|
|
freeram: 50,
|