From: Paul Cercueil Date: Thu, 27 Jul 2023 09:32:58 +0000 (+0200) Subject: lightrec: use mmap() for code buffer if possible X-Git-Tag: r24l~276^2 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;ds=sidebyside;h=c4f51fd8528e1dec6713cd32e982e11e865d28bc;p=pcsx_rearmed.git lightrec: use mmap() for code buffer if possible When not using the custom memory map, the code buffer was simply malloc'd. This only works if the memory returned has no protection, which is not the case e.g. on Linux. If mmap() is available, use it to allocate the code buffer, so that the proper memory protection flags can be used. Signed-off-by: Paul Cercueil --- diff --git a/libpcsxcore/lightrec/plugin.c b/libpcsxcore/lightrec/plugin.c index 8d96c0a3..72201c16 100644 --- a/libpcsxcore/lightrec/plugin.c +++ b/libpcsxcore/lightrec/plugin.c @@ -6,6 +6,10 @@ #include #include +#if P_HAVE_MMAP +#include +#endif + #include "../cdrom.h" #include "../gpu.h" #include "../gte.h" @@ -436,9 +440,17 @@ static int lightrec_plugin_init(void) lightrec_map[PSX_MAP_PARALLEL_PORT].address = psxP; if (!LIGHTREC_CUSTOM_MAP) { +#if P_HAVE_MMAP + code_buffer = mmap(0, CODE_BUFFER_SIZE, + PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (code_buffer == MAP_FAILED) + return -ENOMEM; +#else code_buffer = malloc(CODE_BUFFER_SIZE); if (!code_buffer) return -ENOMEM; +#endif } if (LIGHTREC_CUSTOM_MAP) { @@ -571,8 +583,13 @@ static void lightrec_plugin_shutdown(void) { lightrec_destroy(lightrec_state); - if (!LIGHTREC_CUSTOM_MAP) + if (!LIGHTREC_CUSTOM_MAP) { +#if P_HAVE_MMAP + munmap(code_buffer, CODE_BUFFER_SIZE); +#else free(code_buffer); +#endif + } } static void lightrec_plugin_reset(void)