diff --git a/zion/CMakeLists.txt b/zion/CMakeLists.txt index 932e60b..5543d7a 100644 --- a/zion/CMakeLists.txt +++ b/zion/CMakeLists.txt @@ -27,10 +27,12 @@ add_executable(zion scheduler/jump_user_space.s scheduler/process_manager.cpp scheduler/scheduler.cpp + syscall/address_space.cpp + syscall/memory_object.cpp syscall/process.cpp syscall/syscall.cpp - syscall/thread.cpp syscall/syscall_enter.s + syscall/thread.cpp zion.cpp) target_include_directories(zion diff --git a/zion/include/zcall.h b/zion/include/zcall.h index 7451833..35618fc 100644 --- a/zion/include/zcall.h +++ b/zion/include/zcall.h @@ -97,17 +97,15 @@ SYS4(ThreadStart, z_cap_t, thread_cap, uint64_t, entry, uint64_t, arg1, uint64_t, arg2); SYS0(ThreadExit); -[[nodiscard]] z_err_t ZAddressSpaceMap(z_cap_t vmas_cap, uint64_t vmas_offset, - z_cap_t vmmo_cap, uint64_t* vaddr); -[[nodiscard]] z_err_t ZMemoryObjectCreate(uint64_t size, z_cap_t* vmmo_cap); -[[nodiscard]] z_err_t ZMemoryObjectCreatePhysical(uint64_t paddr, uint64_t size, - z_cap_t* vmmo_cap); -[[nodiscard]] z_err_t ZMemoryObjectCreateContiguous(uint64_t size, - z_cap_t* vmmo_cap, - uint64_t* paddr); +SYS4(AddressSpaceMap, z_cap_t, vmas_cap, uint64_t, vmas_offset, z_cap_t, + vmmo_cap, uint64_t*, vaddr); -[[nodiscard]] z_err_t ZTempPcieConfigObjectCreate(z_cap_t* vmmo_cap, - uint64_t* vmmo_size); +SYS2(MemoryObjectCreate, uint64_t, size, z_cap_t*, vmmo_cap); +SYS3(MemoryObjectCreatePhysical, uint64_t, paddr, uint64_t, size, z_cap_t*, + vmmo_cap); +SYS3(MemoryObjectCreateContiguous, uint64_t, size, z_cap_t*, vmmo_cap, + uint64_t*, paddr); +SYS2(TempPcieConfigObjectCreate, z_cap_t*, vmmo_cap, uint64_t*, vmmo_size); [[nodiscard]] z_err_t ZChannelCreate(z_cap_t* channel1, z_cap_t* channel2); [[nodiscard]] z_err_t ZChannelSend(z_cap_t chan_cap, uint64_t num_bytes, diff --git a/zion/include/ztypes.h b/zion/include/ztypes.h index 29b9579..9c24590 100644 --- a/zion/include/ztypes.h +++ b/zion/include/ztypes.h @@ -39,13 +39,14 @@ const uint64_t kZionThreadStart = 0x11; const uint64_t kZionThreadExit = 0x12; // Memory Calls -#define Z_ADDRESS_SPACE_MAP 0x21 -#define Z_ADDRESS_SPACE_UNMAP 0x22 +const uint64_t kZionAddressSpaceMap = 0x21; +const uint64_t kZionAddressSpaceUnMap = 0x21; -#define Z_MEMORY_OBJECT_CREATE 0x30 -#define Z_MEMORY_OBJECT_CREATE_PHYSICAL 0x31 +const uint64_t kZionMemoryObjectCreate = 0x30; +const uint64_t kZionMemoryObjectCreatePhysical = 0x31; +const uint64_t kZionMemoryObjectCreateContiguous = 0x32; -#define Z_TEMP_PCIE_CONFIG_OBJECT_CREATE 0x3F +const uint64_t kZionTempPcieConfigObjectCreate = 0x3F; // IPC Calls #define Z_CHANNEL_CREATE 0x40 diff --git a/zion/syscall/address_space.cpp b/zion/syscall/address_space.cpp new file mode 100644 index 0000000..4a6ed43 --- /dev/null +++ b/zion/syscall/address_space.cpp @@ -0,0 +1,26 @@ +#include "syscall/address_space.h" + +#include "scheduler/scheduler.h" +#include "syscall/syscall.h" + +z_err_t AddressSpaceMap(ZAddressSpaceMapReq* req) { + auto& curr_proc = gScheduler->CurrentProcess(); + auto vmas_cap = curr_proc.GetCapability(req->vmas_cap); + auto vmmo_cap = curr_proc.GetCapability(req->vmmo_cap); + RET_ERR(ValidateCap(vmas_cap, ZC_WRITE)); + RET_ERR(ValidateCap(vmmo_cap, ZC_WRITE)); + + auto vmas = vmas_cap->obj(); + auto vmmo = vmmo_cap->obj(); + RET_IF_NULL(vmas); + RET_IF_NULL(vmmo); + + // FIXME: Validation necessary. + if (req->vmas_offset != 0) { + vmas->MapInMemoryObject(req->vmas_offset, vmmo); + *req->vaddr = req->vmas_offset; + } else { + *req->vaddr = vmas->MapInMemoryObject(vmmo); + } + return Z_OK; +} diff --git a/zion/syscall/address_space.h b/zion/syscall/address_space.h new file mode 100644 index 0000000..87c7876 --- /dev/null +++ b/zion/syscall/address_space.h @@ -0,0 +1,5 @@ +#pragma once + +#include "include/zcall.h" + +z_err_t AddressSpaceMap(ZAddressSpaceMapReq* req); diff --git a/zion/syscall/memory_object.cpp b/zion/syscall/memory_object.cpp new file mode 100644 index 0000000..9f6a734 --- /dev/null +++ b/zion/syscall/memory_object.cpp @@ -0,0 +1,42 @@ +#include "syscall/memory_object.h" + +#include "boot/acpi.h" +#include "memory/physical_memory.h" +#include "scheduler/scheduler.h" + +z_err_t MemoryObjectCreate(ZMemoryObjectCreateReq* req) { + auto& curr_proc = gScheduler->CurrentProcess(); + *req->vmmo_cap = curr_proc.AddNewCapability( + MakeRefCounted(req->size), ZC_WRITE); + return Z_OK; +} + +z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req) { + auto& curr_proc = gScheduler->CurrentProcess(); + uint64_t paddr = req->paddr; + auto vmmo_ref = MakeRefCounted(paddr, req->size); + *req->vmmo_cap = curr_proc.AddNewCapability( + StaticCastRefPtr(vmmo_ref), ZC_WRITE); + return Z_OK; +} + +z_err_t MemoryObjectCreateContiguous(ZMemoryObjectCreateContiguousReq* req) { + auto& curr_proc = gScheduler->CurrentProcess(); + uint64_t paddr = phys_mem::AllocateContinuous(((req->size - 1) / 0x1000) + 1); + auto vmmo_ref = MakeRefCounted(paddr, req->size); + *req->vmmo_cap = curr_proc.AddNewCapability( + StaticCastRefPtr(vmmo_ref), ZC_WRITE); + *req->paddr = paddr; + return Z_OK; +} + +z_err_t TempPcieConfigObjectCreate(ZTempPcieConfigObjectCreateReq* req) { + auto& curr_proc = gScheduler->CurrentProcess(); + uint64_t pci_base, pci_size; + RET_ERR(GetPciExtendedConfiguration(&pci_base, &pci_size)); + auto vmmo_ref = MakeRefCounted(pci_base, pci_size); + *req->vmmo_cap = curr_proc.AddNewCapability( + StaticCastRefPtr(vmmo_ref), ZC_WRITE); + *req->vmmo_size = pci_size; + return Z_OK; +} diff --git a/zion/syscall/memory_object.h b/zion/syscall/memory_object.h new file mode 100644 index 0000000..3b9a9c3 --- /dev/null +++ b/zion/syscall/memory_object.h @@ -0,0 +1,8 @@ +#pragma once + +#include "include/zcall.h" + +z_err_t MemoryObjectCreate(ZMemoryObjectCreateReq* req); +z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req); +z_err_t MemoryObjectCreateContiguous(ZMemoryObjectCreateContiguousReq* req); +z_err_t TempPcieConfigObjectCreate(ZTempPcieConfigObjectCreateReq* req); diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index 7cfb9bb..c2a9ca9 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -2,7 +2,6 @@ #include -#include "boot/acpi.h" #include "common/msr.h" #include "debug/debug.h" #include "include/zcall.h" @@ -13,6 +12,8 @@ #include "object/process.h" #include "scheduler/process_manager.h" #include "scheduler/scheduler.h" +#include "syscall/address_space.h" +#include "syscall/memory_object.h" #include "syscall/process.h" #include "syscall/thread.h" #include "usr/zcall_internal.h" @@ -60,61 +61,6 @@ z_err_t ValidateCap(const RefPtr& cap, uint64_t permissions) { return Z_OK; } -z_err_t AddressSpaceMap(ZAddressSpaceMapReq* req, ZAddressSpaceMapResp* resp) { - auto& curr_proc = gScheduler->CurrentProcess(); - auto vmas_cap = curr_proc.GetCapability(req->vmas_cap); - auto vmmo_cap = curr_proc.GetCapability(req->vmmo_cap); - RET_ERR(ValidateCap(vmas_cap, ZC_WRITE)); - RET_ERR(ValidateCap(vmmo_cap, ZC_WRITE)); - - auto vmas = vmas_cap->obj(); - auto vmmo = vmmo_cap->obj(); - RET_IF_NULL(vmas); - RET_IF_NULL(vmmo); - - // FIXME: Validation necessary. - if (req->vmas_offset != 0) { - vmas->MapInMemoryObject(req->vmas_offset, vmmo); - resp->vaddr = req->vmas_offset; - } else { - resp->vaddr = vmas->MapInMemoryObject(vmmo); - } - return Z_OK; -} - -z_err_t MemoryObjectCreate(ZMemoryObjectCreateReq* req, - ZMemoryObjectCreateResp* resp) { - auto& curr_proc = gScheduler->CurrentProcess(); - resp->vmmo_cap = curr_proc.AddNewCapability( - MakeRefCounted(req->size), ZC_WRITE); - return Z_OK; -} - -z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req, - ZMemoryObjectCreatePhysicalResp* resp) { - auto& curr_proc = gScheduler->CurrentProcess(); - uint64_t paddr = req->paddr; - if (paddr == 0) { - paddr = phys_mem::AllocateContinuous(((req->size - 1) / 0x1000) + 1); - } - auto vmmo_ref = MakeRefCounted(paddr, req->size); - resp->vmmo_cap = curr_proc.AddNewCapability( - StaticCastRefPtr(vmmo_ref), ZC_WRITE); - resp->paddr = paddr; - return Z_OK; -} - -z_err_t TempPcieConfigObjectCreate(ZTempPcieConfigObjectCreateResp* resp) { - auto& curr_proc = gScheduler->CurrentProcess(); - uint64_t pci_base, pci_size; - RET_ERR(GetPciExtendedConfiguration(&pci_base, &pci_size)); - auto vmmo_ref = MakeRefCounted(pci_base, pci_size); - resp->vmmo_cap = curr_proc.AddNewCapability( - StaticCastRefPtr(vmmo_ref), ZC_WRITE); - resp->vmmo_size = pci_size; - return Z_OK; -} - z_err_t ChannelCreate(ZChannelCreateResp* resp) { auto& proc = gScheduler->CurrentProcess(); auto chan_pair = Channel::CreateChannelPair(); @@ -222,20 +168,13 @@ extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req, void* resp) { CASE(ThreadCreate); CASE(ThreadStart); CASE(ThreadExit); - case Z_ADDRESS_SPACE_MAP: - return AddressSpaceMap(reinterpret_cast(req), - reinterpret_cast(resp)); - case Z_MEMORY_OBJECT_CREATE: - return MemoryObjectCreate( - reinterpret_cast(req), - reinterpret_cast(resp)); - case Z_MEMORY_OBJECT_CREATE_PHYSICAL: - return MemoryObjectCreatePhysical( - reinterpret_cast(req), - reinterpret_cast(resp)); - case Z_TEMP_PCIE_CONFIG_OBJECT_CREATE: - return TempPcieConfigObjectCreate( - reinterpret_cast(resp)); + // syscall/address_space.h + CASE(AddressSpaceMap); + // syscall/memory_object.h + CASE(MemoryObjectCreate); + CASE(MemoryObjectCreatePhysical); + CASE(MemoryObjectCreateContiguous); + CASE(TempPcieConfigObjectCreate); case Z_CHANNEL_CREATE: return ChannelCreate(reinterpret_cast(resp)); case Z_CHANNEL_SEND: diff --git a/zion/usr/zcall.cpp b/zion/usr/zcall.cpp index 0667292..6a61daa 100644 --- a/zion/usr/zcall.cpp +++ b/zion/usr/zcall.cpp @@ -19,62 +19,6 @@ z_err_t SysCall1(uint64_t number, const void* first) { return SysCall2(number, first, 0); } -z_err_t ZAddressSpaceMap(z_cap_t vmas_cap, uint64_t vmas_offset, - z_cap_t vmmo_cap, uint64_t* vaddr) { - ZAddressSpaceMapReq req{ - .vmas_cap = vmas_cap, - .vmas_offset = vmas_offset, - .vmmo_cap = vmmo_cap, - }; - ZAddressSpaceMapResp resp; - z_err_t ret = SysCall2(Z_ADDRESS_SPACE_MAP, &req, &resp); - *vaddr = resp.vaddr; - return ret; -} - -z_err_t ZMemoryObjectCreate(uint64_t size, z_cap_t* vmmo_cap) { - ZMemoryObjectCreateReq req{ - .size = size, - }; - ZMemoryObjectCreateResp resp; - z_err_t ret = SysCall2(Z_MEMORY_OBJECT_CREATE, &req, &resp); - *vmmo_cap = resp.vmmo_cap; - return ret; -} - -z_err_t ZMemoryObjectCreatePhysical(uint64_t paddr, uint64_t size, - z_cap_t* vmmo_cap) { - ZMemoryObjectCreatePhysicalReq req{ - .paddr = paddr, - .size = size, - }; - ZMemoryObjectCreatePhysicalResp resp; - z_err_t ret = SysCall2(Z_MEMORY_OBJECT_CREATE_PHYSICAL, &req, &resp); - *vmmo_cap = resp.vmmo_cap; - return ret; -} - -z_err_t ZMemoryObjectCreateContiguous(uint64_t size, z_cap_t* vmmo_cap, - uint64_t* paddr) { - ZMemoryObjectCreatePhysicalReq req{ - .paddr = 0, - .size = size, - }; - ZMemoryObjectCreatePhysicalResp resp; - z_err_t ret = SysCall2(Z_MEMORY_OBJECT_CREATE_PHYSICAL, &req, &resp); - *vmmo_cap = resp.vmmo_cap; - *paddr = resp.paddr; - return ret; -} - -z_err_t ZTempPcieConfigObjectCreate(z_cap_t* vmmo_cap, uint64_t* vmmo_size) { - ZTempPcieConfigObjectCreateResp resp; - z_err_t ret = SysCall2(Z_TEMP_PCIE_CONFIG_OBJECT_CREATE, 0, &resp); - *vmmo_cap = resp.vmmo_cap; - *vmmo_size = resp.vmmo_size; - return ret; -} - z_err_t ZChannelCreate(z_cap_t* channel1, z_cap_t* channel2) { ZChannelCreateResp resp; z_err_t ret = SysCall2(Z_CHANNEL_CREATE, 0, &resp); diff --git a/zion/usr/zcall_internal.h b/zion/usr/zcall_internal.h index e6bb95e..d3f881d 100644 --- a/zion/usr/zcall_internal.h +++ b/zion/usr/zcall_internal.h @@ -4,39 +4,6 @@ #include "include/ztypes.h" -struct ZAddressSpaceMapReq { - z_cap_t vmas_cap; - z_cap_t vmas_offset; - z_cap_t vmmo_cap; -}; - -struct ZAddressSpaceMapResp { - uint64_t vaddr; -}; - -struct ZMemoryObjectCreateReq { - uint64_t size; -}; - -struct ZMemoryObjectCreateResp { - z_cap_t vmmo_cap; -}; - -struct ZMemoryObjectCreatePhysicalReq { - uint64_t paddr; - uint64_t size; -}; - -struct ZMemoryObjectCreatePhysicalResp { - z_cap_t vmmo_cap; - uint64_t paddr; -}; - -struct ZTempPcieConfigObjectCreateResp { - z_cap_t vmmo_cap; - uint64_t vmmo_size; -}; - struct ZChannelCreateResp { z_cap_t chan_cap1; z_cap_t chan_cap2;