diff --git a/kernel/syscall/handler.cc b/kernel/syscall/handler.cc index 6c0b8bc..89903f0 100644 --- a/kernel/syscall/handler.cc +++ b/kernel/syscall/handler.cc @@ -80,8 +80,8 @@ extern "C" size_t syscall_handler(size_t sysnum, size_t p1, size_t p2, return Skeleton::receive(Guard::enter().vault(), (void*)(p1), p2); case Syscall::ID::REPLY: return Skeleton::reply(Guard::enter().vault(), (void*)(p1), p2); - // case Syscall::ID::FORK: - // return Skeleton::fork(v, user); + case Syscall::ID::FORK: + return Skeleton::fork(Guard::enter().vault(), user); break; diff --git a/kernel/syscall/skeleton.cc b/kernel/syscall/skeleton.cc index c045c06..e1803ce 100644 --- a/kernel/syscall/skeleton.cc +++ b/kernel/syscall/skeleton.cc @@ -392,7 +392,9 @@ bool reply(Vault& v, const void* buffer, size_t size) { return true; } - +int fork(Vault &vault, InterruptContext *user_context) { + return 0; +} } // namespace Skeleton diff --git a/kernel/syscall/skeleton.h b/kernel/syscall/skeleton.h index 6b0e0fb..9c37c88 100644 --- a/kernel/syscall/skeleton.h +++ b/kernel/syscall/skeleton.h @@ -1,4 +1,5 @@ #pragma once +#include "arch/idt.h" #include "types.h" #include "../memory/pagetable.h" @@ -29,7 +30,7 @@ void invlpg(uintptr_t virt_addr); bool send(Vault &vault, int pid, const void* sbuffer, size_t ssize, void* rbuffer, size_t rsize); int receive(Vault &vault, void* buffer, size_t size); bool reply(Vault &vaul, const void* buffer, size_t size); -//int fork(Vault &vault, InterruptContext *user); +int fork(Vault &vault, InterruptContext *user); } // namespace Skeleton diff --git a/kernel/syscall/stub.h b/kernel/syscall/stub.h index ca90aaf..537a090 100644 --- a/kernel/syscall/stub.h +++ b/kernel/syscall/stub.h @@ -22,7 +22,7 @@ namespace Syscall { SEND = 13, RECEIVE = 14, REPLY = 15, - // FORK = 16 + FORK = 16 }; } // namespace Syscall @@ -97,3 +97,8 @@ extern "C" ssize_t sys_safe_call(Syscall::ID id, size_t p1, size_t p2, [[gnu::always_inline]] static inline bool reply(const void* buffer, size_t size) { return sys_call(Syscall::ID::REPLY, (size_t)buffer, size,0,0,0); } + + +[[gnu::always_inline]] static inline int fork() { + return sys_call(Syscall::ID::FORK,0,0,0,0,0); +}