diff options
Diffstat (limited to 'scripts/mod')
| -rw-r--r-- | scripts/mod/file2alias.c | 22 | ||||
| -rw-r--r-- | scripts/mod/modpost.c | 16 | ||||
| -rw-r--r-- | scripts/mod/modpost.h | 27 | 
3 files changed, 36 insertions, 29 deletions
| diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 88f3f07205f..e26e2fb462d 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -702,6 +702,24 @@ static int do_ssb_entry(const char *filename,  	return 1;  } +/* Looks like: bcma:mNidNrevNclN. */ +static int do_bcma_entry(const char *filename, +			 struct bcma_device_id *id, char *alias) +{ +	id->manuf = TO_NATIVE(id->manuf); +	id->id = TO_NATIVE(id->id); +	id->rev = TO_NATIVE(id->rev); +	id->class = TO_NATIVE(id->class); + +	strcpy(alias, "bcma:"); +	ADD(alias, "m", id->manuf != BCMA_ANY_MANUF, id->manuf); +	ADD(alias, "id", id->id != BCMA_ANY_ID, id->id); +	ADD(alias, "rev", id->rev != BCMA_ANY_REV, id->rev); +	ADD(alias, "cl", id->class != BCMA_ANY_CLASS, id->class); +	add_wildcard(alias); +	return 1; +} +  /* Looks like: virtio:dNvN */  static int do_virtio_entry(const char *filename, struct virtio_device_id *id,  			   char *alias) @@ -968,6 +986,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,  		do_table(symval, sym->st_size,  			 sizeof(struct ssb_device_id), "ssb",  			 do_ssb_entry, mod); +	else if (sym_is(symname, "__mod_bcma_device_table")) +		do_table(symval, sym->st_size, +			 sizeof(struct bcma_device_id), "bcma", +			 do_bcma_entry, mod);  	else if (sym_is(symname, "__mod_virtio_device_table"))  		do_table(symval, sym->st_size,  			 sizeof(struct virtio_device_id), "virtio", diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index cd104afcc5f..413c53693e6 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -420,11 +420,10 @@ static int parse_elf(struct elf_info *info, const char *filename)  		return 0;  	} -	if (hdr->e_shnum == 0) { +	if (hdr->e_shnum == SHN_UNDEF) {  		/*  		 * There are more than 64k sections,  		 * read count from .sh_size. -		 * note: it doesn't need shndx2secindex()  		 */  		info->num_sections = TO_NATIVE(sechdrs[0].sh_size);  	} @@ -432,8 +431,7 @@ static int parse_elf(struct elf_info *info, const char *filename)  		info->num_sections = hdr->e_shnum;  	}  	if (hdr->e_shstrndx == SHN_XINDEX) { -		info->secindex_strings = -		    shndx2secindex(TO_NATIVE(sechdrs[0].sh_link)); +		info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);  	}  	else {  		info->secindex_strings = hdr->e_shstrndx; @@ -489,7 +487,7 @@ static int parse_elf(struct elf_info *info, const char *filename)  			    sechdrs[i].sh_offset;  			info->symtab_stop  = (void *)hdr +  			    sechdrs[i].sh_offset + sechdrs[i].sh_size; -			sh_link_idx = shndx2secindex(sechdrs[i].sh_link); +			sh_link_idx = sechdrs[i].sh_link;  			info->strtab       = (void *)hdr +  			    sechdrs[sh_link_idx].sh_offset;  		} @@ -516,11 +514,9 @@ static int parse_elf(struct elf_info *info, const char *filename)  	if (symtab_shndx_idx != ~0U) {  		Elf32_Word *p; -		if (symtab_idx != -		    shndx2secindex(sechdrs[symtab_shndx_idx].sh_link)) +		if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)  			fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n", -			      filename, -			      shndx2secindex(sechdrs[symtab_shndx_idx].sh_link), +			      filename, sechdrs[symtab_shndx_idx].sh_link,  			      symtab_idx);  		/* Fix endianness */  		for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop; @@ -1446,7 +1442,7 @@ static unsigned int *reloc_location(struct elf_info *elf,  				    Elf_Shdr *sechdr, Elf_Rela *r)  {  	Elf_Shdr *sechdrs = elf->sechdrs; -	int section = shndx2secindex(sechdr->sh_info); +	int section = sechdr->sh_info;  	return (void *)elf->hdr + sechdrs[section].sh_offset +  		r->r_offset; diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index 0388cfccac8..2031119080d 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h @@ -145,33 +145,22 @@ static inline int is_shndx_special(unsigned int i)  	return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE;  } -/* shndx is in [0..SHN_LORESERVE) U (SHN_HIRESERVE, 0xfffffff], thus: - * shndx == 0               <=> sechdrs[0] - * ...... - * shndx == SHN_LORESERVE-1 <=> sechdrs[SHN_LORESERVE-1] - * shndx == SHN_HIRESERVE+1 <=> sechdrs[SHN_LORESERVE] - * shndx == SHN_HIRESERVE+2 <=> sechdrs[SHN_LORESERVE+1] - * ...... - * fyi: sym->st_shndx is uint16, SHN_LORESERVE = ff00, SHN_HIRESERVE = ffff, - * so basically we map  0000..feff -> 0000..feff - *                      ff00..ffff -> (you are a bad boy, dont do it) - *                     10000..xxxx -> ff00..(xxxx-0x100) +/* + * Move reserved section indices SHN_LORESERVE..SHN_HIRESERVE out of + * the way to -256..-1, to avoid conflicting with real section + * indices.   */ -static inline unsigned int shndx2secindex(unsigned int i) -{ -	if (i <= SHN_HIRESERVE) -		return i; -	return i - (SHN_HIRESERVE + 1 - SHN_LORESERVE); -} +#define SPECIAL(i) ((i) - (SHN_HIRESERVE + 1))  /* Accessor for sym->st_shndx, hides ugliness of "64k sections" */  static inline unsigned int get_secindex(const struct elf_info *info,  					const Elf_Sym *sym)  { +	if (is_shndx_special(sym->st_shndx)) +		return SPECIAL(sym->st_shndx);  	if (sym->st_shndx != SHN_XINDEX)  		return sym->st_shndx; -	return shndx2secindex(info->symtab_shndx_start[sym - -						       info->symtab_start]); +	return info->symtab_shndx_start[sym - info->symtab_start];  }  /* file2alias.c */ | 
