notaz.gp2x.de
/
pcsx_rearmed.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
drc: don't cache psxRegs.interrupt
[pcsx_rearmed.git]
/
libpcsxcore
/
new_dynarec
/
new_dynarec.c
diff --git
a/libpcsxcore/new_dynarec/new_dynarec.c
b/libpcsxcore/new_dynarec/new_dynarec.c
index
bcbc009
..
107a630
100644
(file)
--- a/
libpcsxcore/new_dynarec/new_dynarec.c
+++ b/
libpcsxcore/new_dynarec/new_dynarec.c
@@
-29,10
+29,6
@@
#ifdef _3DS
#include <3ds_utils.h>
#endif
#ifdef _3DS
#include <3ds_utils.h>
#endif
-#ifdef VITA
-#include <psp2/kernel/sysmem.h>
-static int sceBlock;
-#endif
#include "new_dynarec_config.h"
#include "../psxhle.h"
#include "new_dynarec_config.h"
#include "../psxhle.h"
@@
-79,9
+75,17
@@
static int sceBlock;
#define MAXBLOCK 4096
#define MAX_OUTPUT_BLOCK_SIZE 262144
#define MAXBLOCK 4096
#define MAX_OUTPUT_BLOCK_SIZE 262144
+#ifdef VITA
+// apparently Vita has a 16MB limit, so either we cut tc in half,
+// or use this hack (it's a hack because tc size was designed to be power-of-2)
+#define TC_REDUCE_BYTES 4096
+#else
+#define TC_REDUCE_BYTES 0
+#endif
+
struct ndrc_mem
{
struct ndrc_mem
{
- u_char translation_cache[
1 << TARGET_SIZE_2
];
+ u_char translation_cache[
(1 << TARGET_SIZE_2) - TC_REDUCE_BYTES
];
struct
{
struct tramp_insns ops[2048 / sizeof(struct tramp_insns)];
struct
{
struct tramp_insns ops[2048 / sizeof(struct tramp_insns)];
@@
-228,7
+232,7
@@
static struct decoded_insn
static void *copy;
static int expirep;
static u_int stop_after_jal;
static void *copy;
static int expirep;
static u_int stop_after_jal;
- static u_int f1_hack;
// 0 - off, ~0 - capture address, else addr
+ static u_int f1_hack;
int new_dynarec_hacks;
int new_dynarec_hacks_pergame;
int new_dynarec_hacks;
int new_dynarec_hacks_pergame;
@@
-354,6
+358,14
@@
static void pass_args(int a0, int a1);
static void emit_far_jump(const void *f);
static void emit_far_call(const void *f);
static void emit_far_jump(const void *f);
static void emit_far_call(const void *f);
+#ifdef VITA
+#include <psp2/kernel/sysmem.h>
+static int sceBlock;
+// note: this interacts with RetroArch's Vita bootstrap code: bootstrap/vita/sbrk.c
+extern int getVMBlock();
+int _newlib_vm_size_user = sizeof(*ndrc);
+#endif
+
static void mprotect_w_x(void *start, void *end, int is_x)
{
#ifdef NO_WRITE_EXEC
static void mprotect_w_x(void *start, void *end, int is_x)
{
#ifdef NO_WRITE_EXEC
@@
-6827,6
+6839,7
@@
void new_dynarec_clear_full(void)
literalcount=0;
stop_after_jal=0;
inv_code_start=inv_code_end=~0;
literalcount=0;
stop_after_jal=0;
inv_code_start=inv_code_end=~0;
+ hack_addr=0;
f1_hack=0;
// TLB
for(n=0;n<4096;n++) ll_clear(jump_in+n);
f1_hack=0;
// TLB
for(n=0;n<4096;n++) ll_clear(jump_in+n);
@@
-6839,7
+6852,7
@@
void new_dynarec_clear_full(void)
void new_dynarec_init(void)
{
void new_dynarec_init(void)
{
- SysPrintf("Init new dynarec
\n"
);
+ SysPrintf("Init new dynarec
, ndrc size %x\n", (int)sizeof(*ndrc)
);
#ifdef _3DS
check_rosalina();
#ifdef _3DS
check_rosalina();
@@
-6847,11
+6860,11
@@
void new_dynarec_init(void)
#ifdef BASE_ADDR_DYNAMIC
#ifdef VITA
sceBlock = getVMBlock(); //sceKernelAllocMemBlockForVM("code", sizeof(*ndrc));
#ifdef BASE_ADDR_DYNAMIC
#ifdef VITA
sceBlock = getVMBlock(); //sceKernelAllocMemBlockForVM("code", sizeof(*ndrc));
- if (sceBlock < 0)
- SysPrintf("sceKernelAllocMemBlockForVM failed
\n"
);
+ if (sceBlock <
=
0)
+ SysPrintf("sceKernelAllocMemBlockForVM failed
: %x\n", sceBlock
);
int ret = sceKernelGetMemBlockBase(sceBlock, (void **)&ndrc);
if (ret < 0)
int ret = sceKernelGetMemBlockBase(sceBlock, (void **)&ndrc);
if (ret < 0)
- SysPrintf("sceKernelGetMemBlockBase failed
\n"
);
+ SysPrintf("sceKernelGetMemBlockBase failed
: %x\n", ret
);
sceKernelOpenVMDomain();
sceClibPrintf("translation_cache = 0x%08lx\n ", (long)ndrc->translation_cache);
#elif defined(_MSC_VER)
sceKernelOpenVMDomain();
sceClibPrintf("translation_cache = 0x%08lx\n ", (long)ndrc->translation_cache);
#elif defined(_MSC_VER)
@@
-6899,8
+6912,9
@@
void new_dynarec_cleanup(void)
int n;
#ifdef BASE_ADDR_DYNAMIC
#ifdef VITA
int n;
#ifdef BASE_ADDR_DYNAMIC
#ifdef VITA
- sceKernelFreeMemBlock(sceBlock);
- sceBlock = -1;
+ // sceBlock is managed by retroarch's bootstrap code
+ //sceKernelFreeMemBlock(sceBlock);
+ //sceBlock = -1;
#else
if (munmap(ndrc, sizeof(*ndrc)) < 0)
SysPrintf("munmap() failed\n");
#else
if (munmap(ndrc, sizeof(*ndrc)) < 0)
SysPrintf("munmap() failed\n");
@@
-7042,11
+7056,11
@@
void new_dynarec_load_blocks(const void *save, int size)
memcpy(&psxRegs.GPR, regs_save, sizeof(regs_save));
}
memcpy(&psxRegs.GPR, regs_save, sizeof(regs_save));
}
-static
void
apply_hacks(void)
+static
int
apply_hacks(void)
{
int i;
if (HACK_ENABLED(NDHACK_NO_COMPAT_HACKS))
{
int i;
if (HACK_ENABLED(NDHACK_NO_COMPAT_HACKS))
- return;
+ return
0
;
/* special hack(s) */
for (i = 0; i < slen - 4; i++)
{
/* special hack(s) */
for (i = 0; i < slen - 4; i++)
{
@@
-7071,11
+7085,12
@@
static void apply_hacks(void)
if (dops[i].itype == STORELR && dops[i].rs1 == 6
&& dops[i-1].itype == STORELR && dops[i-1].rs1 == 6)
{
if (dops[i].itype == STORELR && dops[i].rs1 == 6
&& dops[i-1].itype == STORELR && dops[i-1].rs1 == 6)
{
- SysPrintf("F1 hack from %08x
\n", start
);
- if (f1_hack == 0)
-
f1_hack = ~0u
;
+ SysPrintf("F1 hack from %08x
, old dst %08x\n", start, hack_addr
);
+ f1_hack = 1;
+
return 1
;
}
}
}
}
+ return 0;
}
int new_recompile_block(u_int addr)
}
int new_recompile_block(u_int addr)
@@
-7113,9
+7128,11
@@
int new_recompile_block(u_int addr)
ll_add_flags(jump_in+page,start,state_rflags,(void *)beginning);
return 0;
}
ll_add_flags(jump_in+page,start,state_rflags,(void *)beginning);
return 0;
}
- else if (f1_hack
== ~0u || (f1_hack != 0 && start == f1_hack)
) {
+ else if (f1_hack
&& hack_addr == 0
) {
void *beginning = start_block();
u_int page = get_page(start);
void *beginning = start_block();
u_int page = get_page(start);
+ emit_movimm(start, 0);
+ emit_writeword(0, &hack_addr);
emit_readword(&psxRegs.GPR.n.sp, 0);
emit_readptr(&mem_rtab, 1);
emit_shrimm(0, 12, 2);
emit_readword(&psxRegs.GPR.n.sp, 0);
emit_readptr(&mem_rtab, 1);
emit_shrimm(0, 12, 2);
@@
-7131,7
+7148,6
@@
int new_recompile_block(u_int addr)
ll_add_flags(jump_in + page, start, state_rflags, beginning);
SysPrintf("F1 hack to %08x\n", start);
ll_add_flags(jump_in + page, start, state_rflags, beginning);
SysPrintf("F1 hack to %08x\n", start);
- f1_hack = start;
return 0;
}
return 0;
}
@@
-7659,7
+7675,7
@@
int new_recompile_block(u_int addr)
}
assert(slen>0);
}
assert(slen>0);
- apply_hacks();
+
int clear_hack_addr =
apply_hacks();
/* Pass 2 - Register dependencies and branch targets */
/* Pass 2 - Register dependencies and branch targets */
@@
-9199,6
+9215,11
@@
int new_recompile_block(u_int addr)
instr_addr[i] = out;
assem_debug("<->\n");
drc_dbg_emit_do_cmp(i, ccadj[i]);
instr_addr[i] = out;
assem_debug("<->\n");
drc_dbg_emit_do_cmp(i, ccadj[i]);
+ if (clear_hack_addr) {
+ emit_movimm(0, 0);
+ emit_writeword(0, &hack_addr);
+ clear_hack_addr = 0;
+ }
// load regs
if(regs[i].regmap_entry[HOST_CCREG]==CCREG&®s[i].regmap[HOST_CCREG]!=CCREG)
// load regs
if(regs[i].regmap_entry[HOST_CCREG]==CCREG&®s[i].regmap[HOST_CCREG]!=CCREG)