linux-user: elf: ELF_HWCAP for s390x
Let's add all HWCAPs that we can support under TCG right now, when the respective CPU facilities are enabled. Cc: Riku Voipio <riku.voipio@iki.fi> Cc: Laurent Vivier <laurent@vivier.eu> Cc: Cornelia Huck <cohuck@redhat.com> Cc: Laurent Vivier <laurent@vivier.eu> Cc: Richard Henderson <richard.henderson@linaro.org> Acked-by: Laurent Vivier <laurent@vivier.eu> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: David Hildenbrand <david@redhat.com>
This commit is contained in:
parent
37c70c43dc
commit
6d88baf186
@ -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
|
||||
|
@ -1308,6 +1308,34 @@ 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()
|
||||
|
||||
#define GET_FEATURE(_feat, _hwcap) \
|
||||
do { if (s390_has_feat(_feat)) { hwcap |= _hwcap; } } while (0)
|
||||
|
||||
static uint32_t get_elf_hwcap(void)
|
||||
{
|
||||
/*
|
||||
* Let's assume we always have esan3 and zarch.
|
||||
* 31-bit processes can use 64-bit registers (high gprs).
|
||||
*/
|
||||
uint32_t hwcap = HWCAP_S390_ESAN3 | HWCAP_S390_ZARCH | HWCAP_S390_HIGH_GPRS;
|
||||
|
||||
GET_FEATURE(S390_FEAT_STFLE, HWCAP_S390_STFLE);
|
||||
GET_FEATURE(S390_FEAT_MSA, HWCAP_S390_MSA);
|
||||
GET_FEATURE(S390_FEAT_LONG_DISPLACEMENT, HWCAP_S390_LDISP);
|
||||
GET_FEATURE(S390_FEAT_EXTENDED_IMMEDIATE, HWCAP_S390_EIMM);
|
||||
if (s390_has_feat(S390_FEAT_EXTENDED_TRANSLATION_3) &&
|
||||
s390_has_feat(S390_FEAT_ETF3_ENH)) {
|
||||
hwcap |= HWCAP_S390_ETF3EH;
|
||||
}
|
||||
GET_FEATURE(S390_FEAT_VECTOR, HWCAP_S390_VXRS);
|
||||
|
||||
return hwcap;
|
||||
}
|
||||
|
||||
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
|
||||
{
|
||||
regs->psw.addr = infop->entry;
|
||||
|
Loading…
Reference in New Issue
Block a user