1
0
Fork 0

powerpc: Add HWCAP2 aux entry

We are currently out of free bits in AT_HWCAP. With POWER8, we have
several hardware features that we need to advertise.

Tested on POWER and x86.

Signed-off-by: Michael Neuling <michael@neuling.org>
Signed-off-by: Nishanth Aravamudan <nacc@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
hifive-unleashed-5.1
Michael Neuling 2013-04-17 17:33:11 +00:00 committed by Benjamin Herrenschmidt
parent 6263fb3bd7
commit 2171364d1a
5 changed files with 10 additions and 4 deletions

View File

@ -52,6 +52,7 @@ struct cpu_spec {
char *cpu_name; char *cpu_name;
unsigned long cpu_features; /* Kernel features */ unsigned long cpu_features; /* Kernel features */
unsigned int cpu_user_features; /* Userland features */ unsigned int cpu_user_features; /* Userland features */
unsigned int cpu_user_features2; /* Userland features v2 */
unsigned int mmu_features; /* MMU features */ unsigned int mmu_features; /* MMU features */
/* cache line sizes */ /* cache line sizes */

View File

@ -61,6 +61,7 @@ typedef elf_vrregset_t elf_fpxregset_t;
instruction set this cpu supports. This could be done in userspace, instruction set this cpu supports. This could be done in userspace,
but it's not easy, and we've already done it here. */ but it's not easy, and we've already done it here. */
# define ELF_HWCAP (cur_cpu_spec->cpu_user_features) # define ELF_HWCAP (cur_cpu_spec->cpu_user_features)
# define ELF_HWCAP2 (cur_cpu_spec->cpu_user_features2)
/* This yields a string that ld.so will use to load implementation /* This yields a string that ld.so will use to load implementation
specific libraries for optimization. This is more specific in specific libraries for optimization. This is more specific in

View File

@ -240,6 +240,9 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid)); NEW_AUX_ENT(AT_EGID, from_kgid_munged(cred->user_ns, cred->egid));
NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm)); NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm));
NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes); NEW_AUX_ENT(AT_RANDOM, (elf_addr_t)(unsigned long)u_rand_bytes);
#ifdef ELF_HWCAP2
NEW_AUX_ENT(AT_HWCAP2, ELF_HWCAP2);
#endif
NEW_AUX_ENT(AT_EXECFN, bprm->exec); NEW_AUX_ENT(AT_EXECFN, bprm->exec);
if (k_platform) { if (k_platform) {
NEW_AUX_ENT(AT_PLATFORM, NEW_AUX_ENT(AT_PLATFORM,

View File

@ -483,7 +483,6 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,
size_t platform_len = 0, len; size_t platform_len = 0, len;
char *k_platform, *k_base_platform; char *k_platform, *k_base_platform;
char __user *u_platform, *u_base_platform, *p; char __user *u_platform, *u_base_platform, *p;
long hwcap;
int loop; int loop;
int nr; /* reset for each csp adjustment */ int nr; /* reset for each csp adjustment */
@ -502,8 +501,6 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,
return -EFAULT; return -EFAULT;
#endif #endif
hwcap = ELF_HWCAP;
/* /*
* If this architecture has a platform capability string, copy it * If this architecture has a platform capability string, copy it
* to userspace. In some cases (Sparc), this info is impossible * to userspace. In some cases (Sparc), this info is impossible
@ -617,7 +614,10 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,
nr = 0; nr = 0;
csp -= DLINFO_ITEMS * 2 * sizeof(unsigned long); csp -= DLINFO_ITEMS * 2 * sizeof(unsigned long);
NEW_AUX_ENT(AT_HWCAP, hwcap); NEW_AUX_ENT(AT_HWCAP, ELF_HWCAP);
#ifdef ELF_HWCAP2
NEW_AUX_ENT(AT_HWCAP2, ELF_HWCAP2);
#endif
NEW_AUX_ENT(AT_PAGESZ, PAGE_SIZE); NEW_AUX_ENT(AT_PAGESZ, PAGE_SIZE);
NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC); NEW_AUX_ENT(AT_CLKTCK, CLOCKS_PER_SEC);
NEW_AUX_ENT(AT_PHDR, exec_params->ph_addr); NEW_AUX_ENT(AT_PHDR, exec_params->ph_addr);

View File

@ -28,6 +28,7 @@
#define AT_BASE_PLATFORM 24 /* string identifying real platform, may #define AT_BASE_PLATFORM 24 /* string identifying real platform, may
* differ from AT_PLATFORM. */ * differ from AT_PLATFORM. */
#define AT_RANDOM 25 /* address of 16 random bytes */ #define AT_RANDOM 25 /* address of 16 random bytes */
#define AT_HWCAP2 26 /* extension of AT_HWCAP */
#define AT_EXECFN 31 /* filename of program */ #define AT_EXECFN 31 /* filename of program */