aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/mod
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /scripts/mod
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'scripts/mod')
-rw-r--r--scripts/mod/file2alias.c22
-rw-r--r--scripts/mod/modpost.c49
-rw-r--r--scripts/mod/modpost.h27
-rw-r--r--scripts/mod/sumversion.c19
4 files changed, 75 insertions, 42 deletions
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 88f3f07205f8..e26e2fb462d4 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -702,6 +702,24 @@ static int do_ssb_entry(const char *filename,
702 return 1; 702 return 1;
703} 703}
704 704
705/* Looks like: bcma:mNidNrevNclN. */
706static int do_bcma_entry(const char *filename,
707 struct bcma_device_id *id, char *alias)
708{
709 id->manuf = TO_NATIVE(id->manuf);
710 id->id = TO_NATIVE(id->id);
711 id->rev = TO_NATIVE(id->rev);
712 id->class = TO_NATIVE(id->class);
713
714 strcpy(alias, "bcma:");
715 ADD(alias, "m", id->manuf != BCMA_ANY_MANUF, id->manuf);
716 ADD(alias, "id", id->id != BCMA_ANY_ID, id->id);
717 ADD(alias, "rev", id->rev != BCMA_ANY_REV, id->rev);
718 ADD(alias, "cl", id->class != BCMA_ANY_CLASS, id->class);
719 add_wildcard(alias);
720 return 1;
721}
722
705/* Looks like: virtio:dNvN */ 723/* Looks like: virtio:dNvN */
706static int do_virtio_entry(const char *filename, struct virtio_device_id *id, 724static int do_virtio_entry(const char *filename, struct virtio_device_id *id,
707 char *alias) 725 char *alias)
@@ -968,6 +986,10 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
968 do_table(symval, sym->st_size, 986 do_table(symval, sym->st_size,
969 sizeof(struct ssb_device_id), "ssb", 987 sizeof(struct ssb_device_id), "ssb",
970 do_ssb_entry, mod); 988 do_ssb_entry, mod);
989 else if (sym_is(symname, "__mod_bcma_device_table"))
990 do_table(symval, sym->st_size,
991 sizeof(struct bcma_device_id), "bcma",
992 do_bcma_entry, mod);
971 else if (sym_is(symname, "__mod_virtio_device_table")) 993 else if (sym_is(symname, "__mod_virtio_device_table"))
972 do_table(symval, sym->st_size, 994 do_table(symval, sym->st_size,
973 sizeof(struct virtio_device_id), "virtio", 995 sizeof(struct virtio_device_id), "virtio",
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 1ec7158b6c1f..413c53693e62 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)
420 return 0; 420 return 0;
421 } 421 }
422 422
423 if (hdr->e_shnum == 0) { 423 if (hdr->e_shnum == SHN_UNDEF) {
424 /* 424 /*
425 * There are more than 64k sections, 425 * There are more than 64k sections,
426 * read count from .sh_size. 426 * read count from .sh_size.
427 * note: it doesn't need shndx2secindex()
428 */ 427 */
429 info->num_sections = TO_NATIVE(sechdrs[0].sh_size); 428 info->num_sections = TO_NATIVE(sechdrs[0].sh_size);
430 } 429 }
@@ -432,8 +431,7 @@ static int parse_elf(struct elf_info *info, const char *filename)
432 info->num_sections = hdr->e_shnum; 431 info->num_sections = hdr->e_shnum;
433 } 432 }
434 if (hdr->e_shstrndx == SHN_XINDEX) { 433 if (hdr->e_shstrndx == SHN_XINDEX) {
435 info->secindex_strings = 434 info->secindex_strings = TO_NATIVE(sechdrs[0].sh_link);
436 shndx2secindex(TO_NATIVE(sechdrs[0].sh_link));
437 } 435 }
438 else { 436 else {
439 info->secindex_strings = hdr->e_shstrndx; 437 info->secindex_strings = hdr->e_shstrndx;
@@ -489,7 +487,7 @@ static int parse_elf(struct elf_info *info, const char *filename)
489 sechdrs[i].sh_offset; 487 sechdrs[i].sh_offset;
490 info->symtab_stop = (void *)hdr + 488 info->symtab_stop = (void *)hdr +
491 sechdrs[i].sh_offset + sechdrs[i].sh_size; 489 sechdrs[i].sh_offset + sechdrs[i].sh_size;
492 sh_link_idx = shndx2secindex(sechdrs[i].sh_link); 490 sh_link_idx = sechdrs[i].sh_link;
493 info->strtab = (void *)hdr + 491 info->strtab = (void *)hdr +
494 sechdrs[sh_link_idx].sh_offset; 492 sechdrs[sh_link_idx].sh_offset;
495 } 493 }
@@ -516,11 +514,9 @@ static int parse_elf(struct elf_info *info, const char *filename)
516 514
517 if (symtab_shndx_idx != ~0U) { 515 if (symtab_shndx_idx != ~0U) {
518 Elf32_Word *p; 516 Elf32_Word *p;
519 if (symtab_idx != 517 if (symtab_idx != sechdrs[symtab_shndx_idx].sh_link)
520 shndx2secindex(sechdrs[symtab_shndx_idx].sh_link))
521 fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n", 518 fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
522 filename, 519 filename, sechdrs[symtab_shndx_idx].sh_link,
523 shndx2secindex(sechdrs[symtab_shndx_idx].sh_link),
524 symtab_idx); 520 symtab_idx);
525 /* Fix endianness */ 521 /* Fix endianness */
526 for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop; 522 for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
@@ -790,6 +786,7 @@ static const char *section_white_list[] =
790{ 786{
791 ".comment*", 787 ".comment*",
792 ".debug*", 788 ".debug*",
789 ".zdebug*", /* Compressed debug sections. */
793 ".GCC-command-line", /* mn10300 */ 790 ".GCC-command-line", /* mn10300 */
794 ".mdebug*", /* alpha, score, mips etc. */ 791 ".mdebug*", /* alpha, score, mips etc. */
795 ".pdr", /* alpha, score, mips etc. */ 792 ".pdr", /* alpha, score, mips etc. */
@@ -1208,6 +1205,9 @@ static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
1208 * .cpuinit.data => __cpudata 1205 * .cpuinit.data => __cpudata
1209 * .memexitconst => __memconst 1206 * .memexitconst => __memconst
1210 * etc. 1207 * etc.
1208 *
1209 * The memory of returned value has been allocated on a heap. The user of this
1210 * method should free it after usage.
1211*/ 1211*/
1212static char *sec2annotation(const char *s) 1212static char *sec2annotation(const char *s)
1213{ 1213{
@@ -1230,7 +1230,7 @@ static char *sec2annotation(const char *s)
1230 strcat(p, "data "); 1230 strcat(p, "data ");
1231 else 1231 else
1232 strcat(p, " "); 1232 strcat(p, " ");
1233 return r; /* we leak her but we do not care */ 1233 return r;
1234 } else { 1234 } else {
1235 return strdup(""); 1235 return strdup("");
1236 } 1236 }
@@ -1244,6 +1244,19 @@ static int is_function(Elf_Sym *sym)
1244 return -1; 1244 return -1;
1245} 1245}
1246 1246
1247static void print_section_list(const char * const list[20])
1248{
1249 const char *const *s = list;
1250
1251 while (*s) {
1252 fprintf(stderr, "%s", *s);
1253 s++;
1254 if (*s)
1255 fprintf(stderr, ", ");
1256 }
1257 fprintf(stderr, "\n");
1258}
1259
1247/* 1260/*
1248 * Print a warning about a section mismatch. 1261 * Print a warning about a section mismatch.
1249 * Try to find symbols near it so user can find it. 1262 * Try to find symbols near it so user can find it.
@@ -1300,7 +1313,6 @@ static void report_sec_mismatch(const char *modname,
1300 break; 1313 break;
1301 case DATA_TO_ANY_INIT: { 1314 case DATA_TO_ANY_INIT: {
1302 prl_to = sec2annotation(tosec); 1315 prl_to = sec2annotation(tosec);
1303 const char *const *s = mismatch->symbol_white_list;
1304 fprintf(stderr, 1316 fprintf(stderr,
1305 "The variable %s references\n" 1317 "The variable %s references\n"
1306 "the %s %s%s%s\n" 1318 "the %s %s%s%s\n"
@@ -1308,9 +1320,7 @@ static void report_sec_mismatch(const char *modname,
1308 "variable with __init* or __refdata (see linux/init.h) " 1320 "variable with __init* or __refdata (see linux/init.h) "
1309 "or name the variable:\n", 1321 "or name the variable:\n",
1310 fromsym, to, prl_to, tosym, to_p); 1322 fromsym, to, prl_to, tosym, to_p);
1311 while (*s) 1323 print_section_list(mismatch->symbol_white_list);
1312 fprintf(stderr, "%s, ", *s++);
1313 fprintf(stderr, "\n");
1314 free(prl_to); 1324 free(prl_to);
1315 break; 1325 break;
1316 } 1326 }
@@ -1325,7 +1335,6 @@ static void report_sec_mismatch(const char *modname,
1325 break; 1335 break;
1326 case DATA_TO_ANY_EXIT: { 1336 case DATA_TO_ANY_EXIT: {
1327 prl_to = sec2annotation(tosec); 1337 prl_to = sec2annotation(tosec);
1328 const char *const *s = mismatch->symbol_white_list;
1329 fprintf(stderr, 1338 fprintf(stderr,
1330 "The variable %s references\n" 1339 "The variable %s references\n"
1331 "the %s %s%s%s\n" 1340 "the %s %s%s%s\n"
@@ -1333,9 +1342,7 @@ static void report_sec_mismatch(const char *modname,
1333 "variable with __exit* (see linux/init.h) or " 1342 "variable with __exit* (see linux/init.h) or "
1334 "name the variable:\n", 1343 "name the variable:\n",
1335 fromsym, to, prl_to, tosym, to_p); 1344 fromsym, to, prl_to, tosym, to_p);
1336 while (*s) 1345 print_section_list(mismatch->symbol_white_list);
1337 fprintf(stderr, "%s, ", *s++);
1338 fprintf(stderr, "\n");
1339 free(prl_to); 1346 free(prl_to);
1340 break; 1347 break;
1341 } 1348 }
@@ -1435,10 +1442,10 @@ static unsigned int *reloc_location(struct elf_info *elf,
1435 Elf_Shdr *sechdr, Elf_Rela *r) 1442 Elf_Shdr *sechdr, Elf_Rela *r)
1436{ 1443{
1437 Elf_Shdr *sechdrs = elf->sechdrs; 1444 Elf_Shdr *sechdrs = elf->sechdrs;
1438 int section = shndx2secindex(sechdr->sh_info); 1445 int section = sechdr->sh_info;
1439 1446
1440 return (void *)elf->hdr + sechdrs[section].sh_offset + 1447 return (void *)elf->hdr + sechdrs[section].sh_offset +
1441 r->r_offset - sechdrs[section].sh_addr; 1448 r->r_offset;
1442} 1449}
1443 1450
1444static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) 1451static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
@@ -1611,7 +1618,7 @@ static void section_rel(const char *modname, struct elf_info *elf,
1611 * A module includes a number of sections that are discarded 1618 * A module includes a number of sections that are discarded
1612 * either when loaded or when used as built-in. 1619 * either when loaded or when used as built-in.
1613 * For loaded modules all functions marked __init and all data 1620 * For loaded modules all functions marked __init and all data
1614 * marked __initdata will be discarded when the module has been intialized. 1621 * marked __initdata will be discarded when the module has been initialized.
1615 * Likewise for modules used built-in the sections marked __exit 1622 * Likewise for modules used built-in the sections marked __exit
1616 * are discarded because __exit marked function are supposed to be called 1623 * are discarded because __exit marked function are supposed to be called
1617 * only when a module is unloaded which never happens for built-in modules. 1624 * only when a module is unloaded which never happens for built-in modules.
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h
index 0388cfccac8d..2031119080dc 100644
--- a/scripts/mod/modpost.h
+++ b/scripts/mod/modpost.h
@@ -145,33 +145,22 @@ static inline int is_shndx_special(unsigned int i)
145 return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE; 145 return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE;
146} 146}
147 147
148/* shndx is in [0..SHN_LORESERVE) U (SHN_HIRESERVE, 0xfffffff], thus: 148/*
149 * shndx == 0 <=> sechdrs[0] 149 * Move reserved section indices SHN_LORESERVE..SHN_HIRESERVE out of
150 * ...... 150 * the way to -256..-1, to avoid conflicting with real section
151 * shndx == SHN_LORESERVE-1 <=> sechdrs[SHN_LORESERVE-1] 151 * indices.
152 * shndx == SHN_HIRESERVE+1 <=> sechdrs[SHN_LORESERVE]
153 * shndx == SHN_HIRESERVE+2 <=> sechdrs[SHN_LORESERVE+1]
154 * ......
155 * fyi: sym->st_shndx is uint16, SHN_LORESERVE = ff00, SHN_HIRESERVE = ffff,
156 * so basically we map 0000..feff -> 0000..feff
157 * ff00..ffff -> (you are a bad boy, dont do it)
158 * 10000..xxxx -> ff00..(xxxx-0x100)
159 */ 152 */
160static inline unsigned int shndx2secindex(unsigned int i) 153#define SPECIAL(i) ((i) - (SHN_HIRESERVE + 1))
161{
162 if (i <= SHN_HIRESERVE)
163 return i;
164 return i - (SHN_HIRESERVE + 1 - SHN_LORESERVE);
165}
166 154
167/* Accessor for sym->st_shndx, hides ugliness of "64k sections" */ 155/* Accessor for sym->st_shndx, hides ugliness of "64k sections" */
168static inline unsigned int get_secindex(const struct elf_info *info, 156static inline unsigned int get_secindex(const struct elf_info *info,
169 const Elf_Sym *sym) 157 const Elf_Sym *sym)
170{ 158{
159 if (is_shndx_special(sym->st_shndx))
160 return SPECIAL(sym->st_shndx);
171 if (sym->st_shndx != SHN_XINDEX) 161 if (sym->st_shndx != SHN_XINDEX)
172 return sym->st_shndx; 162 return sym->st_shndx;
173 return shndx2secindex(info->symtab_shndx_start[sym - 163 return info->symtab_shndx_start[sym - info->symtab_start];
174 info->symtab_start]);
175} 164}
176 165
177/* file2alias.c */ 166/* file2alias.c */
diff --git a/scripts/mod/sumversion.c b/scripts/mod/sumversion.c
index ecf9c7dc1825..9dfcd6d988da 100644
--- a/scripts/mod/sumversion.c
+++ b/scripts/mod/sumversion.c
@@ -300,8 +300,8 @@ static int is_static_library(const char *objfile)
300 return 0; 300 return 0;
301} 301}
302 302
303/* We have dir/file.o. Open dir/.file.o.cmd, look for deps_ line to 303/* We have dir/file.o. Open dir/.file.o.cmd, look for source_ and deps_ line
304 * figure out source file. */ 304 * to figure out source files. */
305static int parse_source_files(const char *objfile, struct md4_ctx *md) 305static int parse_source_files(const char *objfile, struct md4_ctx *md)
306{ 306{
307 char *cmd, *file, *line, *dir; 307 char *cmd, *file, *line, *dir;
@@ -340,6 +340,21 @@ static int parse_source_files(const char *objfile, struct md4_ctx *md)
340 */ 340 */
341 while ((line = get_next_line(&pos, file, flen)) != NULL) { 341 while ((line = get_next_line(&pos, file, flen)) != NULL) {
342 char* p = line; 342 char* p = line;
343
344 if (strncmp(line, "source_", sizeof("source_")-1) == 0) {
345 p = strrchr(line, ' ');
346 if (!p) {
347 warn("malformed line: %s\n", line);
348 goto out_file;
349 }
350 p++;
351 if (!parse_file(p, md)) {
352 warn("could not open %s: %s\n",
353 p, strerror(errno));
354 goto out_file;
355 }
356 continue;
357 }
343 if (strncmp(line, "deps_", sizeof("deps_")-1) == 0) { 358 if (strncmp(line, "deps_", sizeof("deps_")-1) == 0) {
344 check_files = 1; 359 check_files = 1;
345 continue; 360 continue;