[zion] Move the final syscalls to the new format.
This commit is contained in:
parent
bd431b94ce
commit
1edd5023ce
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
#include "include/zcall.h"
|
||||
|
||||
z_err_t CapDuplicate(ZCapDuplicateReq* req);
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
#include "include/zcall.h"
|
||||
|
||||
z_err_t Debug(ZDebugReq* req);
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue