diff --git a/kernel/include/kernel/Timer/Timer.h b/kernel/include/kernel/Timer/Timer.h index 7cdd6623..f3058925 100644 --- a/kernel/include/kernel/Timer/Timer.h +++ b/kernel/include/kernel/Timer/Timer.h @@ -25,10 +25,9 @@ namespace Kernel virtual uint64_t ms_since_boot() const override; virtual timespec time_since_boot() const override; - void sleep(uint64_t) const; + void sleep(uint64_t ms) const; - uint64_t get_unix_timestamp() const; - timespec get_real_time() const; + timespec real_time() const; private: SystemTimer() = default; diff --git a/kernel/kernel/FS/Ext2.cpp b/kernel/kernel/FS/Ext2.cpp index f7a939e9..49378350 100644 --- a/kernel/kernel/FS/Ext2.cpp +++ b/kernel/kernel/FS/Ext2.cpp @@ -384,16 +384,16 @@ namespace Kernel if (error_or.error().get_error_code() != ENOENT) return error_or.error(); - uint64_t current_time = SystemTimer::get().get_unix_timestamp(); + timespec current_time = SystemTimer::get().real_time(); Ext2::Inode ext2_inode; ext2_inode.mode = mode; ext2_inode.uid = uid; ext2_inode.size = 0; - ext2_inode.atime = current_time; - ext2_inode.ctime = current_time; - ext2_inode.mtime = current_time; - ext2_inode.dtime = current_time; + ext2_inode.atime = current_time.tv_sec; + ext2_inode.ctime = current_time.tv_sec; + ext2_inode.mtime = current_time.tv_sec; + ext2_inode.dtime = current_time.tv_sec; ext2_inode.gid = gid; ext2_inode.links_count = 1; ext2_inode.blocks = 0; diff --git a/kernel/kernel/FS/Pipe.cpp b/kernel/kernel/FS/Pipe.cpp index 67e229e8..1be5f314 100644 --- a/kernel/kernel/FS/Pipe.cpp +++ b/kernel/kernel/FS/Pipe.cpp @@ -17,10 +17,10 @@ namespace Kernel : m_uid(credentials.euid()) , m_gid(credentials.egid()) { - uint64_t current_time = SystemTimer::get().get_unix_timestamp(); - m_atime = { .tv_sec = current_time, .tv_nsec = 0 }; - m_mtime = { .tv_sec = current_time, .tv_nsec = 0 }; - m_ctime = { .tv_sec = current_time, .tv_nsec = 0 }; + timespec current_time = SystemTimer::get().real_time(); + m_atime = current_time; + m_mtime = current_time; + m_ctime = current_time; } void Pipe::clone_writing() @@ -57,8 +57,7 @@ namespace Kernel memmove(m_buffer.data(), m_buffer.data() + to_copy, m_buffer.size() - to_copy); MUST(m_buffer.resize(m_buffer.size() - to_copy)); - uint64_t current_time = SystemTimer::get().get_unix_timestamp(); - m_atime = { .tv_sec = current_time, .tv_nsec = 0 }; + m_atime = SystemTimer::get().real_time(); m_semaphore.unblock(); @@ -76,9 +75,9 @@ namespace Kernel TRY(m_buffer.resize(old_size + count)); memcpy(m_buffer.data() + old_size, buffer, count); - uint64_t current_time = SystemTimer::get().get_unix_timestamp(); - m_mtime = { .tv_sec = current_time, .tv_nsec = 0 }; - m_ctime = { .tv_sec = current_time, .tv_nsec = 0 }; + timespec current_time = SystemTimer::get().real_time(); + m_mtime = current_time; + m_ctime = current_time; m_semaphore.unblock(); diff --git a/kernel/kernel/FS/RamFS/Inode.cpp b/kernel/kernel/FS/RamFS/Inode.cpp index 894ae15e..4870bdd0 100644 --- a/kernel/kernel/FS/RamFS/Inode.cpp +++ b/kernel/kernel/FS/RamFS/Inode.cpp @@ -23,10 +23,7 @@ namespace Kernel RamInode::RamInode(RamFileSystem& fs, mode_t mode, uid_t uid, gid_t gid) : m_fs(fs) { - uint64_t current_unix_time = SystemTimer::get().get_unix_timestamp(); - timespec current_timespec; - current_timespec.tv_sec = current_unix_time; - current_timespec.tv_nsec = 0; + timespec current_time = SystemTimer::get().real_time(); m_inode_info.ino = fs.next_ino(); m_inode_info.mode = mode; @@ -34,9 +31,9 @@ namespace Kernel m_inode_info.uid = uid; m_inode_info.gid = gid; m_inode_info.size = 0; - m_inode_info.atime = current_timespec; - m_inode_info.mtime = current_timespec; - m_inode_info.ctime = current_timespec; + m_inode_info.atime = current_time; + m_inode_info.mtime = current_time; + m_inode_info.ctime = current_time; m_inode_info.blksize = fs.blksize(); m_inode_info.blocks = 0; m_inode_info.dev = 0; diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 16b89c90..b106920e 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -811,9 +811,12 @@ namespace Kernel { case CLOCK_MONOTONIC: { - uint64_t time_ms = SystemTimer::get().ms_since_boot(); - tp->tv_sec = time_ms / 1000; - tp->tv_nsec = (time_ms % 1000) * 1000000; + *tp = SystemTimer::get().time_since_boot(); + break; + } + case CLOCK_REALTIME: + { + *tp = SystemTimer::get().real_time(); break; } default: diff --git a/kernel/kernel/Timer/Timer.cpp b/kernel/kernel/Timer/Timer.cpp index 3067bc19..e866af38 100644 --- a/kernel/kernel/Timer/Timer.cpp +++ b/kernel/kernel/Timer/Timer.cpp @@ -74,12 +74,7 @@ namespace Kernel dwarnln("sleep woke {} ms too soon", wake_time - ms_since_boot()); } - uint64_t SystemTimer::get_unix_timestamp() const - { - return m_boot_time + ms_since_boot() / 1000; - } - - timespec SystemTimer::get_real_time() const + timespec SystemTimer::real_time() const { auto result = time_since_boot(); result.tv_sec += m_boot_time;