diff --git a/zion/CMakeLists.txt b/zion/CMakeLists.txt index 9b959d2..abf387a 100644 --- a/zion/CMakeLists.txt +++ b/zion/CMakeLists.txt @@ -28,7 +28,9 @@ add_executable(zion scheduler/process_manager.cpp scheduler/scheduler.cpp syscall/address_space.cpp + syscall/capability.cpp syscall/channel.cpp + syscall/debug.cpp syscall/memory_object.cpp syscall/port.cpp syscall/process.cpp diff --git a/zion/include/zcall.h b/zion/include/zcall.h index d5c07de..16e7452 100644 --- a/zion/include/zcall.h +++ b/zion/include/zcall.h @@ -123,6 +123,6 @@ SYS5(PortPoll, z_cap_t, port_cap, uint64_t*, num_bytes, void*, data, uint64_t*, SYS2(IrqRegister, uint64_t, irq_num, z_cap_t*, port_cap); -[[nodiscard]] z_err_t ZCapDuplicate(z_cap_t cap_in, z_cap_t* cap_out); +SYS2(CapDuplicate, z_cap_t, cap_in, z_cap_t*, cap_out); -[[nodiscard]] z_err_t ZDebug(const char* message); +SYS1(Debug, const char*, message); diff --git a/zion/include/ztypes.h b/zion/include/ztypes.h index 3d73768..cb1ed95 100644 --- a/zion/include/ztypes.h +++ b/zion/include/ztypes.h @@ -64,10 +64,10 @@ const uint64_t kZionIrqRegister = 0x58; #define Z_IRQ_PCI_BASE 0x30 // Capability Calls -#define Z_CAP_DUPLICATE 0x60 +const uint64_t kZionCapDuplicate = 0x70; // Debugging Calls. -#define Z_DEBUG_PRINT 0x10000000 +const uint64_t kZionDebug = 0x1'0000; /* ------------------------------ * Capability Types diff --git a/zion/syscall/capability.cpp b/zion/syscall/capability.cpp new file mode 100644 index 0000000..4953c14 --- /dev/null +++ b/zion/syscall/capability.cpp @@ -0,0 +1,13 @@ +#include "syscall/capability.h" + +#include "scheduler/scheduler.h" + +z_err_t CapDuplicate(ZCapDuplicateReq* req) { + auto& proc = gScheduler->CurrentProcess(); + auto cap = proc.GetCapability(req->cap_in); + if (!cap) { + return Z_ERR_CAP_NOT_FOUND; + } + *req->cap_out = proc.AddExistingCapability(cap); + return Z_OK; +} diff --git a/zion/syscall/capability.h b/zion/syscall/capability.h new file mode 100644 index 0000000..07ee631 --- /dev/null +++ b/zion/syscall/capability.h @@ -0,0 +1,5 @@ +#pragma once + +#include "include/zcall.h" + +z_err_t CapDuplicate(ZCapDuplicateReq* req); diff --git a/zion/syscall/debug.cpp b/zion/syscall/debug.cpp new file mode 100644 index 0000000..45989ab --- /dev/null +++ b/zion/syscall/debug.cpp @@ -0,0 +1,8 @@ +#include "syscall/debug.h" + +#include "debug/debug.h" + +z_err_t Debug(ZDebugReq* req) { + dbgln("[Debug] %s", req->message); + return Z_OK; +} diff --git a/zion/syscall/debug.h b/zion/syscall/debug.h new file mode 100644 index 0000000..0b4aa06 --- /dev/null +++ b/zion/syscall/debug.h @@ -0,0 +1,5 @@ +#pragma once + +#include "include/zcall.h" + +z_err_t Debug(ZDebugReq* req); diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index b093113..f069f2a 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -13,7 +13,9 @@ #include "scheduler/process_manager.h" #include "scheduler/scheduler.h" #include "syscall/address_space.h" +#include "syscall/capability.h" #include "syscall/channel.h" +#include "syscall/debug.h" #include "syscall/memory_object.h" #include "syscall/port.h" #include "syscall/process.h" @@ -63,16 +65,6 @@ z_err_t ValidateCap(const RefPtr& cap, uint64_t permissions) { return Z_OK; } -z_err_t CapDuplicate(ZCapDuplicateReq* req, ZCapDuplicateResp* resp) { - auto& proc = gScheduler->CurrentProcess(); - auto cap = proc.GetCapability(req->cap); - if (!cap) { - return Z_ERR_CAP_NOT_FOUND; - } - resp->cap = proc.AddExistingCapability(cap); - return Z_OK; -} - #define CASE(name) \ case kZion##name: \ return name(reinterpret_cast(req)); @@ -104,13 +96,10 @@ extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req, void* resp) { CASE(PortRecv); CASE(PortPoll); CASE(IrqRegister); - case Z_CAP_DUPLICATE: - return CapDuplicate(reinterpret_cast(req), - reinterpret_cast(resp)); - case Z_DEBUG_PRINT: - dbgln("[Debug] %s", req); - return Z_OK; - break; + // syscall/capability.h + CASE(CapDuplicate); + // syscall/debug.h + CASE(Debug); default: panic("Unhandled syscall number: %x", call_id); } diff --git a/zion/usr/zcall.cpp b/zion/usr/zcall.cpp index f754da1..34d9025 100644 --- a/zion/usr/zcall.cpp +++ b/zion/usr/zcall.cpp @@ -4,29 +4,8 @@ #include "usr/zcall_internal.h" -z_err_t SysCall2(uint64_t number, const void* first, const void* second) { +z_err_t SysCall1(uint64_t number, const void* first) { z_err_t return_code; - asm("syscall" - : "=a"(return_code) - : "D"(number), "S"(first), "d"(second) - : "rcx", "r11"); + asm("syscall" : "=a"(return_code) : "D"(number), "S"(first) : "rcx", "r11"); return return_code; } - -z_err_t SysCall0(uint64_t number) { return SysCall2(number, 0, 0); } - -z_err_t SysCall1(uint64_t number, const void* first) { - return SysCall2(number, first, 0); -} - -z_err_t ZCapDuplicate(z_cap_t cap_in, z_cap_t* cap_out) { - ZCapDuplicateReq req{ - .cap = cap_in, - }; - ZCapDuplicateResp resp; - z_err_t ret = SysCall2(Z_CAP_DUPLICATE, &req, &resp); - *cap_out = resp.cap; - return ret; -} - -z_err_t ZDebug(const char* message) { return SysCall1(Z_DEBUG_PRINT, message); } diff --git a/zion/usr/zcall_internal.h b/zion/usr/zcall_internal.h index 9f5c122..fa25ea5 100644 --- a/zion/usr/zcall_internal.h +++ b/zion/usr/zcall_internal.h @@ -11,11 +11,3 @@ struct ZMessage { uint64_t num_caps; z_cap_t* caps; }; - -struct ZCapDuplicateReq { - z_cap_t cap; -}; - -struct ZCapDuplicateResp { - z_cap_t cap; -};