libretro: satisfy vita's dynarec needs in a cleaner way

This commit is contained in:
notaz 2017-10-13 23:36:51 +03:00
parent 28a5b39232
commit df9251536d
5 changed files with 39 additions and 12 deletions

View file

@ -10,14 +10,20 @@
#include <pico/pico_int.h> #include <pico/pico_int.h>
#include "cmn.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) 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", elprintf(EL_STATUS, "drc_cmn_init: %p, %zd bytes: %d",
tcache, sizeof(tcache), ret); tcache, DRC_TCACHE_SIZE, ret);
#ifdef __arm__ #ifdef __arm__
if (PicoOpt & POPT_EN_DRC) if (PicoOpt & POPT_EN_DRC)

View file

@ -5,7 +5,7 @@ typedef unsigned int u32;
#define DRC_TCACHE_SIZE (2*1024*1024) #define DRC_TCACHE_SIZE (2*1024*1024)
extern u8 tcache[DRC_TCACHE_SIZE]; extern u8 *tcache;
void drc_cmn_init(void); void drc_cmn_init(void);
void drc_cmn_cleanup(void); void drc_cmn_cleanup(void);

View 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); extern void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed);
extern void *plat_mremap(void *ptr, size_t oldsize, size_t newsize); extern void *plat_mremap(void *ptr, size_t oldsize, size_t newsize);
extern void plat_munmap(void *ptr, size_t size); extern void plat_munmap(void *ptr, size_t size);
// memory for the dynarec; plat_mem_get_for_drc() can just return NULL
extern void *plat_mem_get_for_drc(size_t size);
extern int plat_mem_set_exec(void *ptr, size_t size); extern int plat_mem_set_exec(void *ptr, size_t size);
// this one should handle display mode changes // this one should handle display mode changes

View file

@ -98,6 +98,7 @@ void cache_flush_d_inval_i(void *start, void *end)
{ {
#ifdef __arm__ #ifdef __arm__
size_t len = (char *)end - (char *)start; size_t len = (char *)end - (char *)start;
(void)len;
#if defined(__BLACKBERRY_QNX__) #if defined(__BLACKBERRY_QNX__)
msync(start, end - start, MS_SYNC | MS_CACHE_ONLY | MS_INVALIDATE_ICACHE); msync(start, end - start, MS_SYNC | MS_CACHE_ONLY | MS_INVALIDATE_ICACHE);
#elif defined(__MACH__) #elif defined(__MACH__)
@ -435,14 +436,25 @@ void plat_munmap(void *ptr, size_t size)
} }
#endif #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 plat_mem_set_exec(void *ptr, size_t size)
{ {
#ifdef _WIN32
int 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);
#elif defined(_3DS)
int ret = -1; int ret = -1;
#ifdef _WIN32
ret = VirtualProtect(ptr, size, PAGE_EXECUTE_READWRITE, 0);
if (ret == 0 && log_cb)
log_cb(RETRO_LOG_ERROR, "VirtualProtect(%p, %d) failed: %d\n", ptr, (int)size,
GetLastError());
#elif defined(_3DS)
if (ctr_svchack_successful) if (ctr_svchack_successful)
{ {
unsigned int currentHandle; unsigned int currentHandle;
@ -461,9 +473,9 @@ int plat_mem_set_exec(void *ptr, size_t size)
} }
#elif defined(VITA) #elif defined(VITA)
int ret = sceKernelOpenVMDomain(); ret = sceKernelOpenVMDomain();
#else #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) if (ret != 0 && log_cb)
log_cb(RETRO_LOG_ERROR, "mprotect(%p, %zd) failed: %d\n", ptr, size, errno); log_cb(RETRO_LOG_ERROR, "mprotect(%p, %zd) failed: %d\n", ptr, size, errno);
#endif #endif
@ -1380,3 +1392,5 @@ void retro_deinit(void)
vout_buf = NULL; vout_buf = NULL;
PicoExit(); PicoExit();
} }
// vim:shiftwidth=3:ts=3:expandtab

View file

@ -203,3 +203,7 @@ void plat_wait_till_us(unsigned int us_to)
} }
} }
void *plat_mem_get_for_drc(size_t size)
{
return NULL;
}