From 52064e0317fb0f351147f78fa1d3f1fe4287f793 Mon Sep 17 00:00:00 2001 From: apio Date: Fri, 11 Aug 2023 18:09:12 +0200 Subject: [PATCH] libc+kernel: Add alarm() and getpagesize() --- kernel/CMakeLists.txt | 1 + kernel/src/sys/alarm.cpp | 15 +++++++++++++++ kernel/src/thread/Scheduler.cpp | 2 ++ kernel/src/thread/Thread.h | 1 + libc/include/unistd.h | 6 ++++++ libc/src/unistd.cpp | 11 +++++++++++ 6 files changed, 36 insertions(+) create mode 100644 kernel/src/sys/alarm.cpp diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index fa7f4f62..c77e1236 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -44,6 +44,7 @@ set(SOURCES src/sys/signal.cpp src/sys/socket.cpp src/sys/poll.cpp + src/sys/alarm.cpp src/fs/VFS.cpp src/fs/Pipe.cpp src/fs/Mount.cpp diff --git a/kernel/src/sys/alarm.cpp b/kernel/src/sys/alarm.cpp new file mode 100644 index 00000000..c4f8d7d8 --- /dev/null +++ b/kernel/src/sys/alarm.cpp @@ -0,0 +1,15 @@ +#include "sys/Syscall.h" +#include "thread/Scheduler.h" + +Result sys_alarm(Registers*, SyscallArgs args) +{ + unsigned int seconds = (unsigned int)args[0]; + + auto* current = Scheduler::current(); + + u64 time_left = current->alarm_ticks_left; + + current->alarm_ticks_left = seconds * 1000; + + return time_left * 1000; +} diff --git a/kernel/src/thread/Scheduler.cpp b/kernel/src/thread/Scheduler.cpp index d5d5df16..d72384e7 100644 --- a/kernel/src/thread/Scheduler.cpp +++ b/kernel/src/thread/Scheduler.cpp @@ -282,6 +282,8 @@ namespace Scheduler { if (thread->sleep_ticks_left == 0 || --thread->sleep_ticks_left == 0) thread->wake_up(); } + + if (thread->alarm_ticks_left && --thread->alarm_ticks_left == 0) thread->send_signal(SIGALRM); } if (!g_current->ticks_left) switch_task(regs); diff --git a/kernel/src/thread/Thread.h b/kernel/src/thread/Thread.h index 90edd7ea..78ee01d8 100644 --- a/kernel/src/thread/Thread.h +++ b/kernel/src/thread/Thread.h @@ -87,6 +87,7 @@ struct Thread : public LinkedListNode u64 ticks_left; u64 sleep_ticks_left; + u64 alarm_ticks_left { 0 }; Stack stack; Stack kernel_stack; diff --git a/libc/include/unistd.h b/libc/include/unistd.h index d2966a07..5ec8b5c2 100644 --- a/libc/include/unistd.h +++ b/libc/include/unistd.h @@ -190,6 +190,12 @@ extern "C" /* Truncate a file to a specific length. */ int ftruncate(int fd, size_t size); + /* Return the system page size. */ + int getpagesize(void); + + /* Schedule an alarm signal. */ + unsigned int alarm(unsigned int seconds); + #ifdef __cplusplus } #endif diff --git a/libc/src/unistd.cpp b/libc/src/unistd.cpp index c9d4741d..e2501a51 100644 --- a/libc/src/unistd.cpp +++ b/libc/src/unistd.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -510,4 +511,14 @@ extern "C" long rc = syscall(SYS_ftruncate, fd, size); __errno_return(rc, int); } + + int getpagesize(void) + { + return PAGE_SIZE; + } + + unsigned int alarm(unsigned int seconds) + { + return (unsigned int)syscall(SYS_alarm, seconds); + } }