[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/process_manager.cpp
|
||||||
scheduler/scheduler.cpp
|
scheduler/scheduler.cpp
|
||||||
syscall/address_space.cpp
|
syscall/address_space.cpp
|
||||||
|
syscall/capability.cpp
|
||||||
syscall/channel.cpp
|
syscall/channel.cpp
|
||||||
|
syscall/debug.cpp
|
||||||
syscall/memory_object.cpp
|
syscall/memory_object.cpp
|
||||||
syscall/port.cpp
|
syscall/port.cpp
|
||||||
syscall/process.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);
|
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
|
#define Z_IRQ_PCI_BASE 0x30
|
||||||
|
|
||||||
// Capability Calls
|
// Capability Calls
|
||||||
#define Z_CAP_DUPLICATE 0x60
|
const uint64_t kZionCapDuplicate = 0x70;
|
||||||
|
|
||||||
// Debugging Calls.
|
// Debugging Calls.
|
||||||
#define Z_DEBUG_PRINT 0x10000000
|
const uint64_t kZionDebug = 0x1'0000;
|
||||||
|
|
||||||
/* ------------------------------
|
/* ------------------------------
|
||||||
* Capability Types
|
* 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/process_manager.h"
|
||||||
#include "scheduler/scheduler.h"
|
#include "scheduler/scheduler.h"
|
||||||
#include "syscall/address_space.h"
|
#include "syscall/address_space.h"
|
||||||
|
#include "syscall/capability.h"
|
||||||
#include "syscall/channel.h"
|
#include "syscall/channel.h"
|
||||||
|
#include "syscall/debug.h"
|
||||||
#include "syscall/memory_object.h"
|
#include "syscall/memory_object.h"
|
||||||
#include "syscall/port.h"
|
#include "syscall/port.h"
|
||||||
#include "syscall/process.h"
|
#include "syscall/process.h"
|
||||||
|
@ -63,16 +65,6 @@ z_err_t ValidateCap(const RefPtr<Capability>& cap, uint64_t permissions) {
|
||||||
return Z_OK;
|
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) \
|
#define CASE(name) \
|
||||||
case kZion##name: \
|
case kZion##name: \
|
||||||
return name(reinterpret_cast<Z##name##Req*>(req));
|
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(PortRecv);
|
||||||
CASE(PortPoll);
|
CASE(PortPoll);
|
||||||
CASE(IrqRegister);
|
CASE(IrqRegister);
|
||||||
case Z_CAP_DUPLICATE:
|
// syscall/capability.h
|
||||||
return CapDuplicate(reinterpret_cast<ZCapDuplicateReq*>(req),
|
CASE(CapDuplicate);
|
||||||
reinterpret_cast<ZCapDuplicateResp*>(resp));
|
// syscall/debug.h
|
||||||
case Z_DEBUG_PRINT:
|
CASE(Debug);
|
||||||
dbgln("[Debug] %s", req);
|
|
||||||
return Z_OK;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
panic("Unhandled syscall number: %x", call_id);
|
panic("Unhandled syscall number: %x", call_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,29 +4,8 @@
|
||||||
|
|
||||||
#include "usr/zcall_internal.h"
|
#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;
|
z_err_t return_code;
|
||||||
asm("syscall"
|
asm("syscall" : "=a"(return_code) : "D"(number), "S"(first) : "rcx", "r11");
|
||||||
: "=a"(return_code)
|
|
||||||
: "D"(number), "S"(first), "d"(second)
|
|
||||||
: "rcx", "r11");
|
|
||||||
return return_code;
|
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;
|
uint64_t num_caps;
|
||||||
z_cap_t* caps;
|
z_cap_t* caps;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZCapDuplicateReq {
|
|
||||||
z_cap_t cap;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ZCapDuplicateResp {
|
|
||||||
z_cap_t cap;
|
|
||||||
};
|
|
||||||
|
|
Loading…
Reference in New Issue