X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fdrc%2Fcmn.c;h=acff42c8f24f000816b764804a63b8fcb8832f76;hb=bce144211cd70e1be78b7c1b7424fb4609de1ac8;hp=66003255dde2f6917b0f395cdf4103d2d00707c7;hpb=679af8a3f466a2a4a20f58e4181a231fb73e9836;p=picodrive.git diff --git a/cpu/drc/cmn.c b/cpu/drc/cmn.c index 6600325..acff42c 100644 --- a/cpu/drc/cmn.c +++ b/cpu/drc/cmn.c @@ -1,31 +1,50 @@ +/* + * PicoDrive + * Copyright (C) 2009,2010 notaz + * + * This work is licensed under the terms of MAME license. + * See COPYING file in the top-level directory. + */ #include -#if defined(__linux__) && defined(ARM) -#include -#endif +#include #include "cmn.h" -u32 tcache[DRC_TCACHE_SIZE/4]; +u8 ALIGNED(4096) tcache[DRC_TCACHE_SIZE]; void drc_cmn_init(void) { -#if defined(__linux__) && defined(ARM) - void *tmp; - - tmp = mmap(tcache, DRC_TCACHE_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED|MAP_ANONYMOUS, -1, 0); - printf("mmap tcache: %p, asked %p\n", tmp, tcache); + 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 - } -// TODO: add calls in core, possibly to cart.c? void drc_cmn_cleanup(void) { -#if defined(__linux__) && defined(ARM) - int ret; - ret = munmap(tcache, DRC_TCACHE_SIZE); - printf("munmap tcache: %i\n", ret); -#endif } +// vim:shiftwidth=2:expandtab