On 12/11/2018 23:12, Alex Bennée wrote: > > Laurent Vivier <lviv...@redhat.com> writes: > >> On 29/06/2018 16:53, Peter Maydell wrote: >>> From: Richard Henderson <richard.hender...@linaro.org> >>> >>> Enable ARM_FEATURE_SVE for the generic "max" cpu. >>> >>> Tested-by: Alex Bennée <alex.ben...@linaro.org> >>> Reviewed-by: Peter Maydell <peter.mayd...@linaro.org> >>> Signed-off-by: Richard Henderson <richard.hender...@linaro.org> >>> Message-id: 20180627043328.11531-35-richard.hender...@linaro.org >>> Signed-off-by: Peter Maydell <peter.mayd...@linaro.org> >>> --- >>> linux-user/elfload.c | 1 + >>> target/arm/cpu.c | 7 +++++++ >>> target/arm/cpu64.c | 1 + >>> 3 files changed, 9 insertions(+) >>> >>> diff --git a/linux-user/elfload.c b/linux-user/elfload.c >>> index 13bc78d0c86..d1231ad07a3 100644 >>> --- a/linux-user/elfload.c >>> +++ b/linux-user/elfload.c >>> @@ -584,6 +584,7 @@ static uint32_t get_elf_hwcap(void) >>> GET_FEATURE(ARM_FEATURE_V8_ATOMICS, ARM_HWCAP_A64_ATOMICS); >>> GET_FEATURE(ARM_FEATURE_V8_RDM, ARM_HWCAP_A64_ASIMDRDM); >>> GET_FEATURE(ARM_FEATURE_V8_FCMA, ARM_HWCAP_A64_FCMA); >>> + GET_FEATURE(ARM_FEATURE_SVE, ARM_HWCAP_A64_SVE); >>> #undef GET_FEATURE >>> >>> return hwcaps; >>> diff --git a/target/arm/cpu.c b/target/arm/cpu.c >>> index 2ae4fffafb9..6dcc552e143 100644 >>> --- a/target/arm/cpu.c >>> +++ b/target/arm/cpu.c >>> @@ -164,6 +164,13 @@ static void arm_cpu_reset(CPUState *s) >>> env->cp15.sctlr_el[1] |= SCTLR_UCT | SCTLR_UCI | SCTLR_DZE; >>> /* and to the FP/Neon instructions */ >>> env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 20, 2, 3); >>> + /* and to the SVE instructions */ >>> + env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 16, 2, 3); >>> + env->cp15.cptr_el[3] |= CPTR_EZ; >>> + /* with maximum vector length */ >>> + env->vfp.zcr_el[1] = ARM_MAX_VQ - 1; >>> + env->vfp.zcr_el[2] = ARM_MAX_VQ - 1; >>> + env->vfp.zcr_el[3] = ARM_MAX_VQ - 1; >>> #else >>> /* Reset into the highest available EL */ >>> if (arm_feature(env, ARM_FEATURE_EL3)) { >>> diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c >>> index c50dcd4077d..0360d7efc5e 100644 >>> --- a/target/arm/cpu64.c >>> +++ b/target/arm/cpu64.c >>> @@ -252,6 +252,7 @@ static void aarch64_max_initfn(Object *obj) >>> set_feature(&cpu->env, ARM_FEATURE_V8_RDM); >>> set_feature(&cpu->env, ARM_FEATURE_V8_FP16); >>> set_feature(&cpu->env, ARM_FEATURE_V8_FCMA); >>> + set_feature(&cpu->env, ARM_FEATURE_SVE); >>> /* For usermode -cpu max we can use a larger and more efficient DCZ >>> * blocksize since we don't have to follow what the hardware does. >>> */ >>> >> >> Running some tests for my pull request, I've found this commit breaks >> ltp-full-20180515 sigaltstack01 tests with ubuntu arm64/trusty. >> >> sigaltstack01 274 TBROK : tst_sig.c:233: unexpected signal >> SIGIOT/SIGABRT(6) received (pid = 15241). >> *** Error in `/opt/ltp/testcases/bin/sigaltstack01': free(): invalid >> pointer: 0x000000000042a010 *** > > I wonder if that is the test case not handling the full frame size (or > us not checking the allocated size). What syscall or signal delivery was > happening at the time? >
The signal is an abort() triggered by the libc. But I think the first problem happens because memory is corrupted: it crashes in the cleanup() function when the test is over and the memory is freed. #4149 <signal handler called> #4150 __GI_abort () at abort.c:91 #4151 0x00000040008a1448 in __libc_message (do_abort=1, fmt=fmt@entry=0x4000950cb0 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:175 #4152 0x00000040008ab71c in malloc_printerr (action=1, str=0x4000950ed8 "free(): invalid pointer", ptr=<optimized out>) at malloc.c:4996 #4153 0x00000040008ac4f4 in _int_free (av=0x400097a560 <main_arena>, p=<optimized out>, have_lock=0) at malloc.c:3840 #4154 0x0000000000403340 in cleanup () at sigaltstack01.c:236 #4155 main (ac=<optimized out>, av=<optimized out>) at sigaltstack01.c:165 233 void cleanup(void) 234 { 235 236 free(sigstk.ss_sp); 237 238 } Thanks, Laurent