X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fdrc%2Fcmn.c;h=27ff9812eaad40855fe4471e6a718fb620f71dfa;hb=df9251536de;hp=91bd7eddab428098bfce0d185559e1597cb80133;hpb=c25d78eec11d2a22adbd0bc7d42a24e2d79e40e7;p=picodrive.git diff --git a/cpu/drc/cmn.c b/cpu/drc/cmn.c index 91bd7ed..27ff981 100644 --- a/cpu/drc/cmn.c +++ b/cpu/drc/cmn.c @@ -7,17 +7,50 @@ */ #include -#include +#include #include "cmn.h" -u8 __attribute__((aligned(4096))) tcache[DRC_TCACHE_SIZE]; - +u8 ALIGNED(4096) tcache_default[DRC_TCACHE_SIZE]; +u8 *tcache; void drc_cmn_init(void) { - 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, DRC_TCACHE_SIZE, 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