From 570dde615d960c9f9ba8e15d95634816ad544c77 Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 29 Jul 2013 04:47:07 +0300 Subject: [PATCH] drc: do a test on startup saves time for porting help --- cpu/drc/cmn.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/cpu/drc/cmn.c b/cpu/drc/cmn.c index 91bd7edd..cfb0219c 100644 --- a/cpu/drc/cmn.c +++ b/cpu/drc/cmn.c @@ -7,7 +7,7 @@ */ #include -#include +#include #include "cmn.h" u8 __attribute__((aligned(4096))) tcache[DRC_TCACHE_SIZE]; @@ -15,9 +15,35 @@ u8 __attribute__((aligned(4096))) tcache[DRC_TCACHE_SIZE]; void drc_cmn_init(void) { - plat_mem_set_exec(tcache, sizeof(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__ + { + 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 -- 2.39.5