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
					
				
			
		
					 5 changed files with 10 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -52,6 +52,7 @@ struct cpu_spec {
 | 
			
		|||
	char		*cpu_name;
 | 
			
		||||
	unsigned long	cpu_features;		/* Kernel features */
 | 
			
		||||
	unsigned int	cpu_user_features;	/* Userland features */
 | 
			
		||||
	unsigned int	cpu_user_features2;	/* Userland features v2 */
 | 
			
		||||
	unsigned int	mmu_features;		/* MMU features */
 | 
			
		||||
 | 
			
		||||
	/* 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,
 | 
			
		||||
   but it's not easy, and we've already done it here.  */
 | 
			
		||||
# 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
 | 
			
		||||
   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_SECURE, security_bprm_secureexec(bprm));
 | 
			
		||||
	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);
 | 
			
		||||
	if (k_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;
 | 
			
		||||
	char *k_platform, *k_base_platform;
 | 
			
		||||
	char __user *u_platform, *u_base_platform, *p;
 | 
			
		||||
	long hwcap;
 | 
			
		||||
	int loop;
 | 
			
		||||
	int nr;	/* reset for each csp adjustment */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -502,8 +501,6 @@ static int create_elf_fdpic_tables(struct linux_binprm *bprm,
 | 
			
		|||
		return -EFAULT;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	hwcap = ELF_HWCAP;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If this architecture has a platform capability string, copy it
 | 
			
		||||
	 * 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;
 | 
			
		||||
	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_CLKTCK,	CLOCKS_PER_SEC);
 | 
			
		||||
	NEW_AUX_ENT(AT_PHDR,	exec_params->ph_addr);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,7 @@
 | 
			
		|||
#define AT_BASE_PLATFORM 24	/* string identifying real platform, may
 | 
			
		||||
				 * differ from AT_PLATFORM. */
 | 
			
		||||
#define AT_RANDOM 25	/* address of 16 random bytes */
 | 
			
		||||
#define AT_HWCAP2 26	/* extension of AT_HWCAP */
 | 
			
		||||
 | 
			
		||||
#define AT_EXECFN  31	/* filename of program */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue