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_ETF3EH 256
|
||||||
#define HWCAP_S390_HIGH_GPRS 512
|
#define HWCAP_S390_HIGH_GPRS 512
|
||||||
#define HWCAP_S390_TE 1024
|
#define HWCAP_S390_TE 1024
|
||||||
|
#define HWCAP_S390_VXRS 2048
|
||||||
|
|
||||||
/* M68K specific definitions. */
|
/* M68K specific definitions. */
|
||||||
/* We use the top 24 bits to encode information about the
|
/* 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_DATA ELFDATA2MSB
|
||||||
#define ELF_ARCH EM_S390
|
#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)
|
static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
|
||||||
{
|
{
|
||||||
regs->psw.addr = infop->entry;
|
regs->psw.addr = infop->entry;
|
||||||
|
Loading…
Reference in New Issue
Block a user