|
|
|
@ -117,11 +117,12 @@ void Process::ParseKernelCaps(const u32* kernel_caps, size_t len) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) {
|
|
|
|
|
// Allocate and map stack
|
|
|
|
|
// Allocate and map the main thread stack
|
|
|
|
|
// TODO(bunnei): This is heap area that should be allocated by the kernel and not mapped as part
|
|
|
|
|
// of the user address space.
|
|
|
|
|
vm_manager
|
|
|
|
|
.MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size,
|
|
|
|
|
std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size,
|
|
|
|
|
MemoryState::Heap)
|
|
|
|
|
.MapMemoryBlock(Memory::STACK_VADDR, std::make_shared<std::vector<u8>>(stack_size, 0), 0,
|
|
|
|
|
stack_size, MemoryState::Mapped)
|
|
|
|
|
.Unwrap();
|
|
|
|
|
misc_memory_used += stack_size;
|
|
|
|
|
memory_region->used += stack_size;
|
|
|
|
@ -153,9 +154,9 @@ void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Map CodeSet segments
|
|
|
|
|
MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::Code);
|
|
|
|
|
MapSegment(module_->rodata, VMAPermission::Read, MemoryState::Static);
|
|
|
|
|
MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::Static);
|
|
|
|
|
MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::CodeStatic);
|
|
|
|
|
MapSegment(module_->rodata, VMAPermission::Read, MemoryState::CodeMutable);
|
|
|
|
|
MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::CodeMutable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VAddr Process::GetLinearHeapAreaAddress() const {
|
|
|
|
@ -182,6 +183,8 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission per
|
|
|
|
|
// Initialize heap
|
|
|
|
|
heap_memory = std::make_shared<std::vector<u8>>();
|
|
|
|
|
heap_start = heap_end = target;
|
|
|
|
|
} else {
|
|
|
|
|
vm_manager.UnmapRange(heap_start, heap_end - heap_start);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If necessary, expand backing vector to cover new heap extents.
|
|
|
|
@ -201,7 +204,7 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission per
|
|
|
|
|
size, MemoryState::Heap));
|
|
|
|
|
vm_manager.Reprotect(vma, perms);
|
|
|
|
|
|
|
|
|
|
heap_used += size;
|
|
|
|
|
heap_used = size;
|
|
|
|
|
memory_region->used += size;
|
|
|
|
|
|
|
|
|
|
return MakeResult<VAddr>(heap_end - size);
|
|
|
|
@ -288,7 +291,7 @@ ResultCode Process::MirrorMemory(VAddr dst_addr, VAddr src_addr, u64 size) {
|
|
|
|
|
|
|
|
|
|
CASCADE_RESULT(auto new_vma,
|
|
|
|
|
vm_manager.MapMemoryBlock(dst_addr, backing_block, backing_block_offset, size,
|
|
|
|
|
vma->second.meminfo_state));
|
|
|
|
|
MemoryState::Mapped));
|
|
|
|
|
// Protect mirror with permissions from old region
|
|
|
|
|
vm_manager.Reprotect(new_vma, vma->second.permissions);
|
|
|
|
|
// Remove permissions from old region
|
|
|
|
|