Showing the changes to scripts (1 of 1 file). Show all
Unified · Split
| @@ -817,18 +817,15 @@ static const char *data_sections[] = { DATA_SECTIONS, NULL }; · 816 unmodified lines | ||
| 817 | 817 | |
| 818 | 818 | |
| 819 | 819 | /* symbols in .data that may refer to init/exit sections */ |
| 820 | −static const char *symbol_white_list[] = | |
| 821 | −{ | |
| 822 | − "*driver", | |
| 823 | − "*_template", /* scsi uses *_template a lot */ | |
| 824 | − "*_timer", /* arm uses ops structures named _timer a lot */ | |
| 825 | − "*_sht", /* scsi also used *_sht to some extent */ | |
| 826 | − "*_ops", | |
| 827 | − "*_probe", | |
| 828 | − "*_probe_one", | |
| 829 | − "*_console", | |
| 830 | − NULL | |
| 831 | −}; | |
| 820 | +#define DEFAULT_SYMBOL_WHITE_LIST \ | |
| 821 | + "*driver", \ | |
| 822 | + "*_template", /* scsi uses *_template a lot */ \ | |
| 823 | + "*_timer", /* arm uses ops structures named _timer a lot */ \ | |
| 824 | + "*_sht", /* scsi also used *_sht to some extent */ \ | |
| 825 | + "*_ops", \ | |
| 826 | + "*_probe", \ | |
| 827 | + "*_probe_one", \ | |
| 828 | + "*_console" | |
| 832 | 829 | |
| 833 | 830 | static const char *head_sections[] = { ".head.text*", NULL }; |
| 834 | 831 | static const char *linker_symbols[] = |
| @@ -850,6 +847,7 @@ struct sectioncheck { · 15 unmodified lines | ||
| 850 | 847 | const char *fromsec[20]; |
| 851 | 848 | const char *tosec[20]; |
| 852 | 849 | enum mismatch mismatch; |
| 850 | + const char *symbol_white_list[20]; | |
| 853 | 851 | }; |
| 854 | 852 | |
| 855 | 853 | const struct sectioncheck sectioncheck[] = { |
| @@ -860,75 +858,88 @@ const struct sectioncheck sectioncheck[] = { · 4 unmodified lines | ||
| 860 | 858 | .fromsec = { TEXT_SECTIONS, NULL }, |
| 861 | 859 | .tosec = { ALL_INIT_SECTIONS, NULL }, |
| 862 | 860 | .mismatch = TEXT_TO_ANY_INIT, |
| 861 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 863 | 862 | }, |
| 864 | 863 | { |
| 865 | 864 | .fromsec = { DATA_SECTIONS, NULL }, |
| 866 | 865 | .tosec = { ALL_INIT_SECTIONS, NULL }, |
| 867 | 866 | .mismatch = DATA_TO_ANY_INIT, |
| 867 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 868 | 868 | }, |
| 869 | 869 | { |
| 870 | 870 | .fromsec = { TEXT_SECTIONS, NULL }, |
| 871 | 871 | .tosec = { ALL_EXIT_SECTIONS, NULL }, |
| 872 | 872 | .mismatch = TEXT_TO_ANY_EXIT, |
| 873 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 873 | 874 | }, |
| 874 | 875 | { |
| 875 | 876 | .fromsec = { DATA_SECTIONS, NULL }, |
| 876 | 877 | .tosec = { ALL_EXIT_SECTIONS, NULL }, |
| 877 | 878 | .mismatch = DATA_TO_ANY_EXIT, |
| 879 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 878 | 880 | }, |
| 879 | 881 | /* Do not reference init code/data from devinit/cpuinit/meminit code/data */ |
| 880 | 882 | { |
| 881 | 883 | .fromsec = { ALL_XXXINIT_SECTIONS, NULL }, |
| 882 | 884 | .tosec = { INIT_SECTIONS, NULL }, |
| 883 | 885 | .mismatch = XXXINIT_TO_SOME_INIT, |
| 886 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 884 | 887 | }, |
| 885 | 888 | /* Do not reference cpuinit code/data from meminit code/data */ |
| 886 | 889 | { |
| 887 | 890 | .fromsec = { MEM_INIT_SECTIONS, NULL }, |
| 888 | 891 | .tosec = { CPU_INIT_SECTIONS, NULL }, |
| 889 | 892 | .mismatch = XXXINIT_TO_SOME_INIT, |
| 893 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 890 | 894 | }, |
| 891 | 895 | /* Do not reference meminit code/data from cpuinit code/data */ |
| 892 | 896 | { |
| 893 | 897 | .fromsec = { CPU_INIT_SECTIONS, NULL }, |
| 894 | 898 | .tosec = { MEM_INIT_SECTIONS, NULL }, |
| 895 | 899 | .mismatch = XXXINIT_TO_SOME_INIT, |
| 900 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 896 | 901 | }, |
| 897 | 902 | /* Do not reference exit code/data from devexit/cpuexit/memexit code/data */ |
| 898 | 903 | { |
| 899 | 904 | .fromsec = { ALL_XXXEXIT_SECTIONS, NULL }, |
| 900 | 905 | .tosec = { EXIT_SECTIONS, NULL }, |
| 901 | 906 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
| 907 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 902 | 908 | }, |
| 903 | 909 | /* Do not reference cpuexit code/data from memexit code/data */ |
| 904 | 910 | { |
| 905 | 911 | .fromsec = { MEM_EXIT_SECTIONS, NULL }, |
| 906 | 912 | .tosec = { CPU_EXIT_SECTIONS, NULL }, |
| 907 | 913 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
| 914 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 908 | 915 | }, |
| 909 | 916 | /* Do not reference memexit code/data from cpuexit code/data */ |
| 910 | 917 | { |
| 911 | 918 | .fromsec = { CPU_EXIT_SECTIONS, NULL }, |
| 912 | 919 | .tosec = { MEM_EXIT_SECTIONS, NULL }, |
| 913 | 920 | .mismatch = XXXEXIT_TO_SOME_EXIT, |
| 921 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 914 | 922 | }, |
| 915 | 923 | /* Do not use exit code/data from init code */ |
| 916 | 924 | { |
| 917 | 925 | .fromsec = { ALL_INIT_SECTIONS, NULL }, |
| 918 | 926 | .tosec = { ALL_EXIT_SECTIONS, NULL }, |
| 919 | 927 | .mismatch = ANY_INIT_TO_ANY_EXIT, |
| 928 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 920 | 929 | }, |
| 921 | 930 | /* Do not use init code/data from exit code */ |
| 922 | 931 | { |
| 923 | 932 | .fromsec = { ALL_EXIT_SECTIONS, NULL }, |
| 924 | 933 | .tosec = { ALL_INIT_SECTIONS, NULL }, |
| 925 | 934 | .mismatch = ANY_EXIT_TO_ANY_INIT, |
| 935 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 926 | 936 | }, |
| 927 | 937 | /* Do not export init/exit functions or data */ |
| 928 | 938 | { |
| 929 | 939 | .fromsec = { "__ksymtab*", NULL }, |
| 930 | 940 | .tosec = { INIT_SECTIONS, EXIT_SECTIONS, NULL }, |
| 931 | − .mismatch = EXPORT_TO_INIT_EXIT | |
| 941 | + .mismatch = EXPORT_TO_INIT_EXIT, | |
| 942 | + .symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, | |
| 932 | 943 | } |
| 933 | 944 | }; |
| 934 | 945 | |
| @@ -985,7 +996,8 @@ static const struct sectioncheck *section_mismatch( · 50 unmodified lines | ||
| 985 | 996 | * refsymname = __init_begin, _sinittext, _einittext |
| 986 | 997 | * |
| 987 | 998 | **/ |
| 988 | −static int secref_whitelist(const char *fromsec, const char *fromsym, | |
| 999 | +static int secref_whitelist(const struct sectioncheck *mismatch, | |
| 1000 | + const char *fromsec, const char *fromsym, | |
| 989 | 1001 | const char *tosec, const char *tosym) |
| 990 | 1002 | { |
| 991 | 1003 | /* Check for pattern 1 */ |
| @@ -997,7 +1009,7 @@ static int secref_whitelist(const char *fromsec, const char *fromsym, · 5 unmodified lines | ||
| 997 | 1009 | /* Check for pattern 2 */ |
| 998 | 1010 | if (match(tosec, init_exit_sections) && |
| 999 | 1011 | match(fromsec, data_sections) && |
| 1000 | − match(fromsym, symbol_white_list)) | |
| 1012 | + match(fromsym, mismatch->symbol_white_list)) | |
| 1001 | 1013 | return 0; |
| 1002 | 1014 | |
| 1003 | 1015 | /* Check for pattern 3 */ |
| @@ -1202,7 +1214,7 @@ static void report_sec_mismatch(const char *modname, · 198 unmodified lines | ||
| 1202 | 1214 | fromsym, sec2annotation(tosec), tosym); |
| 1203 | 1215 | break; |
| 1204 | 1216 | case DATA_TO_ANY_INIT: { |
| 1205 | − const char **s = symbol_white_list; | |
| 1217 | + const char *const *s = mismatch->symbol_white_list; | |
| 1206 | 1218 | fprintf(stderr, |
| 1207 | 1219 | "The variable %s references\n" |
| 1208 | 1220 | "the %s %s%s%s\n" |
| @@ -1223,7 +1235,7 @@ static void report_sec_mismatch(const char *modname, · 14 unmodified lines | ||
| 1223 | 1235 | fromsym, to, to, tosym, to_p, sec2annotation(tosec), tosym); |
| 1224 | 1236 | break; |
| 1225 | 1237 | case DATA_TO_ANY_EXIT: { |
| 1226 | − const char **s = symbol_white_list; | |
| 1238 | + const char *const *s = mismatch->symbol_white_list; | |
| 1227 | 1239 | fprintf(stderr, |
| 1228 | 1240 | "The variable %s references\n" |
| 1229 | 1241 | "the %s %s%s%s\n" |
| @@ -1304,7 +1316,8 @@ static void check_section_mismatch(const char *modname, struct elf_info *elf, · 74 unmodified lines | ||
| 1304 | 1316 | tosym = sym_name(elf, to); |
| 1305 | 1317 | |
| 1306 | 1318 | /* check whitelist - we may ignore it */ |
| 1307 | − if (secref_whitelist(fromsec, fromsym, tosec, tosym)) { | |
| 1319 | + if (secref_whitelist(mismatch, | |
| 1320 | + fromsec, fromsym, tosec, tosym)) { | |
| 1308 | 1321 | report_sec_mismatch(modname, mismatch, |
| 1309 | 1322 | fromsec, r->r_offset, fromsym, |
| 1310 | 1323 | is_function(from), tosec, tosym, |