vmem: unmap all reserved vmem at exit
This commit is contained in:
parent
efdc92479a
commit
17501e880e
|
@ -144,6 +144,8 @@ static int allocate_shared_filemem(unsigned size) {
|
|||
|
||||
int vmem_fd = -1;
|
||||
static int shmem_fd2 = -1;
|
||||
static void *reserved_base;
|
||||
static size_t reserved_size;
|
||||
|
||||
// vmem_base_addr points to an address space of 512MB (or 4GB) that can be used for fast memory ops.
|
||||
// In negative offsets of the pointer (up to FPCB size, usually 65/129MB) the context and jump table
|
||||
|
@ -156,18 +158,17 @@ VMemType vmem_platform_init(void **vmem_base_addr, void **sh4rcb_addr) {
|
|||
return MemTypeError;
|
||||
|
||||
// Now try to allocate a contiguous piece of memory.
|
||||
void *first_ptr = NULL;
|
||||
VMemType rv;
|
||||
#ifdef HOST_64BIT_CPU
|
||||
size_t bigsize = 0x100000000L + sizeof(Sh4RCB) + 0x10000; // 4GB + context size + 64K padding
|
||||
first_ptr = mem_region_reserve(NULL, bigsize);
|
||||
reserved_size = 0x100000000L + sizeof(Sh4RCB) + 0x10000; // 4GB + context size + 64K padding
|
||||
reserved_base = mem_region_reserve(NULL, reserved_size);
|
||||
rv = MemType4GB;
|
||||
#endif
|
||||
if (first_ptr == NULL)
|
||||
if (reserved_base == NULL)
|
||||
{
|
||||
unsigned memsize = 512*1024*1024 + sizeof(Sh4RCB) + ARAM_SIZE_MAX + 0x10000;
|
||||
first_ptr = mem_region_reserve(NULL, memsize);
|
||||
if (!first_ptr) {
|
||||
reserved_size = 512*1024*1024 + sizeof(Sh4RCB) + ARAM_SIZE_MAX + 0x10000;
|
||||
reserved_base = mem_region_reserve(NULL, reserved_size);
|
||||
if (!reserved_base) {
|
||||
close(vmem_fd);
|
||||
return MemTypeError;
|
||||
}
|
||||
|
@ -175,7 +176,7 @@ VMemType vmem_platform_init(void **vmem_base_addr, void **sh4rcb_addr) {
|
|||
}
|
||||
|
||||
// Align pointer to 64KB too, some Linaro bug (no idea but let's just be safe I guess).
|
||||
uintptr_t ptrint = (uintptr_t)first_ptr;
|
||||
uintptr_t ptrint = (uintptr_t)reserved_base;
|
||||
ptrint = (ptrint + 0x10000 - 1) & (~0xffff);
|
||||
*sh4rcb_addr = (void*)ptrint;
|
||||
*vmem_base_addr = (void*)(ptrint + sizeof(Sh4RCB));
|
||||
|
@ -190,10 +191,8 @@ VMemType vmem_platform_init(void **vmem_base_addr, void **sh4rcb_addr) {
|
|||
|
||||
// Just tries to wipe as much as possible in the relevant area.
|
||||
void vmem_platform_destroy() {
|
||||
if (vmem_4gb_space)
|
||||
mem_region_release(virt_ram_base, (size_t)0x100000000);
|
||||
else
|
||||
mem_region_release(virt_ram_base, 0x20000000);
|
||||
if (reserved_base != NULL)
|
||||
mem_region_release(reserved_base, reserved_size);
|
||||
}
|
||||
|
||||
// Resets a chunk of memory by deleting its data and setting its protection back.
|
||||
|
|
Loading…
Reference in New Issue