libretro: satisfy vita's dynarec needs in a cleaner way
authornotaz <notasas@gmail.com>
Fri, 13 Oct 2017 20:36:51 +0000 (23:36 +0300)
committernotaz <notasas@gmail.com>
Fri, 13 Oct 2017 21:53:09 +0000 (00:53 +0300)
cpu/drc/cmn.c
cpu/drc/cmn.h
pico/pico.h
platform/libretro/libretro.c
platform/linux/emu.c

index acff42c..27ff981 100644 (file)
 #include <pico/pico_int.h>
 #include "cmn.h"
 
-u8 ALIGNED(4096) tcache[DRC_TCACHE_SIZE];
-
+u8 ALIGNED(4096) tcache_default[DRC_TCACHE_SIZE];
+u8 *tcache;
 
 void drc_cmn_init(void)
 {
-  int ret = plat_mem_set_exec(tcache, sizeof(tcache));
+  int ret;
+
+  tcache = plat_mem_get_for_drc(DRC_TCACHE_SIZE);
+  if (tcache == NULL)
+    tcache = tcache_default;
+
+  ret = plat_mem_set_exec(tcache, DRC_TCACHE_SIZE);
   elprintf(EL_STATUS, "drc_cmn_init: %p, %zd bytes: %d",
-    tcache, sizeof(tcache), ret);
+    tcache, DRC_TCACHE_SIZE, ret);
 
 #ifdef __arm__
   if (PicoOpt & POPT_EN_DRC)
index 4737b74..8953edd 100644 (file)
@@ -5,7 +5,7 @@ typedef unsigned int   u32;
 
 #define DRC_TCACHE_SIZE         (2*1024*1024)
 
-extern u8 tcache[DRC_TCACHE_SIZE];
+extern u8 *tcache;
 
 void drc_cmn_init(void);
 void drc_cmn_cleanup(void);
index 527498e..f1687f5 100644 (file)
@@ -34,6 +34,9 @@ extern void cache_flush_d_inval_i(void *start_addr, void *end_addr);
 extern void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed);\r
 extern void *plat_mremap(void *ptr, size_t oldsize, size_t newsize);\r
 extern void  plat_munmap(void *ptr, size_t size);\r
+\r
+// memory for the dynarec; plat_mem_get_for_drc() can just return NULL\r
+extern void *plat_mem_get_for_drc(size_t size);\r
 extern int   plat_mem_set_exec(void *ptr, size_t size);\r
 \r
 // this one should handle display mode changes\r
index b683374..e7f588a 100644 (file)
@@ -98,6 +98,7 @@ void cache_flush_d_inval_i(void *start, void *end)
 {
 #ifdef __arm__
    size_t len = (char *)end - (char *)start;
+   (void)len;
 #if defined(__BLACKBERRY_QNX__)
    msync(start, end - start, MS_SYNC | MS_CACHE_ONLY | MS_INVALIDATE_ICACHE);
 #elif defined(__MACH__)
@@ -435,14 +436,25 @@ void plat_munmap(void *ptr, size_t size)
 }
 #endif
 
+// if NULL is returned, static buffer is used
+void *plat_mem_get_for_drc(size_t size)
+{
+   void *mem = NULL;
+#ifdef VITA
+   sceKernelGetMemBlockBase(sceBlock, &mem);
+#endif
+   return mem;
+}
+
 int plat_mem_set_exec(void *ptr, size_t size)
 {
+   int ret = -1;
 #ifdef _WIN32
-   int ret = VirtualProtect(ptr,size,PAGE_EXECUTE_READWRITE,0);
+   ret = VirtualProtect(ptr, size, PAGE_EXECUTE_READWRITE, 0);
    if (ret == 0 && log_cb)
-      log_cb(RETRO_LOG_ERROR, "mprotect(%p, %zd) failed: %d\n", ptr, size, 0);
+      log_cb(RETRO_LOG_ERROR, "VirtualProtect(%p, %d) failed: %d\n", ptr, (int)size,
+             GetLastError());
 #elif defined(_3DS)
-   int ret = -1;
    if (ctr_svchack_successful)
    {
       unsigned int currentHandle;
@@ -461,9 +473,9 @@ int plat_mem_set_exec(void *ptr, size_t size)
    }
 
 #elif defined(VITA)
-   int ret = sceKernelOpenVMDomain();
+   ret = sceKernelOpenVMDomain();
 #else
-   int ret = mprotect(ptr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
+   ret = mprotect(ptr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
    if (ret != 0 && log_cb)
       log_cb(RETRO_LOG_ERROR, "mprotect(%p, %zd) failed: %d\n", ptr, size, errno);
 #endif
@@ -1380,3 +1392,5 @@ void retro_deinit(void)
    vout_buf = NULL;
    PicoExit();
 }
+
+// vim:shiftwidth=3:ts=3:expandtab
index 5a97959..aee8d44 100644 (file)
@@ -203,3 +203,7 @@ void plat_wait_till_us(unsigned int us_to)
        }\r
 }\r
 \r
+void *plat_mem_get_for_drc(size_t size)\r
+{\r
+       return NULL;\r
+}\r