27ff9812eaad40855fe4471e6a718fb620f71dfa
[picodrive.git] / cpu / drc / cmn.c
1 /*
2  * PicoDrive
3  * Copyright (C) 2009,2010 notaz
4  *
5  * This work is licensed under the terms of MAME license.
6  * See COPYING file in the top-level directory.
7  */
8 #include <stdio.h>
9
10 #include <pico/pico_int.h>
11 #include "cmn.h"
12
13 u8 ALIGNED(4096) tcache_default[DRC_TCACHE_SIZE];
14 u8 *tcache;
15
16 void drc_cmn_init(void)
17 {
18   int ret;
19
20   tcache = plat_mem_get_for_drc(DRC_TCACHE_SIZE);
21   if (tcache == NULL)
22     tcache = tcache_default;
23
24   ret = plat_mem_set_exec(tcache, DRC_TCACHE_SIZE);
25   elprintf(EL_STATUS, "drc_cmn_init: %p, %zd bytes: %d",
26     tcache, DRC_TCACHE_SIZE, ret);
27
28 #ifdef __arm__
29   if (PicoOpt & POPT_EN_DRC)
30   {
31     static int test_done;
32     if (!test_done)
33     {
34       int *test_out = (void *)tcache;
35       int (*testfunc)(void) = (void *)tcache;
36
37       elprintf(EL_STATUS, "testing if we can run recompiled code..");
38       *test_out++ = 0xe3a000dd; // mov r0, 0xdd
39       *test_out++ = 0xe12fff1e; // bx lr
40       cache_flush_d_inval_i(tcache, test_out);
41
42       // we'll usually crash on broken platforms or bad ports,
43       // but do a value check too just in case
44       ret = testfunc();
45       elprintf(EL_STATUS, "test %s.", ret == 0xdd ? "passed" : "failed");
46       test_done = 1;
47     }
48   }
49 #endif
50 }
51
52 void drc_cmn_cleanup(void)
53 {
54 }
55
56 // vim:shiftwidth=2:expandtab