From e076c1051d9cd43936dc170857b24cb99a574a75 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 26 Apr 2025 23:17:32 +0600 Subject: [PATCH] Fix x87_op being outside of structure, fixing crashes in ARM64 NDR --- src/codegen_new/codegen.h | 1 + src/codegen_new/codegen_block.c | 1 + src/codegen_new/codegen_reg.c | 14 ++++++++++++++ src/cpu/386_common.c | 2 -- src/cpu/cpu.h | 4 +++- src/cpu/x86.c | 1 + 6 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/codegen_new/codegen.h b/src/codegen_new/codegen.h index eecfa249b..0ff6a90d6 100644 --- a/src/codegen_new/codegen.h +++ b/src/codegen_new/codegen.h @@ -306,6 +306,7 @@ struct ir_data_t; x86seg *codegen_generate_ea(struct ir_data_t *ir, x86seg *op_ea_seg, uint32_t fetchdat, int op_ssegs, uint32_t *op_pc, uint32_t op_32, int stack_offset); extern void codegen_check_seg_read(codeblock_t *block, struct ir_data_t *ir, x86seg *seg); extern void codegen_check_seg_write(codeblock_t *block, struct ir_data_t *ir, x86seg *seg); +extern void codegen_check_regs(void); extern int codegen_purge_purgable_list(void); /*Delete a random code block to free memory. This is obviously quite expensive, and diff --git a/src/codegen_new/codegen_block.c b/src/codegen_new/codegen_block.c index a8ea0e06e..ff82384be 100644 --- a/src/codegen_new/codegen_block.c +++ b/src/codegen_new/codegen_block.c @@ -217,6 +217,7 @@ block_free_list_get(void) void codegen_init(void) { + codegen_check_regs(); codegen_allocator_init(); codegen_backend_init(); diff --git a/src/codegen_new/codegen_reg.c b/src/codegen_new/codegen_reg.c index ba60ab038..75cf25ded 100644 --- a/src/codegen_new/codegen_reg.c +++ b/src/codegen_new/codegen_reg.c @@ -226,6 +226,20 @@ reg_is_native_size(ir_reg_t ir_reg) return 0; } +void +codegen_check_regs(void) +{ + int i = 0; + for (i = 0; i < IREG_COUNT; i++) { + if (ireg_data[i].is_volatile == REG_VOLATILE) + continue; + + if (ireg_data[i].p && ((uintptr_t)ireg_data[i].p - (uintptr_t)&cpu_state) >= sizeof(cpu_state)) { + fatal("Register number %d outside cpu_state!\n", i); + } + } +} + void codegen_reg_reset(void) { diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index c6a759d36..2853e3c9a 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -113,8 +113,6 @@ uint8_t is_smint = 0; uint16_t io_port = 0x0000; uint32_t io_val = 0x00000000; -uint32_t x87_op = 0x00000000; - int opcode_has_modrm[256] = { 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*00*/ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*10*/ diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index b76e2d622..b6f5f593c 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -416,6 +416,8 @@ typedef struct { uint16_t eflags; uint32_t _smbase; + + uint32_t x87_op; } cpu_state_t; #define in_smm cpu_state._in_smm @@ -784,7 +786,7 @@ typedef struct { uint32_t smhr; } cyrix_t; -extern uint32_t x87_op; +#define x87_op cpu_state.x87_op extern uint32_t addr64; extern uint32_t addr64_2; diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 97ae19f3a..a8ab9d866 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -272,6 +272,7 @@ reset_common(int hard) msr.fcr = (1 << 8) | (1 << 9) | (1 << 12) | (1 << 16) | (1 << 19) | (1 << 21); msw = 0; new_ne = 0; + x87_op = 0; ccr0 = ccr1 = ccr2 = ccr3 = ccr4 = ccr5 = ccr6 = ccr7 = 0; ccr4 = 0x85;