[Zion] Add a syscall to get a memory object's length.
This commit is contained in:
parent
30b6511467
commit
2e4a12661d
|
@ -30,6 +30,7 @@ SYS3(MemoryObjectCreateContiguous, uint64_t, size, z_cap_t*, vmmo_cap,
|
||||||
|
|
||||||
SYS4(MemoryObjectDuplicate, z_cap_t, vmmo_cap, uint64_t, base_offset, uint64_t,
|
SYS4(MemoryObjectDuplicate, z_cap_t, vmmo_cap, uint64_t, base_offset, uint64_t,
|
||||||
length, z_cap_t*, new_vmmo_cap);
|
length, z_cap_t*, new_vmmo_cap);
|
||||||
|
SYS2(MemoryObjectInspect, z_cap_t, vmmo_cap, uint64_t*, size);
|
||||||
|
|
||||||
SYS2(ChannelCreate, z_cap_t*, channel1, z_cap_t*, channel2);
|
SYS2(ChannelCreate, z_cap_t*, channel1, z_cap_t*, channel2);
|
||||||
SYS5(ChannelSend, z_cap_t, chan_cap, uint64_t, num_bytes, const void*, data,
|
SYS5(ChannelSend, z_cap_t, chan_cap, uint64_t, num_bytes, const void*, data,
|
||||||
|
|
|
@ -28,6 +28,7 @@ const uint64_t kZionMemoryObjectCreatePhysical = 0x31;
|
||||||
const uint64_t kZionMemoryObjectCreateContiguous = 0x32;
|
const uint64_t kZionMemoryObjectCreateContiguous = 0x32;
|
||||||
|
|
||||||
const uint64_t kZionMemoryObjectDuplicate = 0x38;
|
const uint64_t kZionMemoryObjectDuplicate = 0x38;
|
||||||
|
const uint64_t kZionMemoryObjectInspect = 0x39;
|
||||||
|
|
||||||
// IPC Calls
|
// IPC Calls
|
||||||
const uint64_t kZionChannelCreate = 0x40;
|
const uint64_t kZionChannelCreate = 0x40;
|
||||||
|
|
|
@ -33,7 +33,6 @@ z_err_t MemoryObjectCreateContiguous(ZMemoryObjectCreateContiguousReq* req) {
|
||||||
z_err_t MemoryObjectDuplicate(ZMemoryObjectDuplicateReq* req) {
|
z_err_t MemoryObjectDuplicate(ZMemoryObjectDuplicateReq* req) {
|
||||||
auto& curr_proc = gScheduler->CurrentProcess();
|
auto& curr_proc = gScheduler->CurrentProcess();
|
||||||
auto vmmo_cap = curr_proc.GetCapability(req->vmmo_cap);
|
auto vmmo_cap = curr_proc.GetCapability(req->vmmo_cap);
|
||||||
// FIXME: Check a duplication permission here.
|
|
||||||
RET_ERR(ValidateCapability<MemoryObject>(vmmo_cap, kZionPerm_Duplicate));
|
RET_ERR(ValidateCapability<MemoryObject>(vmmo_cap, kZionPerm_Duplicate));
|
||||||
|
|
||||||
ASSIGN_OR_RETURN(
|
ASSIGN_OR_RETURN(
|
||||||
|
@ -43,3 +42,14 @@ z_err_t MemoryObjectDuplicate(ZMemoryObjectDuplicateReq* req) {
|
||||||
curr_proc.AddNewCapability(new_vmmo, vmmo_cap->permissions());
|
curr_proc.AddNewCapability(new_vmmo, vmmo_cap->permissions());
|
||||||
return glcr::OK;
|
return glcr::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
z_err_t MemoryObjectInspect(ZMemoryObjectInspectReq* req) {
|
||||||
|
auto& curr_proc = gScheduler->CurrentProcess();
|
||||||
|
auto vmmo_cap = curr_proc.GetCapability(req->vmmo_cap);
|
||||||
|
RET_ERR(ValidateCapability<MemoryObject>(vmmo_cap, kZionPerm_Read));
|
||||||
|
|
||||||
|
auto vmmo = vmmo_cap->obj<MemoryObject>();
|
||||||
|
*req->size = vmmo->size();
|
||||||
|
|
||||||
|
return glcr::OK;
|
||||||
|
}
|
||||||
|
|
|
@ -6,3 +6,4 @@ z_err_t MemoryObjectCreate(ZMemoryObjectCreateReq* req);
|
||||||
z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req);
|
z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req);
|
||||||
z_err_t MemoryObjectCreateContiguous(ZMemoryObjectCreateContiguousReq* req);
|
z_err_t MemoryObjectCreateContiguous(ZMemoryObjectCreateContiguousReq* req);
|
||||||
z_err_t MemoryObjectDuplicate(ZMemoryObjectDuplicateReq* req);
|
z_err_t MemoryObjectDuplicate(ZMemoryObjectDuplicateReq* req);
|
||||||
|
z_err_t MemoryObjectInspect(ZMemoryObjectInspectReq* req);
|
||||||
|
|
|
@ -66,6 +66,7 @@ extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req) {
|
||||||
CASE(MemoryObjectCreatePhysical);
|
CASE(MemoryObjectCreatePhysical);
|
||||||
CASE(MemoryObjectCreateContiguous);
|
CASE(MemoryObjectCreateContiguous);
|
||||||
CASE(MemoryObjectDuplicate);
|
CASE(MemoryObjectDuplicate);
|
||||||
|
CASE(MemoryObjectInspect);
|
||||||
// syscall/ipc.h
|
// syscall/ipc.h
|
||||||
CASE(ChannelCreate);
|
CASE(ChannelCreate);
|
||||||
CASE(ChannelSend);
|
CASE(ChannelSend);
|
||||||
|
|
Loading…
Reference in New Issue