drc: some portability fixes

This commit is contained in:
notaz 2013-06-28 01:41:52 +03:00
parent 2446536be5
commit c25d78eec1
5 changed files with 36 additions and 22 deletions

View file

@ -6,10 +6,8 @@
* See COPYING file in the top-level directory.
*/
#include <stdio.h>
#ifdef __linux__
#include <sys/mman.h>
#endif
#include <pico/pico.h>
#include "cmn.h"
u8 __attribute__((aligned(4096))) tcache[DRC_TCACHE_SIZE];
@ -17,20 +15,9 @@ u8 __attribute__((aligned(4096))) tcache[DRC_TCACHE_SIZE];
void drc_cmn_init(void)
{
#ifdef __linux__
void *tmp;
tmp = mmap(tcache, DRC_TCACHE_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
printf("mmap tcache: %p, asked %p\n", tmp, tcache);
#endif
plat_mem_set_exec(tcache, sizeof(tcache));
}
void drc_cmn_cleanup(void)
{
#ifdef __linux__
int ret;
ret = munmap(tcache, DRC_TCACHE_SIZE);
printf("munmap tcache: %i\n", ret);
#endif
}

View file

@ -431,6 +431,12 @@ static void REGPARM(3) *dr_lookup_block(u32 pc, int is_slave, int *tcache_id)
return block;
}
static void *dr_failure(void)
{
lprintf("recompilation failed\n");
exit(1);
}
static void *dr_prepare_ext_branch(u32 pc, SH2 *sh2, int tcache_id)
{
#if LINK_BRANCHES
@ -1126,13 +1132,15 @@ static void emit_do_static_regs(int is_write, int tmpr)
static void emit_block_entry(void)
{
int arg0, arg1, arg2;
int arg0;
host_arg2reg(arg0, 0);
#if (DRC_DEBUG & 8) || defined(PDB)
int arg1, arg2;
host_arg2reg(arg1, 1);
host_arg2reg(arg2, 2);
#if (DRC_DEBUG & 8) || defined(PDB)
emit_do_static_regs(1, arg2);
emith_move_r_r(arg1, CONTEXT_REG);
emith_move_r_r(arg2, rcache_get_reg(SHR_SR, RC_GR_READ));
@ -1296,10 +1304,16 @@ static void REGPARM(2) *sh2_translate(SH2 *sh2, int tcache_id)
pc = branch_target_pc[i];
if (base_pc <= pc && pc <= end_pc && !(OP_FLAGS(pc) & OF_DELAY_OP))
branch_target_pc[tmp++] = branch_target_pc[i];
if (i == branch_target_count - 1) // workaround gcc 4.5.2 bug?
break;
}
branch_target_count = tmp;
memset(branch_target_ptr, 0, sizeof(branch_target_ptr[0]) * branch_target_count);
memset(branch_target_blkid, 0, sizeof(branch_target_blkid[0]) * branch_target_count);
if (branch_target_count > 0) {
memset(branch_target_ptr, 0, sizeof(branch_target_ptr[0]) * branch_target_count);
memset(branch_target_blkid, 0, sizeof(branch_target_blkid[0]) * branch_target_count);
}
// -------------------------------------------------
// 2nd pass: actual compilation
@ -2702,7 +2716,7 @@ static void sh2_generate_utils(void)
emith_call(sh2_translate);
emit_block_entry();
// XXX: can't translate, fail
emith_call(exit);
emith_call(dr_failure);
// sh2_drc_test_irq(void)
// assumes it's called from main function (may jump to dispatcher)