Add a syscall for creating a physical memory VMO
This commit is contained in:
parent
50201fe6df
commit
47e3d11060
|
@ -31,6 +31,7 @@
|
||||||
#define Z_INIT_VMAS_SELF 0x20
|
#define Z_INIT_VMAS_SELF 0x20
|
||||||
|
|
||||||
#define Z_MEMORY_OBJECT_CREATE 0x30
|
#define Z_MEMORY_OBJECT_CREATE 0x30
|
||||||
|
#define Z_MEMORY_OBJECT_CREATE_PHYSICAL 0x31
|
||||||
|
|
||||||
#define Z_TEMP_PCIE_CONFIG_OBJECT_CREATE 0x3F
|
#define Z_TEMP_PCIE_CONFIG_OBJECT_CREATE 0x3F
|
||||||
|
|
||||||
|
@ -67,6 +68,8 @@ void ZThreadExit();
|
||||||
[[nodiscard]] z_err_t ZAddressSpaceMap(uint64_t vmas_cap, uint64_t vmas_offset,
|
[[nodiscard]] z_err_t ZAddressSpaceMap(uint64_t vmas_cap, uint64_t vmas_offset,
|
||||||
uint64_t vmmo_cap, uint64_t* vaddr);
|
uint64_t vmmo_cap, uint64_t* vaddr);
|
||||||
[[nodiscard]] z_err_t ZMemoryObjectCreate(uint64_t size, uint64_t* vmmo_cap);
|
[[nodiscard]] z_err_t ZMemoryObjectCreate(uint64_t size, uint64_t* vmmo_cap);
|
||||||
|
[[nodiscard]] z_err_t ZMemoryObjectCreatePhysical(uint64_t paddr, uint64_t size,
|
||||||
|
uint64_t* vmmo_cap);
|
||||||
[[nodiscard]] z_err_t ZTempPcieConfigObjectCreate(uint64_t* vmmo_cap,
|
[[nodiscard]] z_err_t ZTempPcieConfigObjectCreate(uint64_t* vmmo_cap,
|
||||||
uint64_t* vmmo_size);
|
uint64_t* vmmo_size);
|
||||||
|
|
||||||
|
|
|
@ -130,14 +130,20 @@ z_err_t MemoryObjectCreate(ZMemoryObjectCreateReq* req,
|
||||||
return Z_OK;
|
return Z_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
z_err_t MemoryObjectCreatePhysical(ZMemoryObjectCreatePhysicalReq* req,
|
||||||
|
ZMemoryObjectCreateResp* resp) {
|
||||||
|
auto& curr_proc = gScheduler->CurrentProcess();
|
||||||
|
auto vmmo_ref = MakeRefCounted<FixedMemoryObject>(req->paddr, req->size);
|
||||||
|
resp->vmmo_cap =
|
||||||
|
curr_proc.AddCapability(StaticCastRefPtr<MemoryObject>(vmmo_ref));
|
||||||
|
return Z_OK;
|
||||||
|
}
|
||||||
|
|
||||||
z_err_t TempPcieConfigObjectCreate(ZTempPcieConfigObjectCreateResp* resp) {
|
z_err_t TempPcieConfigObjectCreate(ZTempPcieConfigObjectCreateResp* resp) {
|
||||||
auto& curr_proc = gScheduler->CurrentProcess();
|
auto& curr_proc = gScheduler->CurrentProcess();
|
||||||
uint64_t pci_base, pci_size;
|
uint64_t pci_base, pci_size;
|
||||||
dbgln("Getting config");
|
|
||||||
RET_ERR(GetPciExtendedConfiguration(&pci_base, &pci_size));
|
RET_ERR(GetPciExtendedConfiguration(&pci_base, &pci_size));
|
||||||
dbgln("Making obj");
|
|
||||||
auto vmmo_ref = MakeRefCounted<FixedMemoryObject>(pci_base, pci_size);
|
auto vmmo_ref = MakeRefCounted<FixedMemoryObject>(pci_base, pci_size);
|
||||||
dbgln("Adding cap");
|
|
||||||
resp->vmmo_cap =
|
resp->vmmo_cap =
|
||||||
curr_proc.AddCapability(StaticCastRefPtr<MemoryObject>(vmmo_ref));
|
curr_proc.AddCapability(StaticCastRefPtr<MemoryObject>(vmmo_ref));
|
||||||
resp->vmmo_size = pci_size;
|
resp->vmmo_size = pci_size;
|
||||||
|
@ -201,6 +207,10 @@ extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req, void* resp) {
|
||||||
return MemoryObjectCreate(
|
return MemoryObjectCreate(
|
||||||
reinterpret_cast<ZMemoryObjectCreateReq*>(req),
|
reinterpret_cast<ZMemoryObjectCreateReq*>(req),
|
||||||
reinterpret_cast<ZMemoryObjectCreateResp*>(resp));
|
reinterpret_cast<ZMemoryObjectCreateResp*>(resp));
|
||||||
|
case Z_MEMORY_OBJECT_CREATE_PHYSICAL:
|
||||||
|
return MemoryObjectCreatePhysical(
|
||||||
|
reinterpret_cast<ZMemoryObjectCreatePhysicalReq*>(req),
|
||||||
|
reinterpret_cast<ZMemoryObjectCreateResp*>(resp));
|
||||||
case Z_TEMP_PCIE_CONFIG_OBJECT_CREATE:
|
case Z_TEMP_PCIE_CONFIG_OBJECT_CREATE:
|
||||||
return TempPcieConfigObjectCreate(
|
return TempPcieConfigObjectCreate(
|
||||||
reinterpret_cast<ZTempPcieConfigObjectCreateResp*>(resp));
|
reinterpret_cast<ZTempPcieConfigObjectCreateResp*>(resp));
|
||||||
|
|
|
@ -73,6 +73,7 @@ z_err_t ZAddressSpaceMap(uint64_t vmas_cap, uint64_t vmas_offset,
|
||||||
*vaddr = resp.vaddr;
|
*vaddr = resp.vaddr;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
z_err_t ZMemoryObjectCreate(uint64_t size, uint64_t* vmmo_cap) {
|
z_err_t ZMemoryObjectCreate(uint64_t size, uint64_t* vmmo_cap) {
|
||||||
ZMemoryObjectCreateReq req{
|
ZMemoryObjectCreateReq req{
|
||||||
.size = size,
|
.size = size,
|
||||||
|
@ -83,6 +84,18 @@ z_err_t ZMemoryObjectCreate(uint64_t size, uint64_t* vmmo_cap) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
z_err_t ZMemoryObjectCreatePhysical(uint64_t paddr, uint64_t size,
|
||||||
|
uint64_t* vmmo_cap) {
|
||||||
|
ZMemoryObjectCreatePhysicalReq req{
|
||||||
|
.paddr = paddr,
|
||||||
|
.size = size,
|
||||||
|
};
|
||||||
|
ZMemoryObjectCreateResp resp;
|
||||||
|
z_err_t ret = SysCall2(Z_MEMORY_OBJECT_CREATE_PHYSICAL, &req, &resp);
|
||||||
|
*vmmo_cap = resp.vmmo_cap;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
z_err_t ZTempPcieConfigObjectCreate(uint64_t* vmmo_cap, uint64_t* vmmo_size) {
|
z_err_t ZTempPcieConfigObjectCreate(uint64_t* vmmo_cap, uint64_t* vmmo_size) {
|
||||||
ZTempPcieConfigObjectCreateResp resp;
|
ZTempPcieConfigObjectCreateResp resp;
|
||||||
z_err_t ret = SysCall2(Z_TEMP_PCIE_CONFIG_OBJECT_CREATE, 0, &resp);
|
z_err_t ret = SysCall2(Z_TEMP_PCIE_CONFIG_OBJECT_CREATE, 0, &resp);
|
||||||
|
|
|
@ -46,6 +46,11 @@ struct ZMemoryObjectCreateResp {
|
||||||
uint64_t vmmo_cap;
|
uint64_t vmmo_cap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ZMemoryObjectCreatePhysicalReq {
|
||||||
|
uint64_t paddr;
|
||||||
|
uint64_t size;
|
||||||
|
};
|
||||||
|
|
||||||
struct ZTempPcieConfigObjectCreateResp {
|
struct ZTempPcieConfigObjectCreateResp {
|
||||||
uint64_t vmmo_cap;
|
uint64_t vmmo_cap;
|
||||||
uint64_t vmmo_size;
|
uint64_t vmmo_size;
|
||||||
|
|
Loading…
Reference in New Issue