diff options
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_private.h | 1 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 3 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 3 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_private.h | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_private.h | 1 |
5 files changed, 8 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_private.h b/src/dynarec/arm64/dynarec_arm64_private.h index 211fe596..ca249949 100644 --- a/src/dynarec/arm64/dynarec_arm64_private.h +++ b/src/dynarec/arm64/dynarec_arm64_private.h @@ -142,6 +142,7 @@ typedef struct dynarec_arm_s { int32_t size; int32_t cap; uintptr_t start; // start of the block + uintptr_t end; // maximum end of the block (only used in pass0) uint32_t isize; // size in bytes of x64 instructions included void* block; // memory pointer where next instruction is emitted uintptr_t native_start; // start of the arm code diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index b6e7a86b..65868435 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -633,6 +633,9 @@ dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_m helper.next_cap = MAX_INSTS; helper.table64 = static_table64; helper.table64cap = sizeof(static_table64)/sizeof(uint64_t); + helper.end = addr + SizeFileMapped(addr); + if(helper.end == helper.start) // that means there is no mmap with a file associated to the memory + helper.end = (uintptr_t)~0LL; // pass 0, addresses, x64 jump addresses, overall size of the block uintptr_t end = native_pass0(&helper, addr, alternate, is32bits, inst_max); if(helper.abort) { diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 1620927a..f7d02f13 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -69,7 +69,8 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int if(cur_page != ((addr)&~(box64_pagesize-1))) { cur_page = (addr)&~(box64_pagesize-1); uint32_t prot = getProtection(addr); - if(!(prot&PROT_READ) || checkInHotPage(addr)) { + if(!(prot&PROT_READ) || checkInHotPage(addr) || (addr>dyn->end)) { + dynarec_log(LOG_INFO, "Stopping dynablock because of protection, hotpage or mmap crossing at %p -> %p inst=%d\n", (void*)dyn->start, (void*)addr, ninst); need_epilog = 1; break; } diff --git a/src/dynarec/la64/dynarec_la64_private.h b/src/dynarec/la64/dynarec_la64_private.h index 4bc621bd..a6250d09 100644 --- a/src/dynarec/la64/dynarec_la64_private.h +++ b/src/dynarec/la64/dynarec_la64_private.h @@ -116,6 +116,7 @@ typedef struct dynarec_la64_s { int32_t size; int32_t cap; uintptr_t start; // start of the block + uintptr_t end; // maximum end of the block (only used in pass0) uint32_t isize; // size in bytes of x64 instructions included void* block; // memory pointer where next instruction is emitted uintptr_t native_start; // start of the arm code diff --git a/src/dynarec/rv64/dynarec_rv64_private.h b/src/dynarec/rv64/dynarec_rv64_private.h index e32aa69e..f8006a6a 100644 --- a/src/dynarec/rv64/dynarec_rv64_private.h +++ b/src/dynarec/rv64/dynarec_rv64_private.h @@ -154,6 +154,7 @@ typedef struct dynarec_rv64_s { int32_t size; int32_t cap; uintptr_t start; // start of the block + uintptr_t end; // maximum end of the block (only used in pass0) uint32_t isize; // size in byte of x64 instructions included void* block; // memory pointer where next instruction is emitted uintptr_t native_start; // start of the riscv code |