From: Jeremie Courreges-Anglas Subject: powerpc64 minimal AT_HWCAP support To: tech@openbsd.org Cc: kettenis@openbsd.org, gkoehler@openbsd.org, brad@comstyle.com, miod@openbsd.org Date: Mon, 15 Jul 2024 16:37:41 +0200 Since we always save and restore VSX registers, I'm advertising this feature unconditionnally. mesa may make use of this. Compile-tested only using clang-16 -target..., I don't own this hardware. ok? diff --git a/sys/arch/powerpc64/include/cpu.h b/sys/arch/powerpc64/include/cpu.h index fe0394f457b..63b52beb7aa 100644 --- a/sys/arch/powerpc64/include/cpu.h +++ b/sys/arch/powerpc64/include/cpu.h @@ -41,6 +41,7 @@ */ #include +#include #include #include #include @@ -177,9 +178,6 @@ void signotify(struct proc *); extern uint32_t cpu_features; extern uint32_t cpu_features2; -#define PPC_FEATURE2_ARCH_3_00 0x00800000 -#define PPC_FEATURE2_DARN 0x00200000 - void cpu_init_features(void); void cpu_init(void); diff --git a/sys/arch/powerpc64/include/elf.h b/sys/arch/powerpc64/include/elf.h index a3503ab099b..cb662d121f7 100644 --- a/sys/arch/powerpc64/include/elf.h +++ b/sys/arch/powerpc64/include/elf.h @@ -8,7 +8,55 @@ #define _MACHINE_ELF_H_ /* - * TODO FreeBSD puts PPC_FEATURE* in cpu.h + * CPU Feature Attributes + * + * These are defined in the PowerPC ELF ABI for the AT_HWCAP vector, + * and are exported to userland via the elf_aux_info(3) function. */ +#define __HAVE_CPU_HWCAP +#define __HAVE_CPU_HWCAP2 +extern unsigned long hwcap; +extern unsigned long hwcap2; + +#define PPC_FEATURE_32 0x80000000 /* Always true */ +#define PPC_FEATURE_64 0x40000000 /* Defined on a 64-bit CPU */ +#define PPC_FEATURE_601_INSTR 0x20000000 /* Defined on a 64-bit CPU */ +#define PPC_FEATURE_HAS_ALTIVEC 0x10000000 +#define PPC_FEATURE_HAS_FPU 0x08000000 +#define PPC_FEATURE_HAS_MMU 0x04000000 +#define PPC_FEATURE_UNIFIED_CACHE 0x01000000 +#define PPC_FEATURE_HAS_SPE 0x00800000 +#define PPC_FEATURE_HAS_EFP_SINGLE 0x00400000 +#define PPC_FEATURE_HAS_EFP_DOUBLE 0x00200000 +#define PPC_FEATURE_NO_TB 0x00100000 +#define PPC_FEATURE_POWER4 0x00080000 +#define PPC_FEATURE_POWER5 0x00040000 +#define PPC_FEATURE_POWER5_PLUS 0x00020000 +#define PPC_FEATURE_CELL 0x00010000 +#define PPC_FEATURE_BOOKE 0x00008000 +#define PPC_FEATURE_SMT 0x00004000 +#define PPC_FEATURE_ICACHE_SNOOP 0x00002000 +#define PPC_FEATURE_ARCH_2_05 0x00001000 +#define PPC_FEATURE_HAS_DFP 0x00000400 +#define PPC_FEATURE_POWER6_EXT 0x00000200 +#define PPC_FEATURE_ARCH_2_06 0x00000100 +#define PPC_FEATURE_HAS_VSX 0x00000080 +#define PPC_FEATURE_TRUE_LE 0x00000002 +#define PPC_FEATURE_PPC_LE 0x00000001 + +#define PPC_FEATURE2_ARCH_2_07 0x80000000 +#define PPC_FEATURE2_HTM 0x40000000 +#define PPC_FEATURE2_DSCR 0x20000000 +#define PPC_FEATURE2_EBB 0x10000000 +#define PPC_FEATURE2_ISEL 0x08000000 +#define PPC_FEATURE2_TAR 0x04000000 +#define PPC_FEATURE2_HAS_VEC_CRYPTO 0x02000000 +#define PPC_FEATURE2_HTM_NOSC 0x01000000 +#define PPC_FEATURE2_ARCH_3_00 0x00800000 +#define PPC_FEATURE2_HAS_IEEE128 0x00400000 +#define PPC_FEATURE2_DARN 0x00200000 +#define PPC_FEATURE2_SCV 0x00100000 +#define PPC_FEATURE2_HTM_NOSUSPEND 0x00080000 + #endif /* !_MACHINE_ELF_H_ */ diff --git a/sys/arch/powerpc64/powerpc64/cpu.c b/sys/arch/powerpc64/powerpc64/cpu.c index 3f0bd032eab..3bd7833f652 100644 --- a/sys/arch/powerpc64/powerpc64/cpu.c +++ b/sys/arch/powerpc64/powerpc64/cpu.c @@ -226,6 +226,10 @@ cpu_init_features(void) { uint32_t pvr = mfpvr(); + cpu_features = PPC_FEATURE_32 | PPC_FEATURE_64 | PPC_FEATURE_HAS_FPU | + PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_ALTIVEC | + PPC_FEATURE_HAS_VSX; + switch (CPU_VERSION(pvr)) { case CPU_IBMPOWER9: case CPU_IBMPOWER9P: @@ -233,6 +237,9 @@ cpu_init_features(void) cpu_features2 |= PPC_FEATURE2_DARN; break; } + + hwcap = cpu_features; + hwcap2 = cpu_features2; } void -- jca