fix merge conflicts
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_AARCH64_H
|
||||
#define UNICORN_AUTOGEN_AARCH64_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_aarch64
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_aarch64
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_aarch64
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_aarch64
|
||||
#define helper_power_down helper_power_down_aarch64
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_ARM_H
|
||||
#define UNICORN_AUTOGEN_ARM_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_arm
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_arm
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_arm
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_arm
|
||||
#define helper_power_down helper_power_down_arm
|
||||
|
||||
@@ -8,6 +8,7 @@ import sys
|
||||
|
||||
symbols = (
|
||||
'aarch64_tb_set_jmp_target',
|
||||
'ppc_tb_set_jmp_target',
|
||||
'use_idiv_instructions_rt',
|
||||
'tcg_target_deposit_valid',
|
||||
'helper_power_down',
|
||||
|
||||
@@ -126,11 +126,15 @@
|
||||
/* Bits present in AT_HWCAP for Sparc. */
|
||||
#define HWCAP_SPARC_VIS3 0x00020000
|
||||
|
||||
/* Bits present in AT_HWCAP for PowerPC. */
|
||||
#define PPC_FEATURE_ARCH_2_06 0x00000100
|
||||
|
||||
/* Symbolic values for the entries in the auxiliary table
|
||||
put on the initial stack */
|
||||
#define AT_PLATFORM 15 /* string identifying CPU for optimizations */
|
||||
#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */
|
||||
|
||||
#define AT_DCACHEBSIZE 19 /* data cache block size */
|
||||
#define AT_ICACHEBSIZE 20 /* instruction cache block size */
|
||||
|
||||
/*
|
||||
* 68k ELF relocation types
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_M68K_H
|
||||
#define UNICORN_AUTOGEN_M68K_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_m68k
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_m68k
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_m68k
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_m68k
|
||||
#define helper_power_down helper_power_down_m68k
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_MIPS_H
|
||||
#define UNICORN_AUTOGEN_MIPS_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_mips
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_mips
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_mips
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_mips
|
||||
#define helper_power_down helper_power_down_mips
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_MIPS64_H
|
||||
#define UNICORN_AUTOGEN_MIPS64_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_mips64
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_mips64
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_mips64
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_mips64
|
||||
#define helper_power_down helper_power_down_mips64
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_MIPS64EL_H
|
||||
#define UNICORN_AUTOGEN_MIPS64EL_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_mips64el
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_mips64el
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_mips64el
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_mips64el
|
||||
#define helper_power_down helper_power_down_mips64el
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_MIPSEL_H
|
||||
#define UNICORN_AUTOGEN_MIPSEL_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_mipsel
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_mipsel
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_mipsel
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_mipsel
|
||||
#define helper_power_down helper_power_down_mipsel
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_POWERPC_H
|
||||
#define UNICORN_AUTOGEN_POWERPC_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_powerpc
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_powerpc
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_powerpc
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_powerpc
|
||||
#define helper_power_down helper_power_down_powerpc
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_SPARC_H
|
||||
#define UNICORN_AUTOGEN_SPARC_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_sparc
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_sparc
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_sparc
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_sparc
|
||||
#define helper_power_down helper_power_down_sparc
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_SPARC64_H
|
||||
#define UNICORN_AUTOGEN_SPARC64_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_sparc64
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_sparc64
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_sparc64
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_sparc64
|
||||
#define helper_power_down helper_power_down_sparc64
|
||||
|
||||
@@ -52,10 +52,27 @@ int arm64_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int co
|
||||
for (i = 0; i < count; i++) {
|
||||
unsigned int regid = regs[i];
|
||||
void *value = vals[i];
|
||||
// V & Q registers are the same
|
||||
if (regid >= UC_ARM64_REG_V0 && regid <= UC_ARM64_REG_V31) {
|
||||
regid += UC_ARM64_REG_Q0 - UC_ARM64_REG_V0;
|
||||
}
|
||||
if (regid >= UC_ARM64_REG_X0 && regid <= UC_ARM64_REG_X28) {
|
||||
*(int64_t *)value = ARM_CPU(uc, mycpu)->env.xregs[regid - UC_ARM64_REG_X0];
|
||||
} else if (regid >= UC_ARM64_REG_W0 && regid <= UC_ARM64_REG_W30) {
|
||||
*(int32_t *)value = READ_DWORD(ARM_CPU(uc, mycpu)->env.xregs[regid - UC_ARM64_REG_W0]);
|
||||
} else if (regid >= UC_ARM64_REG_Q0 && regid <= UC_ARM64_REG_Q31) {
|
||||
float64 *dst = (float64*) value;
|
||||
uint32_t reg_index = 2*(regid - UC_ARM64_REG_Q0);
|
||||
dst[0] = ARM_CPU(uc, mycpu)->env.vfp.regs[reg_index];
|
||||
dst[1] = ARM_CPU(uc, mycpu)->env.vfp.regs[reg_index+1];
|
||||
} else if (regid >= UC_ARM64_REG_D0 && regid <= UC_ARM64_REG_D31) {
|
||||
*(float64*)value = ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_D0)];
|
||||
} else if (regid >= UC_ARM64_REG_S0 && regid <= UC_ARM64_REG_S31) {
|
||||
*(int32_t*)value = READ_DWORD(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_S0)]);
|
||||
} else if (regid >= UC_ARM64_REG_H0 && regid <= UC_ARM64_REG_H31) {
|
||||
*(int16_t*)value = READ_WORD(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_H0)]);
|
||||
} else if (regid >= UC_ARM64_REG_B0 && regid <= UC_ARM64_REG_B31) {
|
||||
*(int8_t*)value = READ_BYTE_L(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_B0)]);
|
||||
} else {
|
||||
switch(regid) {
|
||||
default: break;
|
||||
@@ -86,10 +103,26 @@ int arm64_reg_write(struct uc_struct *uc, unsigned int *regs, void* const* vals,
|
||||
for (i = 0; i < count; i++) {
|
||||
unsigned int regid = regs[i];
|
||||
const void *value = vals[i];
|
||||
if (regid >= UC_ARM64_REG_V0 && regid <= UC_ARM64_REG_V31) {
|
||||
regid += UC_ARM64_REG_Q0 - UC_ARM64_REG_V0;
|
||||
}
|
||||
if (regid >= UC_ARM64_REG_X0 && regid <= UC_ARM64_REG_X28) {
|
||||
ARM_CPU(uc, mycpu)->env.xregs[regid - UC_ARM64_REG_X0] = *(uint64_t *)value;
|
||||
} else if (regid >= UC_ARM64_REG_W0 && regid <= UC_ARM64_REG_W30) {
|
||||
WRITE_DWORD(ARM_CPU(uc, mycpu)->env.xregs[regid - UC_ARM64_REG_W0], *(uint32_t *)value);
|
||||
} else if (regid >= UC_ARM64_REG_Q0 && regid <= UC_ARM64_REG_Q31) {
|
||||
float64 *src = (float64*) value;
|
||||
uint32_t reg_index = 2*(regid - UC_ARM64_REG_Q0);
|
||||
ARM_CPU(uc, mycpu)->env.vfp.regs[reg_index] = src[0];
|
||||
ARM_CPU(uc, mycpu)->env.vfp.regs[reg_index+1] = src[1];
|
||||
} else if (regid >= UC_ARM64_REG_D0 && regid <= UC_ARM64_REG_D31) {
|
||||
ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_D0)] = * (float64*) value;
|
||||
} else if (regid >= UC_ARM64_REG_S0 && regid <= UC_ARM64_REG_S31) {
|
||||
WRITE_DWORD(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_S0)], *(int32_t*) value);
|
||||
} else if (regid >= UC_ARM64_REG_H0 && regid <= UC_ARM64_REG_H31) {
|
||||
WRITE_WORD(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_H0)], *(int16_t*) value);
|
||||
} else if (regid >= UC_ARM64_REG_B0 && regid <= UC_ARM64_REG_B31) {
|
||||
WRITE_BYTE_L(ARM_CPU(uc, mycpu)->env.vfp.regs[2*(regid - UC_ARM64_REG_B0)], *(int8_t*) value);
|
||||
} else {
|
||||
switch(regid) {
|
||||
default: break;
|
||||
|
||||
@@ -64,6 +64,9 @@ int arm_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
|
||||
*(float64 *)value = ARM_CPU(uc, mycpu)->env.vfp.regs[regid - UC_ARM_REG_D0];
|
||||
else {
|
||||
switch(regid) {
|
||||
case UC_ARM_REG_APSR:
|
||||
*(int32_t *)value = cpsr_read(&ARM_CPU(uc, mycpu)->env) & CPSR_NZCV;
|
||||
break;
|
||||
case UC_ARM_REG_CPSR:
|
||||
*(int32_t *)value = cpsr_read(&ARM_CPU(uc, mycpu)->env);
|
||||
break;
|
||||
@@ -109,6 +112,9 @@ int arm_reg_write(struct uc_struct *uc, unsigned int *regs, void* const* vals, i
|
||||
ARM_CPU(uc, mycpu)->env.vfp.regs[regid - UC_ARM_REG_D0] = *(float64 *)value;
|
||||
else {
|
||||
switch(regid) {
|
||||
case UC_ARM_REG_APSR:
|
||||
cpsr_write(&ARM_CPU(uc, mycpu)->env, *(uint32_t *)value, CPSR_NZCV);
|
||||
break;
|
||||
case UC_ARM_REG_CPSR:
|
||||
cpsr_write(&ARM_CPU(uc, mycpu)->env, *(uint32_t *)value, ~0);
|
||||
break;
|
||||
|
||||
@@ -17,6 +17,10 @@ static void load_seg_16_helper(CPUX86State *env, int seg, uint32_t selector)
|
||||
cpu_x86_load_seg_cache(env, seg, selector, (selector << 4), 0xffff, X86_NON_CS_FLAGS);
|
||||
}
|
||||
|
||||
|
||||
extern void helper_wrmsr(CPUX86State *env);
|
||||
extern void helper_rdmsr(CPUX86State *env);
|
||||
|
||||
const int X86_REGS_STORAGE_SIZE = offsetof(CPUX86State, tlb_table);
|
||||
|
||||
static void x86_set_pc(struct uc_struct *uc, uint64_t address)
|
||||
@@ -156,6 +160,49 @@ void x86_reg_reset(struct uc_struct *uc)
|
||||
}
|
||||
}
|
||||
|
||||
static int x86_msr_read(struct uc_struct *uc, uc_x86_msr *msr)
|
||||
{
|
||||
CPUX86State *env = (CPUX86State *)uc->cpu->env_ptr;
|
||||
uint64_t ecx = env->regs[R_ECX];
|
||||
uint64_t eax = env->regs[R_EAX];
|
||||
uint64_t edx = env->regs[R_EDX];
|
||||
|
||||
env->regs[R_ECX] = msr->rid;
|
||||
helper_rdmsr(env);
|
||||
|
||||
msr->value = ((uint32_t)env->regs[R_EAX]) |
|
||||
((uint64_t)((uint32_t)env->regs[R_EDX]) << 32);
|
||||
|
||||
env->regs[R_EAX] = eax;
|
||||
env->regs[R_ECX] = ecx;
|
||||
env->regs[R_EDX] = edx;
|
||||
|
||||
/* The implementation doesn't throw exception or return an error if there is one, so
|
||||
* we will return 0. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int x86_msr_write(struct uc_struct *uc, uc_x86_msr *msr)
|
||||
{
|
||||
CPUX86State *env = (CPUX86State *)uc->cpu->env_ptr;
|
||||
uint64_t ecx = env->regs[R_ECX];
|
||||
uint64_t eax = env->regs[R_EAX];
|
||||
uint64_t edx = env->regs[R_EDX];
|
||||
|
||||
env->regs[R_ECX] = msr->rid;
|
||||
env->regs[R_EAX] = (unsigned int)msr->value;
|
||||
env->regs[R_EDX] = (unsigned int)(msr->value >> 32);
|
||||
helper_wrmsr(env);
|
||||
|
||||
env->regs[R_ECX] = ecx;
|
||||
env->regs[R_EAX] = eax;
|
||||
env->regs[R_EDX] = edx;
|
||||
|
||||
/* The implementation doesn't throw exception or return an error if there is one, so
|
||||
* we will return 0. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count)
|
||||
{
|
||||
CPUState *mycpu = uc->cpu;
|
||||
@@ -401,6 +448,9 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
|
||||
((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.tr.selector;
|
||||
((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.tr.flags;
|
||||
break;
|
||||
case UC_X86_REG_MSR:
|
||||
x86_msr_read(uc, (uc_x86_msr *)value);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -680,6 +730,9 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
|
||||
((uc_x86_mmr *)value)->selector = (uint16_t)X86_CPU(uc, mycpu)->env.tr.selector;
|
||||
((uc_x86_mmr *)value)->flags = X86_CPU(uc, mycpu)->env.tr.flags;
|
||||
break;
|
||||
case UC_X86_REG_MSR:
|
||||
x86_msr_read(uc, (uc_x86_msr *)value);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
@@ -924,6 +977,9 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
|
||||
X86_CPU(uc, mycpu)->env.tr.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
|
||||
X86_CPU(uc, mycpu)->env.tr.flags = ((uc_x86_mmr *)value)->flags;
|
||||
break;
|
||||
case UC_X86_REG_MSR:
|
||||
x86_msr_write(uc, (uc_x86_msr *)value);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1213,6 +1269,9 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
|
||||
X86_CPU(uc, mycpu)->env.tr.selector = (uint16_t)((uc_x86_mmr *)value)->selector;
|
||||
X86_CPU(uc, mycpu)->env.tr.flags = ((uc_x86_mmr *)value)->flags;
|
||||
break;
|
||||
case UC_X86_REG_MSR:
|
||||
x86_msr_write(uc, (uc_x86_msr *)value);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
@@ -1257,3 +1316,5 @@ void x86_uc_init(struct uc_struct* uc)
|
||||
uc->stop_interrupt = x86_stop_interrupt;
|
||||
uc_common_init(uc);
|
||||
}
|
||||
|
||||
/* vim: set ts=4 sts=4 sw=4 et: */
|
||||
|
||||
@@ -18,6 +18,12 @@ const int MIPS_REGS_STORAGE_SIZE = offsetof(CPUMIPSState, tlb_table);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_MIPS64
|
||||
typedef uint64_t mipsreg_t;
|
||||
#else
|
||||
typedef uint32_t mipsreg_t;
|
||||
#endif
|
||||
|
||||
static uint64_t mips_mem_redirect(uint64_t address)
|
||||
{
|
||||
// kseg0 range masks off high address bit
|
||||
@@ -91,7 +97,7 @@ int mips_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int cou
|
||||
switch(regid) {
|
||||
default: break;
|
||||
case UC_MIPS_REG_PC:
|
||||
*(int32_t *)value = MIPS_CPU(uc, mycpu)->env.active_tc.PC;
|
||||
*(mipsreg_t *)value = MIPS_CPU(uc, mycpu)->env.active_tc.PC;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -109,12 +115,12 @@ int mips_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals,
|
||||
unsigned int regid = regs[i];
|
||||
const void *value = vals[i];
|
||||
if (regid >= UC_MIPS_REG_0 && regid <= UC_MIPS_REG_31)
|
||||
MIPS_CPU(uc, mycpu)->env.active_tc.gpr[regid - UC_MIPS_REG_0] = *(uint32_t *)value;
|
||||
MIPS_CPU(uc, mycpu)->env.active_tc.gpr[regid - UC_MIPS_REG_0] = *(mipsreg_t *)value;
|
||||
else {
|
||||
switch(regid) {
|
||||
default: break;
|
||||
case UC_MIPS_REG_PC:
|
||||
MIPS_CPU(uc, mycpu)->env.active_tc.PC = *(uint32_t *)value;
|
||||
MIPS_CPU(uc, mycpu)->env.active_tc.PC = *(mipsreg_t *)value;
|
||||
// force to quit execution and flush TB
|
||||
uc->quit_request = true;
|
||||
uc_emu_stop(uc);
|
||||
|
||||
@@ -717,8 +717,8 @@ void tcg_gen_callN(TCGContext *s, void *func, TCGArg ret,
|
||||
int is_64bit = sizemask & (1 << (i+1)*2);
|
||||
if (is_64bit) {
|
||||
TCGv_i64 orig = MAKE_TCGV_I64(args[i]);
|
||||
TCGv_i32 h = tcg_temp_new_i32();
|
||||
TCGv_i32 l = tcg_temp_new_i32();
|
||||
TCGv_i32 h = tcg_temp_new_i32(s);
|
||||
TCGv_i32 l = tcg_temp_new_i32(s);
|
||||
tcg_gen_extr_i64_i32(l, h, orig);
|
||||
split_args[real_args++] = GET_TCGV_I32(h);
|
||||
split_args[real_args++] = GET_TCGV_I32(l);
|
||||
@@ -738,9 +738,9 @@ void tcg_gen_callN(TCGContext *s, void *func, TCGArg ret,
|
||||
TCGv_i64 temp = tcg_temp_new_i64(s);
|
||||
TCGv_i64 orig = MAKE_TCGV_I64(args[i]);
|
||||
if (is_signed) {
|
||||
tcg_gen_ext32s_i64(temp, orig);
|
||||
tcg_gen_ext32s_i64(s, temp, orig);
|
||||
} else {
|
||||
tcg_gen_ext32u_i64(temp, orig);
|
||||
tcg_gen_ext32u_i64(s, temp, orig);
|
||||
}
|
||||
args[i] = GET_TCGV_I64(temp);
|
||||
}
|
||||
@@ -834,8 +834,8 @@ void tcg_gen_callN(TCGContext *s, void *func, TCGArg ret,
|
||||
if (is_64bit) {
|
||||
TCGv_i32 h = MAKE_TCGV_I32(args[real_args++]);
|
||||
TCGv_i32 l = MAKE_TCGV_I32(args[real_args++]);
|
||||
tcg_temp_free_i32(h);
|
||||
tcg_temp_free_i32(l);
|
||||
tcg_temp_free_i32(s, h);
|
||||
tcg_temp_free_i32(s, l);
|
||||
} else {
|
||||
real_args++;
|
||||
}
|
||||
@@ -845,15 +845,15 @@ void tcg_gen_callN(TCGContext *s, void *func, TCGArg ret,
|
||||
Note that describing these as TCGv_i64 eliminates an unnecessary
|
||||
zero-extension that tcg_gen_concat_i32_i64 would create. */
|
||||
tcg_gen_concat32_i64(MAKE_TCGV_I64(ret), retl, reth);
|
||||
tcg_temp_free_i64(retl);
|
||||
tcg_temp_free_i64(reth);
|
||||
tcg_temp_free_i64(s, retl);
|
||||
tcg_temp_free_i64(s, reth);
|
||||
}
|
||||
#elif defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64
|
||||
for (i = 0; i < nargs; ++i) {
|
||||
int is_64bit = sizemask & (1 << (i+1)*2);
|
||||
if (!is_64bit) {
|
||||
TCGv_i64 temp = MAKE_TCGV_I64(args[i]);
|
||||
tcg_temp_free_i64(temp);
|
||||
tcg_temp_free_i64(s, temp);
|
||||
}
|
||||
}
|
||||
#endif /* TCG_TARGET_EXTEND_ARGS */
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#ifndef UNICORN_AUTOGEN_X86_64_H
|
||||
#define UNICORN_AUTOGEN_X86_64_H
|
||||
#define aarch64_tb_set_jmp_target aarch64_tb_set_jmp_target_x86_64
|
||||
#define ppc_tb_set_jmp_target ppc_tb_set_jmp_target_x86_64
|
||||
#define use_idiv_instructions_rt use_idiv_instructions_rt_x86_64
|
||||
#define tcg_target_deposit_valid tcg_target_deposit_valid_x86_64
|
||||
#define helper_power_down helper_power_down_x86_64
|
||||
|
||||
Reference in New Issue
Block a user