Commit 2171364d authored by Michael Neuling's avatar Michael Neuling Committed by Benjamin Herrenschmidt

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: default avatarMichael Neuling <michael@neuling.org>
Signed-off-by: default avatarNishanth Aravamudan <nacc@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 6263fb3b
...@@ -52,6 +52,7 @@ struct cpu_spec { ...@@ -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 */
......
...@@ -61,6 +61,7 @@ typedef elf_vrregset_t elf_fpxregset_t; ...@@ -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
......
...@@ -240,6 +240,9 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, ...@@ -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,
......
...@@ -483,7 +483,6 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm, ...@@ -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, ...@@ -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, ...@@ -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);
......
...@@ -28,6 +28,7 @@ ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment