aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-01-14 15:32:16 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-01-14 15:32:16 -0500
commit0a80939b3e6af4b0dc93bf88ec02fd7e90a16f1b (patch)
treea112335f2b2b2a51e90531c6c67e8a3b54dcf0ef /scripts
parent0b48d42235caf627121f440b57d376f48a9af8b6 (diff)
parent72db395ffadb1d33233fd123c2bf87ba0198c6c1 (diff)
Merge tag 'for-linus' of git://github.com/rustyrussell/linux
Autogenerated GPG tag for Rusty D1ADB8F1: 15EE 8D6C AB0E 7F0C F999 BFCB D920 0E6C D1AD B8F1 * tag 'for-linus' of git://github.com/rustyrussell/linux: module_param: check that bool parameters really are bool. intelfbdrv.c: bailearly is an int module_param paride/pcd: fix bool verbose module parameter. module_param: make bool parameters really bool (drivers & misc) module_param: make bool parameters really bool (arch) module_param: make bool parameters really bool (core code) kernel/async: remove redundant declaration. printk: fix unnecessary module_param_name. lirc_parallel: fix module parameter description. module_param: avoid bool abuse, add bint for special cases. module_param: check type correctness for module_param_array modpost: use linker section to generate table. modpost: use a table rather than a giant if/else statement. modules: sysfs - export: taint, coresize, initsize kernel/params: replace DEBUGP with pr_debug module: replace DEBUGP with pr_debug module: struct module_ref should contains long fields module: Fix performance regression on modules with large symbol tables module: Add comments describing how the "strmap" logic works Fix up conflicts in scripts/mod/file2alias.c due to the new linker- generated table approach to adding __mod_*_device_table entries. The ARM sa11x0 mcp bus needed to be converted to that too.
Diffstat (limited to 'scripts')
-rw-r--r--scripts/mod/file2alias.c217
1 files changed, 92 insertions, 125 deletions
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 296f17ff751b..c0e14b3f2306 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -28,6 +28,7 @@ typedef Elf64_Addr kernel_ulong_t;
28#endif 28#endif
29 29
30#include <ctype.h> 30#include <ctype.h>
31#include <stdbool.h>
31 32
32typedef uint32_t __u32; 33typedef uint32_t __u32;
33typedef uint16_t __u16; 34typedef uint16_t __u16;
@@ -38,6 +39,35 @@ typedef unsigned char __u8;
38 * we handle those differences explicitly below */ 39 * we handle those differences explicitly below */
39#include "../../include/linux/mod_devicetable.h" 40#include "../../include/linux/mod_devicetable.h"
40 41
42/* This array collects all instances that use the generic do_table */
43struct devtable {
44 const char *device_id; /* name of table, __mod_<name>_device_table. */
45 unsigned long id_size;
46 void *function;
47};
48
49/* We construct a table of pointers in an ELF section (pointers generally
50 * go unpadded by gcc). ld creates boundary syms for us. */
51extern struct devtable *__start___devtable[], *__stop___devtable[];
52#define ___cat(a,b) a ## b
53#define __cat(a,b) ___cat(a,b)
54
55#if __GNUC__ == 3 && __GNUC_MINOR__ < 3
56# define __used __attribute__((__unused__))
57#else
58# define __used __attribute__((__used__))
59#endif
60
61/* Add a table entry. We test function type matches while we're here. */
62#define ADD_TO_DEVTABLE(device_id, type, function) \
63 static struct devtable __cat(devtable,__LINE__) = { \
64 device_id + 0*sizeof((function)((const char *)NULL, \
65 (type *)NULL, \
66 (char *)NULL)), \
67 sizeof(type), (function) }; \
68 static struct devtable *__attribute__((section("__devtable"))) \
69 __used __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__)
70
41#define ADD(str, sep, cond, field) \ 71#define ADD(str, sep, cond, field) \
42do { \ 72do { \
43 strcat(str, sep); \ 73 strcat(str, sep); \
@@ -289,6 +319,7 @@ static int do_hid_entry(const char *filename,
289 319
290 return 1; 320 return 1;
291} 321}
322ADD_TO_DEVTABLE("hid", struct hid_device_id, do_hid_entry);
292 323
293/* Looks like: ieee1394:venNmoNspNverN */ 324/* Looks like: ieee1394:venNmoNspNverN */
294static int do_ieee1394_entry(const char *filename, 325static int do_ieee1394_entry(const char *filename,
@@ -313,6 +344,7 @@ static int do_ieee1394_entry(const char *filename,
313 add_wildcard(alias); 344 add_wildcard(alias);
314 return 1; 345 return 1;
315} 346}
347ADD_TO_DEVTABLE("ieee1394", struct ieee1394_device_id, do_ieee1394_entry);
316 348
317/* Looks like: pci:vNdNsvNsdNbcNscNiN. */ 349/* Looks like: pci:vNdNsvNsdNbcNscNiN. */
318static int do_pci_entry(const char *filename, 350static int do_pci_entry(const char *filename,
@@ -356,6 +388,7 @@ static int do_pci_entry(const char *filename,
356 add_wildcard(alias); 388 add_wildcard(alias);
357 return 1; 389 return 1;
358} 390}
391ADD_TO_DEVTABLE("pci", struct pci_device_id, do_pci_entry);
359 392
360/* looks like: "ccw:tNmNdtNdmN" */ 393/* looks like: "ccw:tNmNdtNdmN" */
361static int do_ccw_entry(const char *filename, 394static int do_ccw_entry(const char *filename,
@@ -379,6 +412,7 @@ static int do_ccw_entry(const char *filename,
379 add_wildcard(alias); 412 add_wildcard(alias);
380 return 1; 413 return 1;
381} 414}
415ADD_TO_DEVTABLE("ccw", struct ccw_device_id, do_ccw_entry);
382 416
383/* looks like: "ap:tN" */ 417/* looks like: "ap:tN" */
384static int do_ap_entry(const char *filename, 418static int do_ap_entry(const char *filename,
@@ -387,6 +421,7 @@ static int do_ap_entry(const char *filename,
387 sprintf(alias, "ap:t%02X*", id->dev_type); 421 sprintf(alias, "ap:t%02X*", id->dev_type);
388 return 1; 422 return 1;
389} 423}
424ADD_TO_DEVTABLE("ap", struct ap_device_id, do_ap_entry);
390 425
391/* looks like: "css:tN" */ 426/* looks like: "css:tN" */
392static int do_css_entry(const char *filename, 427static int do_css_entry(const char *filename,
@@ -395,6 +430,7 @@ static int do_css_entry(const char *filename,
395 sprintf(alias, "css:t%01X", id->type); 430 sprintf(alias, "css:t%01X", id->type);
396 return 1; 431 return 1;
397} 432}
433ADD_TO_DEVTABLE("css", struct css_device_id, do_css_entry);
398 434
399/* Looks like: "serio:tyNprNidNexN" */ 435/* Looks like: "serio:tyNprNidNexN" */
400static int do_serio_entry(const char *filename, 436static int do_serio_entry(const char *filename,
@@ -414,6 +450,7 @@ static int do_serio_entry(const char *filename,
414 add_wildcard(alias); 450 add_wildcard(alias);
415 return 1; 451 return 1;
416} 452}
453ADD_TO_DEVTABLE("serio", struct serio_device_id, do_serio_entry);
417 454
418/* looks like: "acpi:ACPI0003 or acpi:PNP0C0B" or "acpi:LNXVIDEO" */ 455/* looks like: "acpi:ACPI0003 or acpi:PNP0C0B" or "acpi:LNXVIDEO" */
419static int do_acpi_entry(const char *filename, 456static int do_acpi_entry(const char *filename,
@@ -422,6 +459,7 @@ static int do_acpi_entry(const char *filename,
422 sprintf(alias, "acpi*:%s:*", id->id); 459 sprintf(alias, "acpi*:%s:*", id->id);
423 return 1; 460 return 1;
424} 461}
462ADD_TO_DEVTABLE("acpi", struct acpi_device_id, do_acpi_entry);
425 463
426/* looks like: "pnp:dD" */ 464/* looks like: "pnp:dD" */
427static void do_pnp_device_entry(void *symval, unsigned long size, 465static void do_pnp_device_entry(void *symval, unsigned long size,
@@ -544,8 +582,7 @@ static int do_pcmcia_entry(const char *filename,
544 add_wildcard(alias); 582 add_wildcard(alias);
545 return 1; 583 return 1;
546} 584}
547 585ADD_TO_DEVTABLE("pcmcia", struct pcmcia_device_id, do_pcmcia_entry);
548
549 586
550static int do_of_entry (const char *filename, struct of_device_id *of, char *alias) 587static int do_of_entry (const char *filename, struct of_device_id *of, char *alias)
551{ 588{
@@ -568,6 +605,7 @@ static int do_of_entry (const char *filename, struct of_device_id *of, char *ali
568 add_wildcard(alias); 605 add_wildcard(alias);
569 return 1; 606 return 1;
570} 607}
608ADD_TO_DEVTABLE("of", struct of_device_id, do_of_entry);
571 609
572static int do_vio_entry(const char *filename, struct vio_device_id *vio, 610static int do_vio_entry(const char *filename, struct vio_device_id *vio,
573 char *alias) 611 char *alias)
@@ -585,6 +623,7 @@ static int do_vio_entry(const char *filename, struct vio_device_id *vio,
585 add_wildcard(alias); 623 add_wildcard(alias);
586 return 1; 624 return 1;
587} 625}
626ADD_TO_DEVTABLE("vio", struct vio_device_id, do_vio_entry);
588 627
589#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 628#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
590 629
@@ -640,6 +679,7 @@ static int do_input_entry(const char *filename, struct input_device_id *id,
640 do_input(alias, id->swbit, 0, INPUT_DEVICE_ID_SW_MAX); 679 do_input(alias, id->swbit, 0, INPUT_DEVICE_ID_SW_MAX);
641 return 1; 680 return 1;
642} 681}
682ADD_TO_DEVTABLE("input", struct input_device_id, do_input_entry);
643 683
644static int do_eisa_entry(const char *filename, struct eisa_device_id *eisa, 684static int do_eisa_entry(const char *filename, struct eisa_device_id *eisa,
645 char *alias) 685 char *alias)
@@ -650,6 +690,7 @@ static int do_eisa_entry(const char *filename, struct eisa_device_id *eisa,
650 strcat(alias, "*"); 690 strcat(alias, "*");
651 return 1; 691 return 1;
652} 692}
693ADD_TO_DEVTABLE("eisa", struct eisa_device_id, do_eisa_entry);
653 694
654/* Looks like: parisc:tNhvNrevNsvN */ 695/* Looks like: parisc:tNhvNrevNsvN */
655static int do_parisc_entry(const char *filename, struct parisc_device_id *id, 696static int do_parisc_entry(const char *filename, struct parisc_device_id *id,
@@ -669,6 +710,7 @@ static int do_parisc_entry(const char *filename, struct parisc_device_id *id,
669 add_wildcard(alias); 710 add_wildcard(alias);
670 return 1; 711 return 1;
671} 712}
713ADD_TO_DEVTABLE("parisc", struct parisc_device_id, do_parisc_entry);
672 714
673/* Looks like: sdio:cNvNdN. */ 715/* Looks like: sdio:cNvNdN. */
674static int do_sdio_entry(const char *filename, 716static int do_sdio_entry(const char *filename,
@@ -685,6 +727,7 @@ static int do_sdio_entry(const char *filename,
685 add_wildcard(alias); 727 add_wildcard(alias);
686 return 1; 728 return 1;
687}