[Zion] Add an argument to memory align a mapping.

This commit is contained in:
Drew Galbraith 2023-11-23 18:49:01 -08:00
parent c8931a01c8
commit d44be91099
11 changed files with 30 additions and 22 deletions

View file

@ -17,8 +17,8 @@ SYS4(ThreadStart, z_cap_t, thread_cap, uint64_t, entry, uint64_t, arg1,
SYS0(ThreadExit);
SYS1(ThreadWait, z_cap_t, thread_cap);
SYS4(AddressSpaceMap, z_cap_t, vmas_cap, uint64_t, vmas_offset, z_cap_t,
vmmo_cap, uint64_t*, vaddr);
SYS5(AddressSpaceMap, z_cap_t, vmas_cap, uint64_t, vmas_offset, z_cap_t,
vmmo_cap, uint64_t, align, uint64_t*, vaddr);
SYS3(AddressSpaceUnmap, z_cap_t, vmas_cap, uint64_t, lower_addr, uint64_t,
upper_addr);
@ -68,4 +68,4 @@ SYS1(SemaphoreCreate, z_cap_t*, semaphore_cap);
SYS1(SemaphoreWait, z_cap_t, semaphore_cap);
SYS1(SemaphoreSignal, z_cap_t, semaphore_cap);
SYS1(Debug, const char*, message);
SYS2(Debug, const char*, message, uint64_t, size);

View file

@ -26,11 +26,17 @@ void AddressSpace::FreeUserStack(uint64_t rsp) {
return user_stacks_.FreeUserStack(rsp);
}
uint64_t AddressSpace::GetNextMemMapAddr(uint64_t size) {
uint64_t AddressSpace::GetNextMemMapAddr(uint64_t size, uint64_t align) {
if (size == 0) {
panic("Zero size memmap");
}
size = ((size - 1) & ~0xFFF) + 0x1000;
// FIXME: We need to validate that align is a power of 2;
if (align > 0) {
while ((next_memmap_addr_ & (align - 1)) != 0) {
next_memmap_addr_ += kPageSize;
}
}
uint64_t addr = next_memmap_addr_;
next_memmap_addr_ += size;
if (next_memmap_addr_ >= 0x30'00000000) {
@ -45,8 +51,8 @@ glcr::ErrorCode AddressSpace::MapInMemoryObject(
}
glcr::ErrorOr<uint64_t> AddressSpace::MapInMemoryObject(
const glcr::RefPtr<MemoryObject>& mem_obj) {
uint64_t vaddr = GetNextMemMapAddr(mem_obj->size());
const glcr::RefPtr<MemoryObject>& mem_obj, uint64_t align) {
uint64_t vaddr = GetNextMemMapAddr(mem_obj->size(), align);
RET_ERR(mapping_tree_.AddInMemoryObject(vaddr, mem_obj));
return vaddr;
}

View file

@ -67,7 +67,7 @@ class AddressSpace : public KernelObject {
// User Mappings.
uint64_t AllocateUserStack();
void FreeUserStack(uint64_t);
uint64_t GetNextMemMapAddr(uint64_t size);
uint64_t GetNextMemMapAddr(uint64_t size, uint64_t align);
// Maps in a memory object at a specific address.
// Note this is unsafe for now as it may clobber other mappings.
@ -75,7 +75,7 @@ class AddressSpace : public KernelObject {
uint64_t vaddr, const glcr::RefPtr<MemoryObject>& mem_obj);
[[nodiscard]] glcr::ErrorOr<uint64_t> MapInMemoryObject(
const glcr::RefPtr<MemoryObject>& mem_obj);
const glcr::RefPtr<MemoryObject>& mem_obj, uint64_t align);
[[nodiscard]] glcr::ErrorCode FreeAddressRange(uint64_t vaddr_base,
uint64_t vaddr_limit) {

View file

@ -18,7 +18,7 @@ z_err_t AddressSpaceMap(ZAddressSpaceMapReq* req) {
RET_ERR(vmas->MapInMemoryObject(req->vmas_offset, vmmo));
*req->vaddr = req->vmas_offset;
} else {
ASSIGN_OR_RETURN(*req->vaddr, vmas->MapInMemoryObject(vmmo));
ASSIGN_OR_RETURN(*req->vaddr, vmas->MapInMemoryObject(vmmo, req->align));
}
return glcr::OK;
}

View file

@ -5,6 +5,6 @@
#include "debug/debug.h"
z_err_t Debug(ZDebugReq* req) {
dbgln_large("[Debug] {}", req->message);
dbgln_large("[Debug] {}", glcr::StringView(req->message, req->size));
return glcr::OK;
}