qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2] target/arm/arch_dump: Add SVE notes


From: Andrew Jones
Subject: Re: [PATCH v2] target/arm/arch_dump: Add SVE notes
Date: Thu, 10 Oct 2019 08:16:00 +0200
User-agent: NeoMutt/20180716

On Wed, Oct 09, 2019 at 08:39:21PM -0400, Richard Henderson wrote:
> On 10/4/19 8:03 AM, Andrew Jones wrote:
> > +#ifdef TARGET_AARCH64
> > +static off_t sve_zreg_offset(uint32_t vq, int n)
> > +{
> > +    off_t off = sizeof(struct aarch64_user_sve_header);
> > +    return ROUND_UP(off, 16) + vq * 16 * n;
> > +}
> > +static off_t sve_preg_offset(uint32_t vq, int n)
> > +{
> > +    return sve_zreg_offset(vq, 32) + vq * 16 / 8 * n;
> > +}
> > +static off_t sve_fpsr_offset(uint32_t vq)
> > +{
> > +    off_t off = sve_preg_offset(vq, 17) + offsetof(struct aarch64_note, 
> > sve);
> > +    return ROUND_UP(off, 16) - offsetof(struct aarch64_note, sve);
> > +}
> > +static off_t sve_fpcr_offset(uint32_t vq)
> > +{
> > +    return sve_fpsr_offset(vq) + sizeof(uint32_t);
> > +}
> > +static uint32_t sve_current_vq(CPUARMState *env)
> > +{
> > +    return sve_zcr_len_for_el(env, arm_current_el(env)) + 1;
> > +}
> > +static size_t sve_size_vq(uint32_t vq)
> > +{
> > +    off_t off = sve_fpcr_offset(vq) + sizeof(uint32_t) +
> > +                offsetof(struct aarch64_note, sve);
> > +    return ROUND_UP(off, 16) - offsetof(struct aarch64_note, sve);
> > +}
> > +static size_t sve_size(CPUARMState *env)
> > +{
> > +    return sve_size_vq(sve_current_vq(env));
> > +}
> 
> Watch the missing spaces between functions.

I'll put in the blank lines

> 
> > +    for (i = 0; i < 32; ++i) {
> > +#ifdef HOST_WORDS_BIGENDIAN
> > +        uint64_t d[vq * 2];
> > +        int j;
> > +
> > +        for (j = 0; j < vq * 2; ++j) {
> > +            d[j] = bswap64(env->vfp.zregs[i].d[j]);
> > +        }
> > +#else
> > +        uint64_t *d = &env->vfp.zregs[i].d[0];
> > +#endif
> > +        memcpy(&buf[sve_zreg_offset(vq, i)], &d[0], vq * 16);
> > +    }
> 
> We should avoid the variable sized array here.
> 
> It might be best to avoid the ifdef altogether:
> 
>     for (i = 0; i < 32; ++i) {
>         uint64_t *d = (uint64_t *)&buf[sve_zreg_offset(vq, i)];
>         for (j = 0; j < vq * 2; ++j) {
>             d[j] = cpu_to_le64(env->vfp.zregs[i].d[j]);
>         }
>     }
> 
> The compiler may well transform the inner loop to memcpy for little-endian
> host, but even if it doesn't core dumping is hardly performance sensitive.

True. I even had something like the above at first, but then
overcomplicated it with the #ifdef-ing.

Thanks,
drew



reply via email to

[Prev in Thread] Current Thread [Next in Thread]