X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Flightrec%2Fmem.c;h=9134d893916100053d7566a56fbfecec71e419a6;hb=5937ccce520c4bddc986f741737465e2e8d94605;hp=c7fa7da7360ad31ed5257da3c1fc56a4c1281164;hpb=8ab1a4e86a4f27ec90ca3d3673a78a894788e607;p=pcsx_rearmed.git diff --git a/libpcsxcore/lightrec/mem.c b/libpcsxcore/lightrec/mem.c index c7fa7da7..9134d893 100644 --- a/libpcsxcore/lightrec/mem.c +++ b/libpcsxcore/lightrec/mem.c @@ -3,6 +3,9 @@ * Copyright (C) 2022 Paul Cercueil */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif #include #include #include @@ -11,6 +14,7 @@ #include #include #include +#include #include #include "../psxhw.h" @@ -51,8 +55,12 @@ static void * mmap_huge(void *addr, size_t length, int prot, int flags, if (map == MAP_FAILED) { map = mmap(addr, length, prot, flags, fd, offset); - if (map != MAP_FAILED) + if (map != MAP_FAILED) { printf("Regular mmap to address 0x%lx succeeded\n", (uintptr_t) addr); +#ifdef MADV_HUGEPAGE + madvise(map, length, MADV_HUGEPAGE); +#endif + } } return map; @@ -68,7 +76,8 @@ static int lightrec_mmap_ram(bool hugetlb) if (hugetlb) flags |= MFD_HUGETLB; - memfd = memfd_create("/lightrec_memfd", flags); + memfd = syscall(SYS_memfd_create, "/lightrec_memfd", + flags); if (memfd < 0) { err = -errno; fprintf(stderr, "Failed to create memfd: %d\n", err); @@ -86,11 +95,16 @@ static int lightrec_mmap_ram(bool hugetlb) base = supported_io_bases[i]; for (j = 0; j < 4; j++) { - map = mmap_huge((void *)(base + j * 0x200000), - 0x200000, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_FIXED, memfd, 0); + void *base_ptr = (void *)(base + j * 0x200000); + map = mmap_huge(base_ptr, 0x200000, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_FIXED_NOREPLACE, memfd, 0); if (map == MAP_FAILED) break; + // some systems ignore MAP_FIXED_NOREPLACE + if (map != base_ptr) { + munmap(map, 0x200000); + break; + } } /* Impossible to map using this base */ @@ -124,9 +138,7 @@ int lightrec_init_mmap(void) unsigned int i; uintptr_t base; void *map; - int err; - - err = lightrec_mmap_ram(true); + int err = lightrec_mmap_ram(true); if (err) { err = lightrec_mmap_ram(false); if (err) { @@ -139,7 +151,7 @@ int lightrec_init_mmap(void) map = mmap((void *)(base + 0x1f000000), 0x10000, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS, 0, 0); + MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS, -1, 0); if (map == MAP_FAILED) { err = -EINVAL; fprintf(stderr, "Unable to mmap parallel port\n"); @@ -150,7 +162,7 @@ int lightrec_init_mmap(void) map = mmap_huge((void *)(base + 0x1fc00000), 0x200000, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS, 0, 0); + MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS, -1, 0); if (map == MAP_FAILED) { err = -EINVAL; fprintf(stderr, "Unable to mmap BIOS\n"); @@ -170,10 +182,24 @@ int lightrec_init_mmap(void) psxH = (s8 *)map; + map = mmap_huge((void *)(base + 0x800000), CODE_BUFFER_SIZE, + PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED_NOREPLACE | MAP_ANONYMOUS, + -1, 0); + if (map == MAP_FAILED) { + err = -EINVAL; + fprintf(stderr, "Unable to mmap code buffer\n"); + goto err_unmap_scratch; + } + + code_buffer = map; + return 0; +err_unmap_scratch: + munmap(psxH, 0x10000); err_unmap_bios: - munmap(psxR, 0x80000); + munmap(psxR, 0x200000); err_unmap_parallel: munmap(psxP, 0x10000); err_unmap: @@ -186,8 +212,9 @@ void lightrec_free_mmap(void) { unsigned int i; + munmap(code_buffer, CODE_BUFFER_SIZE); munmap(psxH, 0x10000); - munmap(psxR, 0x80000); + munmap(psxR, 0x200000); munmap(psxP, 0x10000); for (i = 0; i < 4; i++) munmap((void *)((uintptr_t)psxM + i * 0x200000), 0x200000);