diff mbox series

linux-user: Add AT_HWCAP2 for aarch64-linux-user

Message ID 20190809171156.3476-1-richard.henderson@linaro.org
State Superseded
Headers show
Series linux-user: Add AT_HWCAP2 for aarch64-linux-user | expand

Commit Message

Richard Henderson Aug. 9, 2019, 5:11 p.m. UTC
Add the HWCAP2_* bits from kernel version v5.3-rc3.
Enable the bits corresponding to ARMv8.5-CondM and ARMv8.5-FRINT.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 linux-user/elfload.c | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)
---

The HWCAP2_FLAGM2 and HWCAP2_FRINT bits came in during the 
last merge window and will be in the upcoming v5.3 release.
We don't yet implement any of the other extensions that make
up the rest of the HWCAP2 bits.


r~


-- 
2.17.1

Comments

Peter Maydell Aug. 12, 2019, 4:39 p.m. UTC | #1
On Fri, 9 Aug 2019 at 18:11, Richard Henderson
<richard.henderson@linaro.org> wrote:
>

> Add the HWCAP2_* bits from kernel version v5.3-rc3.

> Enable the bits corresponding to ARMv8.5-CondM and ARMv8.5-FRINT.

>

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  linux-user/elfload.c | 31 +++++++++++++++++++++++++++----

>  1 file changed, 27 insertions(+), 4 deletions(-)

> ---

>

> The HWCAP2_FLAGM2 and HWCAP2_FRINT bits came in during the

> last merge window and will be in the upcoming v5.3 release.

> We don't yet implement any of the other extensions that make

> up the rest of the HWCAP2 bits.


Reviewed-by: Peter Maydell <peter.maydell@linaro.org>


thanks
-- PMM
Laurent Vivier Aug. 23, 2019, 3:34 p.m. UTC | #2
Le 09/08/2019 à 19:11, Richard Henderson a écrit :
> Add the HWCAP2_* bits from kernel version v5.3-rc3.

> Enable the bits corresponding to ARMv8.5-CondM and ARMv8.5-FRINT.

> 

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  linux-user/elfload.c | 31 +++++++++++++++++++++++++++----

>  1 file changed, 27 insertions(+), 4 deletions(-)

> ---

> 

> The HWCAP2_FLAGM2 and HWCAP2_FRINT bits came in during the 

> last merge window and will be in the upcoming v5.3 release.

> We don't yet implement any of the other extensions that make

> up the rest of the HWCAP2 bits.

> 

> 

> r~

> 

> 

> diff --git a/linux-user/elfload.c b/linux-user/elfload.c

> index bd43c4817d..4fd2f46f18 100644

> --- a/linux-user/elfload.c

> +++ b/linux-user/elfload.c

> @@ -606,9 +606,23 @@ enum {

>      ARM_HWCAP_A64_SB            = 1 << 29,

>      ARM_HWCAP_A64_PACA          = 1 << 30,

>      ARM_HWCAP_A64_PACG          = 1UL << 31,

> +

> +    ARM_HWCAP2_A64_DCPODP       = 1 << 0,

> +    ARM_HWCAP2_A64_SVE2         = 1 << 1,

> +    ARM_HWCAP2_A64_SVEAES       = 1 << 2,

> +    ARM_HWCAP2_A64_SVEPMULL     = 1 << 3,

> +    ARM_HWCAP2_A64_SVEBITPERM   = 1 << 4,

> +    ARM_HWCAP2_A64_SVESHA3      = 1 << 5,

> +    ARM_HWCAP2_A64_SVESM4       = 1 << 6,

> +    ARM_HWCAP2_A64_FLAGM2       = 1 << 7,

> +    ARM_HWCAP2_A64_FRINT        = 1 << 8,

>  };

>  

> -#define ELF_HWCAP get_elf_hwcap()

> +#define ELF_HWCAP   get_elf_hwcap()

> +#define ELF_HWCAP2  get_elf_hwcap2()

> +

> +#define GET_FEATURE_ID(feat, hwcap) \

> +    do { if (cpu_isar_feature(feat, cpu)) { hwcaps |= hwcap; } } while (0)

>  

>  static uint32_t get_elf_hwcap(void)

