diff --git a/kernel/syscall/handler.cc b/kernel/syscall/handler.cc index 434585f..315cb29 100644 --- a/kernel/syscall/handler.cc +++ b/kernel/syscall/handler.cc @@ -61,6 +61,8 @@ 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_EXIT: + Syscall::Skeleton::exit(Guard::enter().vault()); } diff --git a/kernel/syscall/skeleton.cc b/kernel/syscall/skeleton.cc index 175a515..cfeee82 100644 --- a/kernel/syscall/skeleton.cc +++ b/kernel/syscall/skeleton.cc @@ -97,7 +97,9 @@ bool sem_wait(Vault &vault, size_t id) { return true; } -void exit(Vault &vault) { (void)vault; } +void exit(Vault &vault) { + vault.scheduler.exit(); +} } // namespace Skeleton } // namespace Syscall diff --git a/kernel/syscall/stub.h b/kernel/syscall/stub.h index 98d7420..c08ce7d 100644 --- a/kernel/syscall/stub.h +++ b/kernel/syscall/stub.h @@ -15,7 +15,7 @@ enum class ID : size_t { SEM_WAIT=6, SEM_SIGNAL=7, //SYS_GETPID=8, - //SYS_EXIT= 9, + SYS_EXIT= 9, //SYS_KILL=10 }; } // namespace Syscall @@ -59,3 +59,7 @@ 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 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 39737de..d70e5fb 100644 --- a/kernel/user/app1/appl.cc +++ b/kernel/user/app1/appl.cc @@ -25,8 +25,10 @@ void Application::action() { // NOLINT char text[] = "testX"; text[4] = 0x30+id; - for (unsigned i = 0;; ++i) { + for (unsigned i = 1;; ++i) { write(0, text, sizeof(text)); + if(i==id) + sys_exit(); sleep(1000); } }