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 <paul@crapouillou.net>
#include <signal.h>
#include <assert.h>
#include <signal.h>
#include <assert.h>
+#if P_HAVE_MMAP
+#include <sys/mman.h>
+#endif
+
#include "../cdrom.h"
#include "../gpu.h"
#include "../gte.h"
#include "../cdrom.h"
#include "../gpu.h"
#include "../gte.h"
lightrec_map[PSX_MAP_PARALLEL_PORT].address = psxP;
if (!LIGHTREC_CUSTOM_MAP) {
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;
code_buffer = malloc(CODE_BUFFER_SIZE);
if (!code_buffer)
return -ENOMEM;
}
if (LIGHTREC_CUSTOM_MAP) {
}
if (LIGHTREC_CUSTOM_MAP) {
{
lightrec_destroy(lightrec_state);
{
lightrec_destroy(lightrec_state);
- if (!LIGHTREC_CUSTOM_MAP)
+ if (!LIGHTREC_CUSTOM_MAP) {
+#if P_HAVE_MMAP
+ munmap(code_buffer, CODE_BUFFER_SIZE);
+#else
}
static void lightrec_plugin_reset(void)
}
static void lightrec_plugin_reset(void)