From c4f51fd8528e1dec6713cd32e982e11e865d28bc Mon Sep 17 00:00:00 2001 From: Paul Cercueil Date: Thu, 27 Jul 2023 11:32:58 +0200 Subject: [PATCH] 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 --- libpcsxcore/lightrec/plugin.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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) -- 2.39.2