X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fdrc%2Fcmn.c;h=721340a39189a5cd3737d2a5cf9a9658d0eacee9;hb=c13c91cd04513cc6c0d12e9714a5952607323333;hp=91bd7eddab428098bfce0d185559e1597cb80133;hpb=c25d78eec11d2a22adbd0bc7d42a24e2d79e40e7;p=picodrive.git diff --git a/cpu/drc/cmn.c b/cpu/drc/cmn.c index 91bd7ed..721340a 100644 --- a/cpu/drc/cmn.c +++ b/cpu/drc/cmn.c @@ -1,23 +1,66 @@ /* * PicoDrive * Copyright (C) 2009,2010 notaz + * Copyright (C) 2016 lentillog + * Copyright (C) 2016 Daniel De Matteis * * This work is licensed under the terms of MAME license. * See COPYING file in the top-level directory. */ #include -#include +#include #include "cmn.h" +#ifdef _MSC_VER +u8 tcache[DRC_TCACHE_SIZE]; +#elif defined(VITA) +#include +u8 *tcache; +static int sceBlock; +int getVMBlock(); +#else u8 __attribute__((aligned(4096))) tcache[DRC_TCACHE_SIZE]; +#endif void drc_cmn_init(void) { - plat_mem_set_exec(tcache, sizeof(tcache)); +#ifdef VITA + sceBlock = getVMBlock(); + sceKernelGetMemBlockBase(sceBlock, (void **)&tcache); +#endif + + int ret = plat_mem_set_exec(tcache, sizeof(tcache)); + elprintf(EL_STATUS, "drc_cmn_init: %p, %zd bytes: %d", + tcache, sizeof(tcache), ret); + +#ifdef __arm__ + if (PicoOpt & POPT_EN_DRC) + { + static int test_done; + if (!test_done) + { + int *test_out = (void *)tcache; + int (*testfunc)(void) = (void *)tcache; + + elprintf(EL_STATUS, "testing if we can run recompiled code.."); + *test_out++ = 0xe3a000dd; // mov r0, 0xdd + *test_out++ = 0xe12fff1e; // bx lr + cache_flush_d_inval_i(tcache, test_out); + + // we'll usually crash on broken platforms or bad ports, + // but do a value check too just in case + ret = testfunc(); + elprintf(EL_STATUS, "test %s.", ret == 0xdd ? "passed" : "failed"); + test_done = 1; + } + } +#endif } void drc_cmn_cleanup(void) { } + +// vim:shiftwidth=2:expandtab