use qemu_memalign for all cpu structs
Some structs, specically CPUARMState is 16-bytes aligned. This causes segment fault because gcc tends to vectorize the assignment of the struct with infamous movaps tricks. Without this patch, we fail on manylinux with 2.17 glibc in release mode in i686. qemu_memalign will ensure the alignment across platforms.
This commit is contained in:
@@ -2102,10 +2102,12 @@ ARMCPU *cpu_arm_init(struct uc_struct *uc)
|
||||
CPUClass *cc;
|
||||
CPUARMState *env;
|
||||
|
||||
cpu = calloc(1, sizeof(*cpu));
|
||||
// cpu->env is 16 bytes aligned
|
||||
cpu = qemu_memalign(16, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memset((void*)cpu, 0, sizeof(*cpu));
|
||||
|
||||
#if !defined(TARGET_AARCH64)
|
||||
if (uc->mode & UC_MODE_MCLASS) {
|
||||
|
||||
@@ -325,10 +325,12 @@ ARMCPU *cpu_aarch64_init(struct uc_struct *uc)
|
||||
CPUClass *cc;
|
||||
CPUARMState *env;
|
||||
|
||||
cpu = calloc(1, sizeof(*cpu));
|
||||
// cpu->env is 16 bytes alignment
|
||||
cpu = qemu_memalign(16, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memset((void*)cpu, 0, sizeof(*cpu));
|
||||
|
||||
if (uc->cpu_model == INT_MAX) {
|
||||
uc->cpu_model = UC_CPU_ARM64_A72;
|
||||
|
||||
@@ -5076,10 +5076,11 @@ X86CPU *cpu_x86_init(struct uc_struct *uc)
|
||||
CPUClass *cc;
|
||||
X86CPUClass *xcc;
|
||||
|
||||
cpu = calloc(1, sizeof(*cpu));
|
||||
cpu = qemu_memalign(8, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memset((void*)cpu, 0, sizeof(*cpu));
|
||||
|
||||
if (uc->cpu_model == INT_MAX) {
|
||||
#ifdef TARGET_X86_64
|
||||
|
||||
@@ -265,10 +265,11 @@ M68kCPU *cpu_m68k_init(struct uc_struct *uc)
|
||||
CPUState *cs;
|
||||
CPUClass *cc;
|
||||
|
||||
cpu = calloc(1, sizeof(*cpu));
|
||||
cpu = qemu_memalign(8, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memset((void*)cpu, 0, sizeof(*cpu));
|
||||
|
||||
if (uc->cpu_model == INT_MAX) {
|
||||
uc->cpu_model = UC_CPU_M68K_CFV4E; // cfv4e
|
||||
|
||||
@@ -157,10 +157,11 @@ MIPSCPU *cpu_mips_init(struct uc_struct *uc)
|
||||
CPUClass *cc;
|
||||
CPUMIPSState *env;
|
||||
|
||||
cpu = calloc(1, sizeof(*cpu));
|
||||
cpu = qemu_memalign(8, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memset((void*)cpu, 0, sizeof(*cpu));
|
||||
|
||||
#ifdef TARGET_MIPS64
|
||||
if (uc->cpu_model == INT_MAX) {
|
||||
|
||||
@@ -11016,7 +11016,7 @@ PowerPCCPU *cpu_ppc_init(struct uc_struct *uc)
|
||||
CPUClass *cc;
|
||||
PowerPCCPUClass *pcc;
|
||||
|
||||
cpu = malloc(sizeof(*cpu));
|
||||
cpu = qemu_memalign(8, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -335,10 +335,11 @@ RISCVCPU *cpu_riscv_init(struct uc_struct *uc)
|
||||
CPUState *cs;
|
||||
CPUClass *cc;
|
||||
|
||||
cpu = calloc(1, sizeof(*cpu));
|
||||
cpu = qemu_memalign(8, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memset((void*)cpu, 0, sizeof(*cpu));
|
||||
|
||||
#ifdef TARGET_RISCV32
|
||||
if (uc->cpu_model == INT_MAX) {
|
||||
|
||||
@@ -245,10 +245,11 @@ S390CPU *cpu_s390_init(struct uc_struct *uc, const char *cpu_model)
|
||||
CPUClass *cc;
|
||||
// int i;
|
||||
|
||||
cpu = calloc(1, sizeof(*cpu));
|
||||
cpu = qemu_memalign(8, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memset((void*)cpu, 0, sizeof(*cpu));
|
||||
|
||||
if (uc->cpu_model == INT_MAX) {
|
||||
uc->cpu_model = UC_CPU_S390X_QEMU; // qemu-s390x-cpu
|
||||
|
||||
@@ -517,11 +517,11 @@ SPARCCPU *cpu_sparc_init(struct uc_struct *uc)
|
||||
CPUClass *cc;
|
||||
SPARCCPUClass *scc;
|
||||
|
||||
cpu = malloc(sizeof(*cpu));
|
||||
cpu = qemu_memalign(8, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memset(cpu, 0, sizeof(*cpu));
|
||||
memset((void*)cpu, 0, sizeof(*cpu));
|
||||
|
||||
if (uc->cpu_model == INT_MAX) {
|
||||
#ifdef TARGET_SPARC64
|
||||
|
||||
@@ -165,10 +165,11 @@ TriCoreCPU *cpu_tricore_init(struct uc_struct *uc)
|
||||
CPUState *cs;
|
||||
CPUClass *cc;
|
||||
|
||||
cpu = calloc(1, sizeof(*cpu));
|
||||
cpu = qemu_memalign(8, sizeof(*cpu));
|
||||
if (cpu == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
memset((void*)cpu, 0, sizeof(*cpu));
|
||||
|
||||
if (uc->cpu_model == INT_MAX) {
|
||||
uc->cpu_model = 2; // tc27x
|
||||
|
||||
Reference in New Issue
Block a user