Le 04/06/2019 à 11:36, David Hildenbrand a écrit : > Let's add all HWCAPs that we can support under TCG right now, when the > respective CPU facilities are enabled. > > Cc: Riku Voipio <riku.voi...@iki.fi> > Cc: Laurent Vivier <laur...@vivier.eu> > Cc: Cornelia Huck <coh...@redhat.com> > Cc: Laurent Vivier <laur...@vivier.eu> > Cc: Richard Henderson <richard.hender...@linaro.org> > Signed-off-by: David Hildenbrand <da...@redhat.com> > --- > > This patch is based on "[PATCH v2 00/22] s390x/tcg: Vector Instruction > Support Part 4". I guess it is best if I just include it in my next > pull request. Based-on: <20190603090635.10631-1-da...@redhat.com> [PATCH v2 00/22] s390x/tcg: Vector Instruction Support Part 4
> > --- > include/elf.h | 1 + > linux-user/elfload.c | 39 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 40 insertions(+) > > diff --git a/include/elf.h b/include/elf.h > index ea7708a4ea..3501e0c8d0 100644 > --- a/include/elf.h > +++ b/include/elf.h > @@ -598,6 +598,7 @@ typedef struct { > #define HWCAP_S390_ETF3EH 256 > #define HWCAP_S390_HIGH_GPRS 512 > #define HWCAP_S390_TE 1024 > +#define HWCAP_S390_VXRS 2048 > > /* M68K specific definitions. */ > /* We use the top 24 bits to encode information about the > diff --git a/linux-user/elfload.c b/linux-user/elfload.c > index a57b7049dd..59b813066c 100644 > --- a/linux-user/elfload.c > +++ b/linux-user/elfload.c > @@ -1308,6 +1308,45 @@ static inline void init_thread(struct target_pt_regs > *regs, > #define ELF_DATA ELFDATA2MSB > #define ELF_ARCH EM_S390 > > +#include "elf.h" > + > +#define ELF_HWCAP get_elf_hwcap() > + > +static uint32_t get_elf_hwcap(void) > +{ > + uint32_t hwcap = 0; > + > + if (s390_has_feat(S390_FEAT_ESAN3)) { > + hwcap |= HWCAP_S390_ESAN3; > + } > + if (s390_has_feat(S390_FEAT_ZARCH)) { > + hwcap |= HWCAP_S390_ZARCH; > + } > + if (s390_has_feat(S390_FEAT_STFLE)) { > + hwcap |= HWCAP_S390_STFLE; > + } > + if (s390_has_feat(S390_FEAT_MSA)) { > + hwcap |= HWCAP_S390_MSA; > + } > + if (s390_has_feat(S390_FEAT_LONG_DISPLACEMENT)) { > + hwcap |= HWCAP_S390_LDISP; > + } > + if (s390_has_feat(S390_FEAT_EXTENDED_IMMEDIATE)) { > + hwcap |= HWCAP_S390_EIMM; > + } > + if (s390_has_feat(S390_FEAT_EXTENDED_TRANSLATION_3) && > + s390_has_feat(S390_FEAT_ETF3_ENH)) { > + hwcap |= HWCAP_S390_ETF3EH; > + } > + /* 31-bit processes can use 64-bit registers */ > + hwcap |= HWCAP_S390_HIGH_GPRS; > + if (s390_has_feat(S390_FEAT_VECTOR)) { > + hwcap |= HWCAP_S390_VXRS; > + } > + > + return hwcap; > +} > + > static inline void init_thread(struct target_pt_regs *regs, struct > image_info *infop) > { > regs->psw.addr = infop->entry; > Acked-by: Laurent Vivier <laur...@vivier.eu> You can also do like the other architectures that use shortcuts like this: #define GET_FEATURE(feat, hwcap) \ do { if (s390_has_feat(feat)) { hwcaps |= hwcap; } } while (0) ... GET_FEATURE(S390_FEAT_VECTOR, HWCAP_S390_VXRS); ... Thanks, Laurent