From 9d1abb21f1ecd947ef21612b17d754d4799a06ae Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Wed, 3 Dec 2025 06:13:57 +0100 Subject: [PATCH] getpid --- kernel/syscall/handler.cc | 4 +++- kernel/syscall/skeleton.cc | 11 +++++++++-- kernel/syscall/stub.h | 8 ++++++-- kernel/user/app1/appl.cc | 3 +-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/kernel/syscall/handler.cc b/kernel/syscall/handler.cc index 315cb29..f88cb65 100644 --- a/kernel/syscall/handler.cc +++ b/kernel/syscall/handler.cc @@ -61,9 +61,11 @@ extern "C" size_t syscall_handler(size_t sysnum, size_t p1, size_t p2, case Syscall::ID::SEM_SIGNAL: Syscall::Skeleton::sem_signal(Guard::enter().vault(), p1); break; + case Syscall::ID::SYS_GETPID: + return Syscall::Skeleton::getpid(Guard::enter().vault()); case Syscall::ID::SYS_EXIT: Syscall::Skeleton::exit(Guard::enter().vault()); - + return 0; } return static_cast(-1); diff --git a/kernel/syscall/skeleton.cc b/kernel/syscall/skeleton.cc index cfeee82..bea3a82 100644 --- a/kernel/syscall/skeleton.cc +++ b/kernel/syscall/skeleton.cc @@ -9,6 +9,9 @@ void *operator new(size_t, void *); +#include "../user/app1/appl.h" +extern Application apps[]; + namespace Syscall { namespace Skeleton { size_t test(Vault &vault, size_t p1, size_t p2, size_t p3, size_t p4, @@ -20,8 +23,10 @@ size_t test(Vault &vault, size_t p1, size_t p2, size_t p3, size_t p4, } int getpid(Vault &vault) { - (void)vault; - return -1; + Thread *me = vault.scheduler.active(); + unsigned id = 0; + while (&apps[id++] != me); // TODO find better pid source + return id; } size_t write(Vault &vault, uint32_t id, const void *buffer, size_t size, int x, int y) { @@ -45,6 +50,8 @@ size_t write(Vault &vault, uint32_t id, const void *buffer, size_t size, int x, } size_t read(Vault &vault, uint32_t id, void *buf, size_t len) { + (void)id; + size_t read_cnt = 0; while(read_cnt <= len){ Key key; diff --git a/kernel/syscall/stub.h b/kernel/syscall/stub.h index c08ce7d..080ec37 100644 --- a/kernel/syscall/stub.h +++ b/kernel/syscall/stub.h @@ -14,8 +14,8 @@ enum class ID : size_t { SEM_DESTROY=5, SEM_WAIT=6, SEM_SIGNAL=7, - //SYS_GETPID=8, - SYS_EXIT= 9, + SYS_GETPID = 8, + SYS_EXIT = 9, //SYS_KILL=10 }; } // namespace Syscall @@ -59,6 +59,10 @@ extern "C" ssize_t sys_safe_call(Syscall::ID id, size_t p1, size_t p2, return sys_call(Syscall::ID::SEM_SIGNAL, fd, semid,0,0,0); } +[[gnu::always_inline]] static inline int sys_getpid(){ + return sys_call(Syscall::ID::SYS_GETPID, 0,0,0,0,0); +} + [[gnu::always_inline]] static inline void sys_exit(){ sys_call(Syscall::ID::SYS_EXIT, 0, 0, 0, 0, 0); } diff --git a/kernel/user/app1/appl.cc b/kernel/user/app1/appl.cc index d70e5fb..d7d2119 100644 --- a/kernel/user/app1/appl.cc +++ b/kernel/user/app1/appl.cc @@ -20,8 +20,7 @@ void Application::action() { // NOLINT //sys_test(1,2,3,4,5); - unsigned id = 0; - while (&apps[id++] != this); + unsigned id = sys_getpid(); char text[] = "testX"; text[4] = 0x30+id;