diff options
| author | Masahiro Yamada <yamada.masahiro@socionext.com> | 2018-11-21 23:28:41 -0500 |
|---|---|---|
| committer | Masahiro Yamada <yamada.masahiro@socionext.com> | 2018-12-01 08:21:57 -0500 |
| commit | ec91e78d378cc5d4b43805a1227d8e04e5dfa17d (patch) | |
| tree | 27e9c05a4e699d3dbcd224984005411f64d43b30 /scripts/mod | |
| parent | e07db28eea38ed4e332b3a89f3995c86b713cb5b (diff) | |
modpost: file2alias: go back to simple devtable lookup
Commit e49ce14150c6 ("modpost: use linker section to generate table.")
was not so cool as we had expected first; it ended up with ugly section
hacks when commit dd2a3acaecd7 ("mod/file2alias: make modpost compile
on darwin again") came in.
Given a certain degree of unknowledge about the link stage of host
programs, I really want to see simple, stupid table lookup so that
this works in the same way regardless of the underlying executable
format.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Acked-by: Mathieu Malaterre <malat@debian.org>
Diffstat (limited to 'scripts/mod')
| -rw-r--r-- | scripts/mod/file2alias.c | 144 |
1 files changed, 49 insertions, 95 deletions
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 28a61665bb9c..7e4aededfd37 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
| @@ -50,46 +50,6 @@ struct devtable { | |||
| 50 | void *function; | 50 | void *function; |
| 51 | }; | 51 | }; |
| 52 | 52 | ||
| 53 | #define ___cat(a,b) a ## b | ||
| 54 | #define __cat(a,b) ___cat(a,b) | ||
| 55 | |||
| 56 | /* we need some special handling for this host tool running eventually on | ||
| 57 | * Darwin. The Mach-O section handling is a bit different than ELF section | ||
| 58 | * handling. The differnces in detail are: | ||
| 59 | * a) we have segments which have sections | ||
| 60 | * b) we need a API call to get the respective section symbols */ | ||
| 61 | #if defined(__MACH__) | ||
| 62 | #include <mach-o/getsect.h> | ||
| 63 | |||
| 64 | #define INIT_SECTION(name) do { \ | ||
| 65 | unsigned long name ## _len; \ | ||
| 66 | char *__cat(pstart_,name) = getsectdata("__TEXT", \ | ||
| 67 | #name, &__cat(name,_len)); \ | ||
| 68 | char *__cat(pstop_,name) = __cat(pstart_,name) + \ | ||
| 69 | __cat(name, _len); \ | ||
| 70 | __cat(__start_,name) = (void *)__cat(pstart_,name); \ | ||
| 71 | __cat(__stop_,name) = (void *)__cat(pstop_,name); \ | ||
| 72 | } while (0) | ||
| 73 | #define SECTION(name) __attribute__((section("__TEXT, " #name))) | ||
| 74 | |||
| 75 | struct devtable **__start___devtable, **__stop___devtable; | ||
| 76 | #else | ||
| 77 | #define INIT_SECTION(name) /* no-op for ELF */ | ||
| 78 | #define SECTION(name) __attribute__((section(#name))) | ||
| 79 | |||
| 80 | /* We construct a table of pointers in an ELF section (pointers generally | ||
| 81 | * go unpadded by gcc). ld creates boundary syms for us. */ | ||
| 82 | extern struct devtable *__start___devtable[], *__stop___devtable[]; | ||
| 83 | #endif /* __MACH__ */ | ||
| 84 | |||
| 85 | #if !defined(__used) | ||
| 86 | # if __GNUC__ == 3 && __GNUC_MINOR__ < 3 | ||
| 87 | # define __used __attribute__((__unused__)) | ||
| 88 | # else | ||
| 89 | # define __used __attribute__((__used__)) | ||
| 90 | # endif | ||
| 91 | #endif | ||
| 92 | |||
| 93 | /* Define a variable f that holds the value of field f of struct devid | 53 | /* Define a variable f that holds the value of field f of struct devid |
| 94 | * based at address m. | 54 | * based at address m. |
| 95 | */ | 55 | */ |
| @@ -110,16 +70,6 @@ extern struct devtable *__start___devtable[], *__stop___devtable[]; | |||
| 110 | #define DEF_FIELD_ADDR(m, devid, f) \ | 70 | #define DEF_FIELD_ADDR(m, devid, f) \ |
| 111 | DEF_FIELD_ADDR_VAR(m, devid, f, f) | 71 | DEF_FIELD_ADDR_VAR(m, devid, f, f) |
| 112 | 72 | ||
| 113 | /* Add a table entry. We test function type matches while we're here. */ | ||
| 114 | #define ADD_TO_DEVTABLE(device_id, type, function) \ | ||
| 115 | static struct devtable __cat(devtable,__LINE__) = { \ | ||
| 116 | device_id + 0*sizeof((function)((const char *)NULL, \ | ||
| 117 | (void *)NULL, \ | ||
| 118 | (char *)NULL)), \ | ||
| 119 | SIZE_##type, (function) }; \ | ||
| 120 | static struct devtable *SECTION(__devtable) __used \ | ||
| 121 | __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) | ||
| 122 | |||
| 123 | #define ADD(str, sep, cond, field) \ | 73 | #define ADD(str, sep, cond, field) \ |
| 124 | do { \ | 74 | do { \ |
| 125 | strcat(str, sep); \ | 75 | strcat(str, sep); \ |
| @@ -439,7 +389,6 @@ static int do_hid_entry(const char *filename, | |||
| 439 | 389 | ||
| 440 | return 1; | 390 | return 1; |
| 441 | } | 391 | } |
| 442 | ADD_TO_DEVTABLE("hid", hid_device_id, do_hid_entry); | ||
| 443 | 392 | ||
| 444 | /* Looks like: ieee1394:venNmoNspNverN */ | 393 | /* Looks like: ieee1394:venNmoNspNverN */ |
| 445 | static int do_ieee1394_entry(const char *filename, | 394 | static int do_ieee1394_entry(const char *filename, |
| @@ -464,7 +413,6 @@ static int do_ieee1394_entry(const char *filename, | |||
| 464 | add_wildcard(alias); | 413 | add_wildcard(alias); |
| 465 | return 1; | 414 | return 1; |
| 466 | } | 415 | } |
| 467 | ADD_TO_DEVTABLE("ieee1394", ieee1394_device_id, do_ieee1394_entry); | ||
| 468 | 416 | ||
| 469 | /* Looks like: pci:vNdNsvNsdNbcNscNiN. */ | 417 | /* Looks like: pci:vNdNsvNsdNbcNscNiN. */ |
| 470 | static int do_pci_entry(const char *filename, | 418 | static int do_pci_entry(const char *filename, |
| @@ -508,7 +456,6 @@ static int do_pci_entry(const char *filename, | |||
| 508 | add_wildcard(alias); | 456 | add_wildcard(alias); |
| 509 | return 1; | 457 | return 1; |
| 510 | } | 458 | } |
| 511 | ADD_TO_DEVTABLE("pci", pci_device_id, do_pci_entry); | ||
| 512 | 459 | ||
| 513 | /* looks like: "ccw:tNmNdtNdmN" */ | 460 | /* looks like: "ccw:tNmNdtNdmN" */ |
| 514 | static int do_ccw_entry(const char *filename, | 461 | static int do_ccw_entry(const char *filename, |
| @@ -532,7 +479,6 @@ static int do_ccw_entry(const char *filename, | |||
| 532 | add_wildcard(alias); | 479 | add_wildcard(alias); |
| 533 | return 1; | 480 | return 1; |
| 534 | } | 481 | } |
| 535 | ADD_TO_DEVTABLE("ccw", ccw_device_id, do_ccw_entry); | ||
| 536 | 482 | ||
| 537 | /* looks like: "ap:tN" */ | 483 | /* looks like: "ap:tN" */ |
| 538 | static int do_ap_entry(const char *filename, | 484 | static int do_ap_entry(const char *filename, |
| @@ -543,7 +489,6 @@ static int do_ap_entry(const char *filename, | |||
| 543 | sprintf(alias, "ap:t%02X*", dev_type); | 489 | sprintf(alias, "ap:t%02X*", dev_type); |
| 544 | return 1; | 490 | return 1; |
| 545 | } | 491 | } |
| 546 | ADD_TO_DEVTABLE("ap", ap_device_id, do_ap_entry); | ||
| 547 | 492 | ||
| 548 | /* looks like: "css:tN" */ | 493 | /* looks like: "css:tN" */ |
| 549 | static int do_css_entry(const char *filename, | 494 | static int do_css_entry(const char *filename, |
| @@ -554,7 +499,6 @@ static int do_css_entry(const char *filename, | |||
| 554 | sprintf(alias, "css:t%01X", type); | 499 | sprintf(alias, "css:t%01X", type); |
| 555 | return 1; | 500 | return 1; |
| 556 | } | 501 | } |
| 557 | ADD_TO_DEVTABLE("css", css_device_id, do_css_entry); | ||
| 558 | 502 | ||
| 559 | /* Looks like: "serio:tyNprNidNexN" */ | 503 | /* Looks like: "serio:tyNprNidNexN" */ |
| 560 | static int do_serio_entry(const char *filename, | 504 | static int do_serio_entry(const char *filename, |
| @@ -574,7 +518,6 @@ static int do_serio_entry(const char *filename, | |||
| 574 | add_wildcard(alias); | 518 | add_wildcard(alias); |
| 575 | return 1; | 519 | return 1; |
| 576 | } | 520 | } |
| 577 | ADD_TO_DEVTABLE("serio", serio_device_id, do_serio_entry); | ||
| 578 | 521 | ||
| 579 | /* looks like: "acpi:ACPI0003" or "acpi:PNP0C0B" or "acpi:LNXVIDEO" or | 522 | /* looks like: "acpi:ACPI0003" or "acpi:PNP0C0B" or "acpi:LNXVIDEO" or |
| 580 | * "acpi:bbsspp" (bb=base-class, ss=sub-class, pp=prog-if) | 523 | * "acpi:bbsspp" (bb=base-class, ss=sub-class, pp=prog-if) |
| @@ -612,7 +555,6 @@ static int do_acpi_entry(const char *filename, | |||
| 612 | } | 555 | } |
| 613 | return 1; | 556 | return 1; |
| 614 | } | 557 | } |
| 615 | ADD_TO_DEVTABLE("acpi", acpi_device_id, do_acpi_entry); | ||
| 616 | 558 | ||
| 617 | /* looks like: "pnp:dD" */ | 559 | /* looks like: "pnp:dD" */ |
| 618 | static void do_pnp_device_entry(void *symval, unsigned long size, | 560 | static void do_pnp_device_entry(void *symval, unsigned long size, |
| @@ -736,7 +678,6 @@ static int do_pcmcia_entry(const char *filename, | |||
| 736 | add_wildcard(alias); | 678 | add_wildcard(alias); |
| 737 | return 1; | 679 | return 1; |
| 738 | } | 680 | } |
| 739 | ADD_TO_DEVTABLE("pcmcia", pcmcia_device_id, do_pcmcia_entry); | ||
| 740 | 681 | ||
| 741 | static int do_vio_entry(const char *filename, void *symval, | 682 | static int do_vio_entry(const char *filename, void *symval, |
| 742 | char *alias) | 683 | char *alias) |
| @@ -756,7 +697,6 @@ static int do_vio_entry(const char *filename, void *symval, | |||
| 756 | add_wildcard(alias); | 697 | add_wildcard(alias); |
| 757 | return 1; | 698 | return 1; |
| 758 | } | 699 | } |
| 759 | ADD_TO_DEVTABLE("vio", vio_device_id, do_vio_entry); | ||
| 760 | 700 | ||
| 761 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | 701 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
| 762 | 702 | ||
| @@ -829,7 +769,6 @@ static int do_input_entry(const char *filename, void *symval, | |||
| 829 | do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); | 769 | do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX); |
| 830 | return 1; | 770 | return 1; |
| 831 | } | 771 | } |
| 832 | ADD_TO_DEVTABLE("input", input_device_id, do_input_entry); | ||
| 833 | 772 | ||
| 834 | static int do_eisa_entry(const char *filename, void *symval, | 773 | static int do_eisa_entry(const char *filename, void *symval, |
| 835 | char *alias) | 774 | char *alias) |
| @@ -841,7 +780,6 @@ static int do_eisa_entry(const char *filename, void *symval, | |||
| 841 | strcat(alias, "*"); | 780 | strcat(alias, "*"); |
| 842 | return 1; | 781 | return 1; |
| 843 | } | 782 | } |
| 844 | ADD_TO_DEVTABLE("eisa", eisa_device_id, do_eisa_entry); | ||
| 845 | 783 | ||
| 846 | /* Looks like: parisc:tNhvNrevNsvN */ | 784 | /* Looks like: parisc:tNhvNrevNsvN */ |
| 847 | static int do_parisc_entry(const char *filename, void *symval, | 785 | static int do_parisc_entry(const char *filename, void *symval, |
| @@ -861,7 +799,6 @@ static int do_parisc_entry(const char *filename, void *symval, | |||
| 861 | add_wildcard(alias); | 799 | add_wildcard(alias); |
| 862 | return 1; | 800 | return 1; |
| 863 | } | 801 | } |
| 864 | ADD_TO_DEVTABLE("parisc", parisc_device_id, do_parisc_entry); | ||
| 865 | 802 | ||
| 866 | /* Looks like: sdio:cNvNdN. */ | 803 | /* Looks like: sdio:cNvNdN. */ |
| 867 | static int do_sdio_entry(const char *filename, | 804 | static int do_sdio_entry(const char *filename, |
| @@ -878,7 +815,6 @@ static int do_sdio_entry(const char *filename, | |||
| 878 | add_wildcard(alias); | 815 | add_wildcard(alias); |
| 879 | return 1; | 816 | return 1; |
| 880 | } | 817 | } |
| 881 | ADD_TO_DEVTABLE("sdio", sdio_device_id, do_sdio_entry); | ||
| 882 | 818 | ||
| 883 | /* Looks like: ssb:vNidNrevN. */ | 819 | /* Looks like: ssb:vNidNrevN. */ |
| 884 | static int do_ssb_entry(const char *filename, | 820 | static int do_ssb_entry(const char *filename, |
| @@ -895,7 +831,6 @@ static int do_ssb_entry(const char *filename, | |||
| 895 | add_wildcard(alias); | 831 | add_wildcard(alias); |
| 896 | return 1; | 832 | return 1; |
| 897 | } | 833 | } |
| 898 | ADD_TO_DEVTABLE("ssb", ssb_device_id, do_ssb_entry); | ||
| 899 | 834 | ||
| 900 | /* Looks like: bcma:mNidNrevNclN. */ | 835 | /* Looks like: bcma:mNidNrevNclN. */ |
| 901 | static int do_bcma_entry(const char *filename, | 836 | static int do_bcma_entry(const char *filename, |
| @@ -914,7 +849,6 @@ static int do_bcma_entry(const char *filename, | |||
| 914 | add_wildcard(alias); | 849 | add_wildcard(alias); |
| 915 | return 1; | 850 | return 1; |
| 916 | } | 851 | } |
| 917 | ADD_TO_DEVTABLE("bcma", bcma_device_id, do_bcma_entry); | ||
| 918 | 852 | ||
| 919 | /* Looks like: virtio:dNvN */ | 853 | /* Looks like: virtio:dNvN */ |
| 920 | static int do_virtio_entry(const char *filename, void *symval, | 854 | static int do_virtio_entry(const char *filename, void *symval, |
| @@ -930,7 +864,6 @@ static int do_virtio_entry(const char *filename, void *symval, | |||
| 930 | add_wildcard(alias); | 864 | add_wildcard(alias); |
| 931 | return 1; | 865 | return 1; |
| 932 | } | 866 | } |
| 933 | ADD_TO_DEVTABLE("virtio", virtio_device_id, do_virtio_entry); | ||
| 934 | 867 | ||
| 935 | /* | 868 | /* |
| 936 | * Looks like: vmbus:guid | 869 | * Looks like: vmbus:guid |
| @@ -953,7 +886,6 @@ static int do_vmbus_entry(const char *filename, void *symval, | |||
| 953 | 886 | ||
| 954 | return 1; | 887 | return 1; |
| 955 | } | 888 | } |
| 956 | ADD_TO_DEVTABLE("vmbus", hv_vmbus_device_id, do_vmbus_entry); | ||
| 957 | 889 | ||
| 958 | /* Looks like: rpmsg:S */ | 890 | /* Looks like: rpmsg:S */ |
| 959 | static int do_rpmsg_entry(const char *filename, void *symval, | 891 | static int do_rpmsg_entry(const char *filename, void *symval, |
| @@ -964,7 +896,6 @@ static int do_rpmsg_entry(const char *filename, void *symval, | |||
| 964 | 896 | ||
| 965 | return 1; | 897 | return 1; |
| 966 | } | 898 | } |
| 967 | ADD_TO_DEVTABLE("rpmsg", rpmsg_device_id, do_rpmsg_entry); | ||
| 968 | 899 | ||
| 969 | /* Looks like: i2c:S */ | 900 | /* Looks like: i2c:S */ |
| 970 | static int do_i2c_entry(const char *filename, void *symval, | 901 | static int do_i2c_entry(const char *filename, void *symval, |
| @@ -975,7 +906,6 @@ static int do_i2c_entry(const char *filename, void *symval, | |||
| 975 | 906 | ||
| 976 | return 1; | 907 | return 1; |
| 977 | } | 908 | } |
| 978 | ADD_TO_DEVTABLE("i2c", i2c_device_id, do_i2c_entry); | ||
| 979 | 909 | ||
| 980 | /* Looks like: spi:S */ | 910 | /* Looks like: spi:S */ |
| 981 | static int do_spi_entry(const char *filename, void *symval, | 911 | static int do_spi_entry(const char *filename, void *symval, |
| @@ -986,7 +916,6 @@ static int do_spi_entry(const char *filename, void *symval, | |||
| 986 | 916 | ||
| 987 | return 1; | 917 | return 1; |
| 988 | } | 918 | } |
| 989 | ADD_TO_DEVTABLE("spi", spi_device_id, do_spi_entry); | ||
| 990 | 919 | ||
| 991 | static const struct dmifield { | 920 | static const struct dmifield { |
| 992 | const char *prefix; | 921 | const char *prefix; |
| @@ -1041,7 +970,6 @@ static int do_dmi_entry(const char *filename, void *symval, | |||
| 1041 | strcat(alias, ":"); | 970 | strcat(alias, ":"); |
| 1042 | return 1; | 971 | return 1; |
| 1043 | } | 972 | } |
| 1044 | ADD_TO_DEVTABLE("dmi", dmi_system_id, do_dmi_entry); | ||
| 1045 | 973 | ||
| 1046 | static int do_platform_entry(const char *filename, | 974 | static int do_platform_entry(const char *filename, |
| 1047 | void *symval, char *alias) | 975 | void *symval, char *alias) |
| @@ -1050,7 +978,6 @@ static int do_platform_entry(const char *filename, | |||
| 1050 | sprintf(alias, PLATFORM_MODULE_PREFIX "%s", *name); | 978 | sprintf(alias, PLATFORM_MODULE_PREFIX "%s", *name); |
| 1051 | return 1; | 979 | return 1; |
| 1052 | } | 980 | } |
| 1053 | ADD_TO_DEVTABLE("platform", platform_device_id, do_platform_entry); | ||
| 1054 | 981 | ||
| 1055 | static int do_mdio_entry(const char *filename, | 982 | static int do_mdio_entry(const char *filename, |
| 1056 | void *symval, char *alias) | 983 | void *symval, char *alias) |
| @@ -1075,7 +1002,6 @@ static int do_mdio_entry(const char *filename, | |||
| 1075 | 1002 | ||
| 1076 | return 1; | 1003 | return 1; |
| 1077 | } | 1004 | } |
| 1078 | ADD_TO_DEVTABLE("mdio", mdio_device_id, do_mdio_entry); | ||
| 1079 | 1005 | ||
| 1080 | /* Looks like: zorro:iN. */ | 1006 | /* Looks like: zorro:iN. */ |
| 1081 | static int do_zorro_entry(const char *filename, void *symval, | 1007 | static int do_zorro_entry(const char *filename, void *symval, |
| @@ -1086,7 +1012,6 @@ static int do_zorro_entry(const char *filename, void *symval, | |||
| 1086 | ADD(alias, "i", id != ZORRO_WILDCARD, id); | 1012 | ADD(alias, "i", id != ZORRO_WILDCARD, id); |
| 1087 | return 1; | 1013 | return 1; |
| 1088 | } | 1014 | } |
| 1089 | ADD_TO_DEVTABLE("zorro", zorro_device_id, do_zorro_entry); | ||
| 1090 | 1015 | ||
| 1091 | /* looks like: "pnp:dD" */ | 1016 | /* looks like: "pnp:dD" */ |
| 1092 | static int do_isapnp_entry(const char *filename, | 1017 | static int do_isapnp_entry(const char *filename, |
| @@ -1102,7 +1027,6 @@ static int do_isapnp_entry(const char *filename, | |||
| 1102 | (function >> 12) & 0x0f, (function >> 8) & 0x0f); | 1027 | (function >> 12) & 0x0f, (function >> 8) & 0x0f); |
| 1103 | return 1; | 1028 | return 1; |
| 1104 | } | 1029 | } |
| 1105 | ADD_TO_DEVTABLE("isapnp", isapnp_device_id, do_isapnp_entry); | ||
| 1106 | 1030 | ||
| 1107 | /* Looks like: "ipack:fNvNdN". */ | 1031 | /* Looks like: "ipack:fNvNdN". */ |
| 1108 | static int do_ipack_entry(const char *filename, | 1032 | static int do_ipack_entry(const char *filename, |
| @@ -1118,7 +1042,6 @@ static int do_ipack_entry(const char *filename, | |||
| 1118 | add_wildcard(alias); | 1042 | add_wildcard(alias); |
| 1119 | return 1; | 1043 | return 1; |
| 1120 | } | 1044 | } |
| 1121 | ADD_TO_DEVTABLE("ipack", ipack_device_id, do_ipack_entry); | ||
| 1122 | 1045 | ||
| 1123 | /* | 1046 | /* |
| 1124 | * Append a match expression for a single masked hex digit. | 1047 | * Append a match expression for a single masked hex digit. |
| @@ -1189,7 +1112,6 @@ static int do_amba_entry(const char *filename, | |||
| 1189 | 1112 | ||
| 1190 | return 1; | 1113 | return 1; |
| 1191 | } | 1114 | } |
| 1192 | ADD_TO_DEVTABLE("amba", amba_id, do_amba_entry); | ||
| 1193 | 1115 | ||
| 1194 | /* | 1116 | /* |
| 1195 | * looks like: "mipscdmm:tN" | 1117 | * looks like: "mipscdmm:tN" |
| @@ -1205,7 +1127,6 @@ static int do_mips_cdmm_entry(const char *filename, | |||
| 1205 | sprintf(alias, "mipscdmm:t%02X*", type); | 1127 | sprintf(alias, "mipscdmm:t%02X*", type); |
| 1206 | return 1; | 1128 | return 1; |
| 1207 | } | 1129 | } |
| 1208 | ADD_TO_DEVTABLE("mipscdmm", mips_cdmm_device_id, do_mips_cdmm_entry); | ||
| 1209 | 1130 | ||
| 1210 | /* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,* | 1131 | /* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,* |
| 1211 | * All fields are numbers. It would be nicer to use strings for vendor | 1132 | * All fields are numbers. It would be nicer to use strings for vendor |
| @@ -1230,7 +1151,6 @@ static int do_x86cpu_entry(const char *filename, void *symval, | |||
| 1230 | sprintf(alias + strlen(alias), "%04X*", feature); | 1151 | sprintf(alias + strlen(alias), "%04X*", feature); |
| 1231 | return 1; | 1152 | return 1; |
| 1232 | } | 1153 | } |
| 1233 | ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry); | ||
| 1234 | 1154 | ||
| 1235 | /* LOOKS like cpu:type:*:feature:*FEAT* */ | 1155 | /* LOOKS like cpu:type:*:feature:*FEAT* */ |
| 1236 | static int do_cpu_entry(const char *filename, void *symval, char *alias) | 1156 | static int do_cpu_entry(const char *filename, void *symval, char *alias) |
| @@ -1240,7 +1160,6 @@ static int do_cpu_entry(const char *filename, void *symval, char *alias) | |||
| 1240 | sprintf(alias, "cpu:type:*:feature:*%04X*", feature); | 1160 | sprintf(alias, "cpu:type:*:feature:*%04X*", feature); |
| 1241 | return 1; | 1161 | return 1; |
| 1242 | } | 1162 | } |
| 1243 | ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry); | ||
| 1244 | 1163 | ||
| 1245 | /* Looks like: mei:S:uuid:N:* */ | 1164 | /* Looks like: mei:S:uuid:N:* */ |
| 1246 | static int do_mei_entry(const char *filename, void *symval, | 1165 | static int do_mei_entry(const char *filename, void *symval, |
| @@ -1259,7 +1178,6 @@ static int do_mei_entry(const char *filename, void *symval, | |||
| 1259 | 1178 | ||
| 1260 | return 1; | 1179 | return 1; |
| 1261 | } | 1180 | } |
| 1262 | ADD_TO_DEVTABLE("mei", mei_cl_device_id, do_mei_entry); | ||
| 1263 | 1181 | ||
| 1264 | /* Looks like: rapidio:vNdNavNadN */ | 1182 | /* Looks like: rapidio:vNdNavNadN */ |
| 1265 | static int do_rio_entry(const char *filename, | 1183 | static int do_rio_entry(const char *filename, |
| @@ -1279,7 +1197,6 @@ static int do_rio_entry(const char *filename, | |||
| 1279 | add_wildcard(alias); | 1197 | add_wildcard(alias); |
| 1280 | return 1; | 1198 | return 1; |
| 1281 | } | 1199 | } |
| 1282 | ADD_TO_DEVTABLE("rapidio", rio_device_id, do_rio_entry); | ||
| 1283 | 1200 | ||
| 1284 | /* Looks like: ulpi:vNpN */ | 1201 | /* Looks like: ulpi:vNpN */ |
| 1285 | static int do_ulpi_entry(const char *filename, void *symval, | 1202 | static int do_ulpi_entry(const char *filename, void *symval, |
| @@ -1292,7 +1209,6 @@ static int do_ulpi_entry(const char *filename, void *symval, | |||
| 1292 | 1209 | ||
| 1293 | return 1; | 1210 | return 1; |
| 1294 | } | 1211 | } |
| 1295 | ADD_TO_DEVTABLE("ulpi", ulpi_device_id, do_ulpi_entry); | ||
| 1296 | 1212 | ||
| 1297 | /* Looks like: hdaudio:vNrNaN */ | 1213 | /* Looks like: hdaudio:vNrNaN */ |
| 1298 | static int do_hda_entry(const char *filename, void *symval, char *alias) | 1214 | static int do_hda_entry(const char *filename, void *symval, char *alias) |
| @@ -1309,7 +1225,6 @@ static int do_hda_entry(const char *filename, void *symval, char *alias) | |||
| 1309 | add_wildcard(alias); | 1225 | add_wildcard(alias); |
| 1310 | return 1; | 1226 | return 1; |
| 1311 | } | 1227 | } |
| 1312 | ADD_TO_DEVTABLE("hdaudio", hda_device_id, do_hda_entry); | ||
| 1313 | 1228 | ||
| 1314 | /* Looks like: sdw:mNpN */ | 1229 | /* Looks like: sdw:mNpN */ |
| 1315 | static int do_sdw_entry(const char *filename, void *symval, char *alias) | 1230 | static int do_sdw_entry(const char *filename, void *symval, char *alias) |
| @@ -1324,7 +1239,6 @@ static int do_sdw_entry(const char *filename, void *symval, char *alias) | |||
| 1324 | add_wildcard(alias); | 1239 | add_wildcard(alias); |
| 1325 | return 1; | 1240 | return 1; |
| 1326 | } | 1241 | } |
| 1327 | ADD_TO_DEVTABLE("sdw", sdw_device_id, do_sdw_entry); | ||
| 1328 | 1242 | ||
| 1329 | /* Looks like: fsl-mc:vNdN */ | 1243 | /* Looks like: fsl-mc:vNdN */ |
| 1330 | static int do_fsl_mc_entry(const char *filename, void *symval, | 1244 | static int do_fsl_mc_entry(const char *filename, void *symval, |
| @@ -1336,7 +1250,6 @@ static int do_fsl_mc_entry(const char *filename, void *symval, | |||
| 1336 | sprintf(alias, "fsl-mc:v%08Xd%s", vendor, *obj_type); | 1250 | sprintf(alias, "fsl-mc:v%08Xd%s", vendor, *obj_type); |
| 1337 | return 1; | 1251 | return 1; |
| 1338 | } | 1252 | } |
| 1339 | ADD_TO_DEVTABLE("fslmc", fsl_mc_device_id, do_fsl_mc_entry); | ||
| 1340 | 1253 | ||
| 1341 | /* Looks like: tbsvc:kSpNvNrN */ | 1254 | /* Looks like: tbsvc:kSpNvNrN */ |
| 1342 | static int do_tbsvc_entry(const char *filename, void *symval, char *alias) | 1255 | static int do_tbsvc_entry(const char *filename, void *symval, char *alias) |
| @@ -1361,7 +1274,6 @@ static int do_tbsvc_entry(const char *filename, void *symval, char *alias) | |||
| 1361 | add_wildcard(alias); | 1274 | add_wildcard(alias); |
| 1362 | return 1; | 1275 | return 1; |
| 1363 | } | 1276 | } |
| 1364 | ADD_TO_DEVTABLE("tbsvc", tb_service_id, do_tbsvc_entry); | ||
| 1365 | 1277 | ||
| 1366 | /* Looks like: typec:idNmN */ | 1278 | /* Looks like: typec:idNmN */ |
| 1367 | static int do_typec_entry(const char *filename, void *symval, char *alias) | 1279 | static int do_typec_entry(const char *filename, void *symval, char *alias) |
| @@ -1374,7 +1286,6 @@ static int do_typec_entry(const char *filename, void *symval, char *alias) | |||
| 1374 | 1286 | ||
| 1375 | return 1; | 1287 | return 1; |
| 1376 | } | 1288 | } |
| 1377 | ADD_TO_DEVTABLE("typec", typec_device_id, do_typec_entry); | ||
| 1378 | 1289 | ||
| 1379 | /* Does namelen bytes of name exactly match the symbol? */ | 1290 | /* Does namelen bytes of name exactly match the symbol? */ |
| 1380 | static bool sym_is(const char *name, unsigned namelen, const char *symbol) | 1291 | static bool sym_is(const char *name, unsigned namelen, const char *symbol) |
| @@ -1407,6 +1318,48 @@ static void do_table(void *symval, unsigned long size, | |||
| 1407 | } | 1318 | } |
| 1408 | } | 1319 | } |
| 1409 | 1320 | ||
| 1321 | static const struct devtable devtable[] = { | ||
| 1322 | {"hid", SIZE_hid_device_id, do_hid_entry}, | ||
| 1323 | {"ieee1394", SIZE_ieee1394_device_id, do_ieee1394_entry}, | ||
| 1324 | {"pci", SIZE_pci_device_id, do_pci_entry}, | ||
| 1325 | {"ccw", SIZE_ccw_device_id, do_ccw_entry}, | ||
| 1326 | {"ap", SIZE_ap_device_id, do_ap_entry}, | ||
| 1327 | {"css", SIZE_css_device_id, do_css_entry}, | ||
| 1328 | {"serio", SIZE_serio_device_id, do_serio_entry}, | ||
| 1329 | {"acpi", SIZE_acpi_device_id, do_acpi_entry}, | ||
| 1330 | {"pcmcia", SIZE_pcmcia_device_id, do_pcmcia_entry}, | ||
| 1331 | {"vio", SIZE_vio_device_id, do_vio_entry}, | ||
| 1332 | {"input", SIZE_input_device_id, do_input_entry}, | ||
| 1333 | {"eisa", SIZE_eisa_device_id, do_eisa_entry}, | ||
| 1334 | {"parisc", SIZE_parisc_device_id, do_parisc_entry}, | ||
| 1335 | {"sdio", SIZE_sdio_device_id, do_sdio_entry}, | ||
| 1336 | {"ssb", SIZE_ssb_device_id, do_ssb_entry}, | ||
| 1337 | {"bcma", SIZE_bcma_device_id, do_bcma_entry}, | ||
| 1338 | {"virtio", SIZE_virtio_device_id, do_virtio_entry}, | ||
| 1339 | {"vmbus", SIZE_hv_vmbus_device_id, do_vmbus_entry}, | ||
| 1340 | {"rpmsg", SIZE_rpmsg_device_id, do_rpmsg_entry}, | ||
| 1341 | {"i2c", SIZE_i2c_device_id, do_i2c_entry}, | ||
| 1342 | {"spi", SIZE_spi_device_id, do_spi_entry}, | ||
| 1343 | {"dmi", SIZE_dmi_system_id, do_dmi_entry}, | ||
| 1344 | {"platform", SIZE_platform_device_id, do_platform_entry}, | ||
| 1345 | {"mdio", SIZE_mdio_device_id, do_mdio_entry}, | ||
| 1346 | {"zorro", SIZE_zorro_device_id, do_zorro_entry}, | ||
| 1347 | {"isapnp", SIZE_isapnp_device_id, do_isapnp_entry}, | ||
| 1348 | {"ipack", SIZE_ipack_device_id, do_ipack_entry}, | ||
| 1349 | {"amba", SIZE_amba_id, do_amba_entry}, | ||
| 1350 | {"mipscdmm", SIZE_mips_cdmm_device_id, do_mips_cdmm_entry}, | ||
| 1351 | {"x86cpu", SIZE_x86_cpu_id, do_x86cpu_entry}, | ||
| 1352 | {"cpu", SIZE_cpu_feature, do_cpu_entry}, | ||
| 1353 | {"mei", SIZE_mei_cl_device_id, do_mei_entry}, | ||
| 1354 | {"rapidio", SIZE_rio_device_id, do_rio_entry}, | ||
| 1355 | {"ulpi", SIZE_ulpi_device_id, do_ulpi_entry}, | ||
| 1356 | {"hdaudio", SIZE_hda_device_id, do_hda_entry}, | ||
| 1357 | {"sdw", SIZE_sdw_device_id, do_sdw_entry}, | ||
| 1358 | {"fslmc", SIZE_fsl_mc_device_id, do_fsl_mc_entry}, | ||
| 1359 | {"tbsvc", SIZE_tb_service_id, do_tbsvc_entry}, | ||
| 1360 | {"typec", SIZE_typec_device_id, do_typec_entry}, | ||
| 1361 | }; | ||
| 1362 | |||
| 1410 | /* Create MODULE_ALIAS() statements. | 1363 | /* Create MODULE_ALIAS() statements. |
| 1411 | * At this time, we cannot write the actual output C source yet, | 1364 | * At this time, we cannot write the actual output C source yet, |
| 1412 | * so we write into the mod->dev_table_buf buffer. */ | 1365 | * so we write into the mod->dev_table_buf buffer. */ |
| @@ -1460,13 +1413,14 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, | |||
| 1460 | else if (sym_is(name, namelen, "pnp_card")) | 1413 | else if (sym_is(name, namelen, "pnp_card")) |
| 1461 | do_pnp_card_entries(symval, sym->st_size, mod); | 1414 | do_pnp_card_entries(symval, sym->st_size, mod); |
| 1462 | else { | 1415 | else { |
| 1463 | struct devtable **p; | 1416 | int i; |
| 1464 | INIT_SECTION(__devtable); | 1417 | |
| 1418 | for (i = 0; i < ARRAY_SIZE(devtable); i++) { | ||
| 1419 | const struct devtable *p = &devtable[i]; | ||
| 1465 | 1420 | ||
| 1466 | for (p = __start___devtable; p < __stop___devtable; p++) { | 1421 | if (sym_is(name, namelen, p->device_id)) { |
| 1467 | if (sym_is(name, namelen, (*p)->device_id)) { | 1422 | do_table(symval, sym->st_size, p->id_size, |
| 1468 | do_table(symval, sym->st_size, (*p)->id_size, | 1423 | p->device_id, p->function, mod); |
| 1469 | (*p)->device_id, (*p)->function, mod); | ||
| 1470 | break; | 1424 | break; |
| 1471 | } | 1425 | } |
| 1472 | } | 1426 | } |
