diff options
author | notaz | 2012-01-14 17:50:23 +0200 |
---|---|---|
committer | notaz | 2012-01-14 17:50:23 +0200 |
commit | bdeade4633d41d76e0c22b3810241bbf7cb5a8a3 (patch) | |
tree | 3472eb7a64f242f50f22344b166c9389ccf59b59 /libpcsxcore | |
parent | 3609c474ee3cec2e06fa5d2c1578dd9de1d3f7a5 (diff) | |
download | pcsx_rearmed-bdeade4633d41d76e0c22b3810241bbf7cb5a8a3.tar.gz pcsx_rearmed-bdeade4633d41d76e0c22b3810241bbf7cb5a8a3.tar.bz2 pcsx_rearmed-bdeade4633d41d76e0c22b3810241bbf7cb5a8a3.zip |
drc: allow translation cache in data segment
useful for Android
Diffstat (limited to 'libpcsxcore')
-rw-r--r-- | libpcsxcore/new_dynarec/assem_arm.c | 6 | ||||
-rw-r--r-- | libpcsxcore/new_dynarec/assem_arm.h | 14 | ||||
-rw-r--r-- | libpcsxcore/new_dynarec/new_dynarec.c | 14 |
3 files changed, 29 insertions, 5 deletions
diff --git a/libpcsxcore/new_dynarec/assem_arm.c b/libpcsxcore/new_dynarec/assem_arm.c index 3950d22..0b7cee8 100644 --- a/libpcsxcore/new_dynarec/assem_arm.c +++ b/libpcsxcore/new_dynarec/assem_arm.c @@ -29,6 +29,10 @@ #include "pcnt.h" #endif +#ifndef BASE_ADDR_FIXED +char translation_cache[1 << TARGET_SIZE_2] __attribute__((aligned(4096))); +#endif + extern int cycle_count; extern int last_count; extern int pcaddr; @@ -5680,7 +5684,7 @@ void do_clear_cache() for(j=0;j<32;j++) { if(bitmap&(1<<j)) { - start=BASE_ADDR+i*131072+j*4096; + start=(u_int)BASE_ADDR+i*131072+j*4096; end=start+4095; j++; while(j<32) { diff --git a/libpcsxcore/new_dynarec/assem_arm.h b/libpcsxcore/new_dynarec/assem_arm.h index 917d276..7ed8caf 100644 --- a/libpcsxcore/new_dynarec/assem_arm.h +++ b/libpcsxcore/new_dynarec/assem_arm.h @@ -22,6 +22,10 @@ //#undef USE_MINI_HT #endif +#ifndef __ANDROID__ +#define BASE_ADDR_FIXED 1 +#endif + #ifdef FORCE32 #define REG_SHIFT 2 #else @@ -54,8 +58,16 @@ extern char *invc_ptr; -#define BASE_ADDR 0x1000000 // Code generator target address #define TARGET_SIZE_2 24 // 2^24 = 16 megabytes +// Code generator target address +#ifdef BASE_ADDR_FIXED +// "round" address helpful for debug +#define BASE_ADDR 0x1000000 +#else +extern char translation_cache[1 << TARGET_SIZE_2]; +#define BASE_ADDR translation_cache +#endif + // This is defined in linkage_arm.s, but gcc -O3 likes this better #define rdram ((unsigned int *)0x80000000) diff --git a/libpcsxcore/new_dynarec/new_dynarec.c b/libpcsxcore/new_dynarec/new_dynarec.c index b6af4c4..cafa4a4 100644 --- a/libpcsxcore/new_dynarec/new_dynarec.c +++ b/libpcsxcore/new_dynarec/new_dynarec.c @@ -7993,10 +7993,16 @@ void new_dynarec_init() { printf("Init new dynarec\n"); out=(u_char *)BASE_ADDR; +#ifdef BASE_ADDR_FIXED if (mmap (out, 1<<TARGET_SIZE_2, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) <= 0) {printf("mmap() failed\n");} +#else + // not all systems allow execute in data segment by default + if (mprotect(out, 1<<TARGET_SIZE_2, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) + printf("mprotect() failed\n"); +#endif #ifdef MUPEN64 rdword=&readmem_dword; fake_pc.f.r.rs=&readmem_dword; @@ -8055,7 +8061,9 @@ void new_dynarec_init() void new_dynarec_cleanup() { int n; + #ifdef BASE_ADDR_FIXED if (munmap ((void *)BASE_ADDR, 1<<TARGET_SIZE_2) < 0) {printf("munmap() failed\n");} + #endif for(n=0;n<4096;n++) ll_clear(jump_in+n); for(n=0;n<4096;n++) ll_clear(jump_out+n); for(n=0;n<4096;n++) ll_clear(jump_dirty+n); @@ -11543,7 +11551,7 @@ int new_recompile_block(int addr) // If we're within 256K of the end of the buffer, // start over from the beginning. (Is 256K enough?) - if((int)out>BASE_ADDR+(1<<TARGET_SIZE_2)-MAX_OUTPUT_BLOCK_SIZE) out=(u_char *)BASE_ADDR; + if((u_int)out>(u_int)BASE_ADDR+(1<<TARGET_SIZE_2)-MAX_OUTPUT_BLOCK_SIZE) out=(u_char *)BASE_ADDR; // Trap writes to any of the pages we compiled for(i=start>>12;i<=(start+slen*4)>>12;i++) { @@ -11571,11 +11579,11 @@ int new_recompile_block(int addr) /* Pass 10 - Free memory by expiring oldest blocks */ - int end=((((int)out-BASE_ADDR)>>(TARGET_SIZE_2-16))+16384)&65535; + int end=((((int)out-(int)BASE_ADDR)>>(TARGET_SIZE_2-16))+16384)&65535; while(expirep!=end) { int shift=TARGET_SIZE_2-3; // Divide into 8 blocks - int base=BASE_ADDR+((expirep>>13)<<shift); // Base address of this block + int base=(int)BASE_ADDR+((expirep>>13)<<shift); // Base address of this block inv_debug("EXP: Phase %d\n",expirep); switch((expirep>>11)&3) { |