From 3afa165ef34db9bd4343c673ee2c01bc5c5780c7 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 2 Dec 2025 16:56:38 +0100 Subject: [PATCH 1/3] =?UTF-8?q?musst=20semaphore.counter=20public=20machen?= =?UTF-8?q?,=20hasse=20alles.=20init=20l=C3=A4uft=20nun?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/interrupt/guard.h | 2 ++ kernel/sync/semaphore.h | 2 +- kernel/syscall/handler.cc | 20 ++++++++++++++++---- kernel/syscall/skeleton.cc | 9 +++++---- kernel/syscall/stub.h | 26 +++++++++++++++++++++++++- 5 files changed, 49 insertions(+), 10 deletions(-) diff --git a/kernel/interrupt/guard.h b/kernel/interrupt/guard.h index 16c20fc..021b737 100644 --- a/kernel/interrupt/guard.h +++ b/kernel/interrupt/guard.h @@ -20,7 +20,9 @@ struct Vault { Bellringer bellringer; BBuffer keys; Semaphore keys_sem; +static constexpr int MAX_SEMS =32; + Semaphore sems[MAX_SEMS]; // Ignore this for now, this is for a bonus task Graphics graphics; diff --git a/kernel/sync/semaphore.h b/kernel/sync/semaphore.h index cb0a9bd..9355ee1 100644 --- a/kernel/sync/semaphore.h +++ b/kernel/sync/semaphore.h @@ -25,7 +25,6 @@ class Semaphore { // Prevent copies and assignments Semaphore(const Semaphore&) = delete; Semaphore& operator=(const Semaphore&) = delete; - unsigned counter; Queue waiting; public: @@ -33,6 +32,7 @@ class Semaphore { * \param c Initial counter value */ explicit Semaphore(unsigned c = 0) : counter(c) {} + unsigned counter; /*! \brief Wait for access to the critical area. * diff --git a/kernel/syscall/handler.cc b/kernel/syscall/handler.cc index e71e46b..ac90758 100644 --- a/kernel/syscall/handler.cc +++ b/kernel/syscall/handler.cc @@ -44,11 +44,23 @@ extern "C" size_t syscall_handler(size_t sysnum, size_t p1, size_t p2, Syscall::Skeleton::test(Guard::enter().vault(), p1, p2, p3, p4, p5); break; case Syscall::ID::WRITE: - Guarded g = Guard::enter(); - g.vault().kout.setPos((int)p4, (int)p5); - Syscall::Skeleton::write(g.vault(), p1, (char*)p2, p3); + Guard::enter().vault().kout.setPos((int)p4, (int)p5); + Syscall::Skeleton::write(Guard::enter().vault(), p1, (char*)p2, p3); break; - } + case Syscall::ID::SEM_INIT: + Syscall::Skeleton::sem_init(Guard::enter().vault(), p1, p2); + break; + case Syscall::ID::SEM_DESTROY: + Syscall::Skeleton::sem_destroy(Guard::enter().vault(), p1); + break; + case Syscall::ID::SEM_WAIT: + Syscall::Skeleton::sem_wait(Guard::enter().vault(), p1); + break; + case Syscall::ID::SEM_SIGNAL: + Syscall::Skeleton::sem_signal(Guard::enter().vault(), p1); + break; + + } return static_cast(-1); } diff --git a/kernel/syscall/skeleton.cc b/kernel/syscall/skeleton.cc index 5f7acf8..1f780a0 100644 --- a/kernel/syscall/skeleton.cc +++ b/kernel/syscall/skeleton.cc @@ -46,10 +46,11 @@ void sleep(Vault &vault, size_t ms) { } bool sem_init(Vault &vault, size_t id, uint32_t value) { - (void)vault; - (void)id; - (void)value; - return false; + if (id >= vault.MAX_SEMS) { + return false; // out‐of‐range id + } + vault.sems[id].counter=value; + return true; } void sem_destroy(Vault &vault, size_t id) { diff --git a/kernel/syscall/stub.h b/kernel/syscall/stub.h index 18e433e..f1e0f5c 100644 --- a/kernel/syscall/stub.h +++ b/kernel/syscall/stub.h @@ -8,6 +8,15 @@ namespace Syscall { enum class ID : size_t { TEST = 0, WRITE = 1, + //READ = 2, + //SLEEP =3, + SEM_INIT=4, + SEM_DESTROY=5, + SEM_WAIT=6, + SEM_SIGNAL=7, + //SYS_GETPID=8, + //SYS_EXIT= 9, + //SYS_KILL=10 }; } // namespace Syscall @@ -25,5 +34,20 @@ extern "C" ssize_t sys_safe_call(Syscall::ID id, size_t p1, size_t p2, } [[gnu::always_inline]] static inline int write(int fd, const void *buf, size_t len, int x = -1, int y = -1) { - return sys_call(Syscall::ID::WRITE, fd, (size_t)buf, len, x, y); + return sys_call(Syscall::ID::WRITE, fd, (size_t)buf, len, x, y); +} + + +[[gnu::always_inline]] static inline int sem_init(int fd, int semid, int value) { + return sys_call(Syscall::ID::SEM_INIT, fd, semid, value, 0,0); +} +[[gnu::always_inline]] static inline int sem_destroy(int fd, int semid) { + return sys_call(Syscall::ID::SEM_DESTROY, fd, semid,0,0,0); +} +[[gnu::always_inline]] static inline int sem_wait(int fd, int semid) { + return sys_call(Syscall::ID::SEM_WAIT, fd, semid,0,0,0); +} + +[[gnu::always_inline]] static inline int sem_signal(int fd, int semid) { + return sys_call(Syscall::ID::SEM_SIGNAL, fd, semid,0,0,0); } From dcf66e778501d188162b025c03df8236902c6975 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 2 Dec 2025 17:10:23 +0100 Subject: [PATCH 2/3] destroy added --- kernel/sync/semaphore.h | 2 +- kernel/syscall/skeleton.cc | 25 ++++++++++++++++++++----- kernel/syscall/skeleton.h | 6 +++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/kernel/sync/semaphore.h b/kernel/sync/semaphore.h index 9355ee1..17b3655 100644 --- a/kernel/sync/semaphore.h +++ b/kernel/sync/semaphore.h @@ -33,7 +33,7 @@ class Semaphore { */ explicit Semaphore(unsigned c = 0) : counter(c) {} unsigned counter; - + bool used; /*! \brief Wait for access to the critical area. * * Enter/decrement/wait operation: If the counter is greater than 0, then diff --git a/kernel/syscall/skeleton.cc b/kernel/syscall/skeleton.cc index 1f780a0..b27aeae 100644 --- a/kernel/syscall/skeleton.cc +++ b/kernel/syscall/skeleton.cc @@ -49,23 +49,38 @@ bool sem_init(Vault &vault, size_t id, uint32_t value) { if (id >= vault.MAX_SEMS) { return false; // out‐of‐range id } + if (vault.sems[id].used==1){ + return false; //already in use + } + vault.sems[id].counter=value; return true; } -void sem_destroy(Vault &vault, size_t id) { - (void)vault; - (void)id; +bool sem_destroy(Vault &vault, size_t id) { + if (id >= vault.MAX_SEMS) { + return false; // out‐of‐range id + } + if (vault.sems[id].used==0){ + return false; //already in free + } + + vault.sems[id].used=0; + vault.sems[id].counter=0; + return true; } -void sem_signal(Vault &vault, size_t id) { +bool sem_signal(Vault &vault, size_t id) { (void)vault; (void)id; + + return true; } -void sem_wait(Vault &vault, size_t id) { +bool sem_wait(Vault &vault, size_t id) { (void)vault; (void)id; + return true; } void exit(Vault &vault) { (void)vault; } diff --git a/kernel/syscall/skeleton.h b/kernel/syscall/skeleton.h index 5f9f831..7ab0464 100644 --- a/kernel/syscall/skeleton.h +++ b/kernel/syscall/skeleton.h @@ -18,9 +18,9 @@ size_t write(Vault &vault, uint32_t id, const void *buffer, size_t size); size_t read(Vault &vault, uint32_t id); void sleep(Vault &vault, size_t ms); bool sem_init(Vault &vault, size_t id, uint32_t value); -void sem_destroy(Vault &vault, size_t id); -void sem_signal(Vault &vault, size_t id); -void sem_wait(Vault &vault, size_t id); +bool sem_destroy(Vault &vault, size_t id); +bool sem_signal(Vault &vault, size_t id); +bool sem_wait(Vault &vault, size_t id); void exit(Vault &vault); void kill(Vault &vault, size_t pid); From 2848ef3ae437ceb51425c2adeda986ff5b4ecca1 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 2 Dec 2025 17:14:15 +0100 Subject: [PATCH 3/3] p and v added to signal and wait --- kernel/syscall/skeleton.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/kernel/syscall/skeleton.cc b/kernel/syscall/skeleton.cc index b27aeae..04694e1 100644 --- a/kernel/syscall/skeleton.cc +++ b/kernel/syscall/skeleton.cc @@ -71,15 +71,13 @@ bool sem_destroy(Vault &vault, size_t id) { } bool sem_signal(Vault &vault, size_t id) { - (void)vault; - (void)id; + vault.sems[id].v(vault); return true; } bool sem_wait(Vault &vault, size_t id) { - (void)vault; - (void)id; + vault.sems[id].p(vault); return true; }