diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-02-07 18:00:36 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-02-07 18:02:07 +0100 |
| commit | 774d872f41241251fcd937cca4d7b3e3c07ba954 (patch) | |
| tree | 0221ee4f09a1e9c59bd770c018b84fc5f93f76a6 /src | |
| parent | fa19435d24a04a00739bc5b66b6dddf44fc59bd5 (diff) | |
| download | box64-774d872f41241251fcd937cca4d7b3e3c07ba954.tar.gz box64-774d872f41241251fcd937cca4d7b3e3c07ba954.zip | |
[DYNAREC] Tests for emited coded size limit (usefull for DYNAREC_TEST for example)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass0.h | 2 | ||||
| -rw-r--r-- | src/dynarec/dynarec_arch.h | 6 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 7 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass0.h | 2 |
4 files changed, 15 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h index 918bb3c1..301aeb94 100644 --- a/src/dynarec/arm64/dynarec_arm64_pass0.h +++ b/src/dynarec/arm64/dynarec_arm64_pass0.h @@ -15,7 +15,7 @@ dyn->insts[ninst].x64.state_flags = B; \ dyn->f.pending=(B)&SF_SET_PENDING; \ dyn->f.dfnone=((B)&SF_SET)?1:0; -#define EMIT(A) +#define EMIT(A) dyn->native_size+=4 #define JUMP(A, C) add_jump(dyn, ninst); add_next(dyn, (uintptr_t)A); SMEND(); dyn->insts[ninst].x64.jmp = A; dyn->insts[ninst].x64.jmp_cond = C #define BARRIER(A) if(A!=BARRIER_MAYBE) {fpu_purgecache(dyn, ninst, 0, x1, x2, x3); dyn->insts[ninst].x64.barrier = A;} else dyn->insts[ninst].barrier_maybe = 1 #define BARRIER_NEXT(A) dyn->insts[ninst].x64.barrier_next = A diff --git a/src/dynarec/dynarec_arch.h b/src/dynarec/dynarec_arch.h index 51e74d4e..e09bbdd2 100644 --- a/src/dynarec/dynarec_arch.h +++ b/src/dynarec/dynarec_arch.h @@ -15,6 +15,8 @@ #include "arm64/arm64_printer.h" #include "arm64/dynarec_arm64_private.h" #include "arm64/dynarec_arm64_functions.h" +// Limit here is defined by LD litteral, that is 19bits +#define MAXBLOCK_SIZE ((1<<19)-200) #elif defined(LA464) #define instruction_native_t instruction_la464_t @@ -27,6 +29,8 @@ #include "la464/la464_printer.h" #include "la464/dynarec_la464_private.h" #include "la464/dynarec_la464_functions.h" +// TODO +#define MAXBLOCK_SIZE ((1<<19)-200) #elif defined(RV64) #define instruction_native_t instruction_rv64_t @@ -41,6 +45,8 @@ #include "rv64/rv64_printer.h" #include "rv64/dynarec_rv64_private.h" #include "rv64/dynarec_rv64_functions.h" +// Limit here is unconditionnal jump, thjat is signed 21bits +#define MAXBLOCK_SIZE ((1<<20)-200) #else #error Unsupported platform #endif diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 3ee9f28b..e9ef81a5 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -68,6 +68,13 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int break; } } + // This test is here to prevent things like TABLE64 to be out of range + // native_size is not exact at this point, but it should be larger, not smaller, and not by a huge margin anyway + // so it's good enough to avoid overflow in relative to PC data fectching + if(dyn->native_size >= MAXBLOCK_SIZE) { + need_epilog = 1; + break; + } #endif ip = addr; if (reset_n!=-1) { diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h index 89c4214e..13d4f115 100644 --- a/src/dynarec/rv64/dynarec_rv64_pass0.h +++ b/src/dynarec/rv64/dynarec_rv64_pass0.h @@ -15,7 +15,7 @@ dyn->insts[ninst].x64.state_flags = B; \ dyn->f.pending=(B)&SF_SET_PENDING; \ dyn->f.dfnone=((B)&SF_SET)?1:0; -#define EMIT(A) +#define EMIT(A) dyn->native_size+=4 #define JUMP(A, C) add_jump(dyn, ninst); add_next(dyn, (uintptr_t)A); dyn->insts[ninst].x64.jmp = A; dyn->insts[ninst].x64.jmp_cond = C #define BARRIER(A) if(A!=BARRIER_MAYBE) {fpu_purgecache(dyn, ninst, 0, x1, x2, x3); dyn->insts[ninst].x64.barrier = A;} else dyn->insts[ninst].barrier_maybe = 1 #define BARRIER_NEXT(A) dyn->insts[ninst].x64.barrier_next = A |