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>
This commit is contained in:
parent
6263fb3bd7
commit
2171364d1a
@ -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;
|
|||||||
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,
|
|||||||
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,
|
|||||||
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);
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user