MMU: Move the lookup tables to the heap in 64-bit builds and free them on exit in 32-bit builds, prevents memory leaks.

This commit is contained in:
OBattler
2025-06-25 19:35:59 +02:00
parent 609a7e4549
commit 495ee9b931
3 changed files with 46 additions and 0 deletions

View File

@@ -1656,6 +1656,10 @@ pc_close(UNUSED(thread_t *ptr))
scsi_disk_close(); scsi_disk_close();
gdbstub_close(); gdbstub_close();
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
mem_free();
#endif
} }
#ifdef __APPLE__ #ifdef __APPLE__

View File

@@ -265,12 +265,16 @@ extern uint32_t biosmask;
extern uint32_t biosaddr; extern uint32_t biosaddr;
extern int readlookup[256]; extern int readlookup[256];
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
extern uintptr_t *readlookup2; extern uintptr_t *readlookup2;
#endif
extern uintptr_t old_rl2; extern uintptr_t old_rl2;
extern uint8_t uncached; extern uint8_t uncached;
extern int readlnext; extern int readlnext;
extern int writelookup[256]; extern int writelookup[256];
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
extern uintptr_t *writelookup2; extern uintptr_t *writelookup2;
#endif
extern int writelnext; extern int writelnext;
extern uint32_t ram_mapped_addr[64]; extern uint32_t ram_mapped_addr[64];
extern uint8_t page_ff[4096]; extern uint8_t page_ff[4096];
@@ -288,7 +292,16 @@ extern mem_mapping_t bios_high_mapping;
extern uint32_t mem_logical_addr; extern uint32_t mem_logical_addr;
extern page_t *pages; extern page_t *pages;
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
extern page_t **page_lookup; extern page_t **page_lookup;
#endif
#if (defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64)
/* The lookup tables. */
extern page_t *page_lookup[1048576];
extern uintptr_t readlookup2[1048576];
extern uintptr_t writelookup2[1048576];
#endif
extern uint32_t get_phys_virt; extern uint32_t get_phys_virt;
extern uint32_t get_phys_phys; extern uint32_t get_phys_phys;
@@ -457,6 +470,9 @@ extern void mem_a20_init(void);
extern void mem_a20_recalc(void); extern void mem_a20_recalc(void);
extern void mem_init(void); extern void mem_init(void);
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
extern void mem_free(void);
#endif
extern void mem_close(void); extern void mem_close(void);
extern void mem_zero(void); extern void mem_zero(void);
extern void mem_reset(void); extern void mem_reset(void);

View File

@@ -67,7 +67,9 @@ mem_mapping_t bios_mapping;
mem_mapping_t bios_high_mapping; mem_mapping_t bios_high_mapping;
page_t *pages; /* RAM page table */ page_t *pages; /* RAM page table */
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
page_t **page_lookup; /* pagetable lookup */ page_t **page_lookup; /* pagetable lookup */
#endif
uint32_t pages_sz; /* #pages in table */ uint32_t pages_sz; /* #pages in table */
uint8_t *ram; /* the virtual RAM */ uint8_t *ram; /* the virtual RAM */
@@ -85,12 +87,23 @@ uint8_t *pccache2;
int readlnext; int readlnext;
int readlookup[256]; int readlookup[256];
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
uintptr_t *readlookup2; uintptr_t *readlookup2;
#endif
uintptr_t old_rl2; uintptr_t old_rl2;
uint8_t uncached = 0; uint8_t uncached = 0;
int writelnext; int writelnext;
int writelookup[256]; int writelookup[256];
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
uintptr_t *writelookup2; uintptr_t *writelookup2;
#endif
#if (defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64)
/* The lookup tables. */
page_t *page_lookup[1048576] = { 0 };
uintptr_t readlookup2[1048576] = { 0 };
uintptr_t writelookup2[1048576] = { 0 };
#endif
uint32_t mem_logical_addr; uint32_t mem_logical_addr;
@@ -2987,12 +3000,25 @@ mem_init(void)
ram2 = NULL; ram2 = NULL;
pages = NULL; pages = NULL;
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
/* Allocate the lookup tables. */ /* Allocate the lookup tables. */
page_lookup = (page_t **) malloc((1 << 20) * sizeof(page_t *)); page_lookup = (page_t **) malloc((1 << 20) * sizeof(page_t *));
readlookup2 = malloc((1 << 20) * sizeof(uintptr_t)); readlookup2 = malloc((1 << 20) * sizeof(uintptr_t));
writelookup2 = malloc((1 << 20) * sizeof(uintptr_t)); writelookup2 = malloc((1 << 20) * sizeof(uintptr_t));
#endif
} }
#if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64))
void
mem_free(void)
{
free(page_lookup);
free(readlookup2);
free(writelookup2);
}
#endif
static void static void
umc_page_recalc(uint32_t c, uint32_t phys, int set) umc_page_recalc(uint32_t c, uint32_t phys, int set)
{ {