On 12/11/2018 23:12, Alex Bennée wrote:
>
> Laurent Vivier <lvivier@redhat.com> writes:
>
>> On 29/06/2018 16:53, Peter Maydell wrote:
>>> From: Richard Henderson <richard.henderson@linaro.org>
>>>
>>> Enable ARM_FEATURE_SVE for the generic "max" cpu.
>>>
>>> Tested-by: Alex Bennée <alex.bennee@linaro.org>
>>> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
>>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>>> Message-id: 20180627043328.11531-35-richard.henderson@linaro.org
>>> Signed-off-by: Peter Maydell <peter.maydell@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