lightrec: Add mirror to parallel port
[pcsx_rearmed.git] / libpcsxcore / lightrec / plugin.c
index 8d96c0a..ff74352 100644 (file)
@@ -6,6 +6,10 @@
 #include <signal.h>
 #include <assert.h>
 
+#if P_HAVE_MMAP
+#include <sys/mman.h>
+#endif
+
 #include "../cdrom.h"
 #include "../gpu.h"
 #include "../gte.h"
@@ -287,7 +291,7 @@ static struct lightrec_mem_map lightrec_map[] = {
        [PSX_MAP_HW_REGISTERS] = {
                /* Hardware registers */
                .pc = 0x1f801000,
-               .length = 0x2000,
+               .length = 0x8000,
                .ops = &hw_regs_ops,
        },
        [PSX_MAP_CACHE_CONTROL] = {
@@ -313,6 +317,15 @@ static struct lightrec_mem_map lightrec_map[] = {
                .length = 0x200000,
                .mirror_of = &lightrec_map[PSX_MAP_KERNEL_USER_RAM],
        },
+
+       /* Mirror of the parallel port. Only used by the PS2/PS3 BIOS */
+       [PSX_MAP_PPORT_MIRROR] = {
+               .pc = 0x1fa00000,
+               .length = 0x10000,
+               .mirror_of = &lightrec_map[PSX_MAP_PARALLEL_PORT],
+       },
+
+       /* Code buffer */
        [PSX_MAP_CODE_BUFFER] = {
                .length = CODE_BUFFER_SIZE,
        },
@@ -436,9 +449,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 +592,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)