Fix x87_op being outside of structure, fixing crashes in ARM64 NDR
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -217,6 +217,7 @@ block_free_list_get(void)
|
||||
void
|
||||
codegen_init(void)
|
||||
{
|
||||
codegen_check_regs();
|
||||
codegen_allocator_init();
|
||||
|
||||
codegen_backend_init();
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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*/
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user