[zion] Move the final syscalls to the new format.

This commit is contained in:
Drew Galbraith 2023-06-20 15:03:33 -07:00
parent bd431b94ce
commit 1edd5023ce
10 changed files with 45 additions and 52 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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;
}

View File

@ -0,0 +1,5 @@
#pragma once
#include "include/zcall.h"
z_err_t CapDuplicate(ZCapDuplicateReq* req);

8
zion/syscall/debug.cpp Normal file
View File

@ -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;
}

5
zion/syscall/debug.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include "include/zcall.h"
z_err_t Debug(ZDebugReq* req);

View File

@ -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<Capability>& 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<Z##name##Req*>(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<ZCapDuplicateReq*>(req),
reinterpret_cast<ZCapDuplicateResp*>(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);
}

View File

@ -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); }

View File

@ -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;
};