>  {

> @@ -620,8 +634,6 @@ static uint32_t get_elf_hwcap(void)

>      hwcaps |= ARM_HWCAP_A64_CPUID;

>  

>      /* probe for the extra features */

> -#define GET_FEATURE_ID(feat, hwcap) \

> -    do { if (cpu_isar_feature(feat, cpu)) { hwcaps |= hwcap; } } while (0)

>  

>      GET_FEATURE_ID(aa64_aes, ARM_HWCAP_A64_AES);

>      GET_FEATURE_ID(aa64_pmull, ARM_HWCAP_A64_PMULL);

> @@ -644,11 +656,22 @@ static uint32_t get_elf_hwcap(void)

>      GET_FEATURE_ID(aa64_sb, ARM_HWCAP_A64_SB);

>      GET_FEATURE_ID(aa64_condm_4, ARM_HWCAP_A64_FLAGM);

>  

> -#undef GET_FEATURE_ID

> +    return hwcaps;

> +}

> +

> +static uint32_t get_elf_hwcap2(void)

> +{

> +    ARMCPU *cpu = ARM_CPU(thread_cpu);

> +    uint32_t hwcaps = 0;

> +

> +    GET_FEATURE_ID(aa64_condm_5, ARM_HWCAP2_A64_FLAGM2);

> +    GET_FEATURE_ID(aa64_frint, ARM_HWCAP2_A64_FRINT);

>  

>      return hwcaps;

>  }

>  

> +#undef GET_FEATURE_ID

> +

>  #endif /* not TARGET_AARCH64 */

>  #endif /* TARGET_ARM */

>  

> 


Applied to my linux-user branch.

Thanks,
Laurent
diff mbox series

Patch

diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index bd43c4817d..4fd2f46f18 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -606,9 +606,23 @@  enum {
     ARM_HWCAP_A64_SB            = 1 << 29,
     ARM_HWCAP_A64_PACA          = 1 << 30,
     ARM_HWCAP_A64_PACG          = 1UL << 31,
+
+    ARM_HWCAP2_A64_DCPODP       = 1 << 0,
+    ARM_HWCAP2_A64_SVE2         = 1 << 1,
+    ARM_HWCAP2_A64_SVEAES       = 1 << 2,
+    ARM_HWCAP2_A64_SVEPMULL     = 1 << 3,
+    ARM_HWCAP2_A64_SVEBITPERM   = 1 << 4,
+    ARM_HWCAP2_A64_SVESHA3      = 1 << 5,
+    ARM_HWCAP2_A64_SVESM4       = 1 << 6,
+    ARM_HWCAP2_A64_FLAGM2       = 1 << 7,
+    ARM_HWCAP2_A64_FRINT        = 1 << 8,
 };
 
-#define ELF_HWCAP get_elf_hwcap()
+#define ELF_HWCAP   get_elf_hwcap()
+#define ELF_HWCAP2  get_elf_hwcap2()
+
+#define GET_FEATURE_ID(feat, hwcap) \
+    do { if (cpu_isar_feature(feat, cpu)) { hwcaps |= hwcap; } } while (0)
 
 static uint32_t get_elf_hwcap(void)
 {
@@ -620,8 +634,6 @@  static uint32_t get_elf_hwcap(void)
     hwcaps |= ARM_HWCAP_A64_CPUID;
 
     /* probe for the extra features */
-#define GET_FEATURE_ID(feat, hwcap) \
-    do { if (cpu_isar_feature(feat, cpu)) { hwcaps |= hwcap; } } while (0)
 
     GET_FEATURE_ID(aa64_aes, ARM_HWCAP_A64_AES);
     GET_FEATURE_ID(aa64_pmull, ARM_HWCAP_A64_PMULL);
@@ -644,11 +656,22 @@  static uint32_t get_elf_hwcap(void)
     GET_FEATURE_ID(aa64_sb, ARM_HWCAP_A64_SB);
     GET_FEATURE_ID(aa64_condm_4, ARM_HWCAP_A64_FLAGM);
 
-#undef GET_FEATURE_ID
+    return hwcaps;
+}
+
+static uint32_t get_elf_hwcap2(void)
+{
+    ARMCPU *cpu = ARM_CPU(thread_cpu);
+    uint32_t hwcaps = 0;
+
+    GET_FEATURE_ID(aa64_condm_5, ARM_HWCAP2_A64_FLAGM2);
+    GET_FEATURE_ID(aa64_frint, ARM_HWCAP2_A64_FRINT);
 
     return hwcaps;
 }
 
+#undef GET_FEATURE_ID
+
 #endif /* not TARGET_AARCH64 */
 #endif /* TARGET_ARM */