aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-03-20 16:17:13 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-03-20 16:42:58 -0500
commit9f28bb7e1d0188a993403ab39b774785892805e1 (patch)
tree939660c2531335dc899cc66fa7f3f05aa343d1e0
parent3fd6805f4dfb02bcfb5634972eabad0e790f119a (diff)
[PATCH] add EXPORT_SYMBOL_GPL_FUTURE()
This patch adds the ability to mark symbols that will be changed in the future, so that kernel modules that don't include MODULE_LICENSE("GPL") and use the symbols, will be flagged and printed out to the system log. Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--arch/m68knommu/kernel/vmlinux.lds.S10
-rw-r--r--arch/v850/kernel/vmlinux.lds.S8
-rw-r--r--include/asm-generic/vmlinux.lds.h14
-rw-r--r--include/linux/module.h9
-rw-r--r--kernel/module.c49
-rw-r--r--scripts/genksyms/keywords.c_shipped91
-rw-r--r--scripts/genksyms/keywords.gperf1
7 files changed, 135 insertions, 47 deletions
diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S
index ac9de2661c0b..a331cc90797c 100644
--- a/arch/m68knommu/kernel/vmlinux.lds.S
+++ b/arch/m68knommu/kernel/vmlinux.lds.S
@@ -269,6 +269,11 @@ SECTIONS {
269 *(__ksymtab_gpl) 269 *(__ksymtab_gpl)
270 __stop___ksymtab_gpl = .; 270 __stop___ksymtab_gpl = .;
271 271
272 /* Kernel symbol table: GPL-future symbols */
273 __start___ksymtab_gpl_future = .;
274 *(__ksymtab_gpl_future)
275 __stop___ksymtab_gpl_future = .;
276
272 /* Kernel symbol table: Normal symbols */ 277 /* Kernel symbol table: Normal symbols */
273 __start___kcrctab = .; 278 __start___kcrctab = .;
274 *(__kcrctab) 279 *(__kcrctab)
@@ -279,6 +284,11 @@ SECTIONS {
279 *(__kcrctab_gpl) 284 *(__kcrctab_gpl)
280 __stop___kcrctab_gpl = .; 285 __stop___kcrctab_gpl = .;
281 286
287 /* Kernel symbol table: GPL-future symbols */
288 __start___kcrctab_gpl_future = .;
289 *(__kcrctab_gpl_future)
290 __stop___kcrctab_gpl_future = .;
291
282 /* Kernel symbol table: strings */ 292 /* Kernel symbol table: strings */
283 *(__ksymtab_strings) 293 *(__ksymtab_strings)
284 294
diff --git a/arch/v850/kernel/vmlinux.lds.S b/arch/v850/kernel/vmlinux.lds.S
index 5be05f47109e..5b2ffcc6e2b2 100644
--- a/arch/v850/kernel/vmlinux.lds.S
+++ b/arch/v850/kernel/vmlinux.lds.S
@@ -64,6 +64,10 @@
64 ___start___ksymtab_gpl = .; \ 64 ___start___ksymtab_gpl = .; \
65 *(__ksymtab_gpl) \ 65 *(__ksymtab_gpl) \
66 ___stop___ksymtab_gpl = .; \ 66 ___stop___ksymtab_gpl = .; \
67 /* Kernel symbol table: GPL-future symbols */ \
68 ___start___ksymtab_gpl_future = .; \
69 *(__ksymtab_gpl_future) \
70 ___stop___ksymtab_gpl_future = .; \
67 /* Kernel symbol table: strings */ \ 71 /* Kernel symbol table: strings */ \
68 *(__ksymtab_strings) \ 72 *(__ksymtab_strings) \
69 /* Kernel symbol table: Normal symbols */ \ 73 /* Kernel symbol table: Normal symbols */ \
@@ -74,6 +78,10 @@
74 ___start___kcrctab_gpl = .; \ 78 ___start___kcrctab_gpl = .; \
75 *(__kcrctab_gpl) \ 79 *(__kcrctab_gpl) \
76 ___stop___kcrctab_gpl = .; \ 80 ___stop___kcrctab_gpl = .; \
81 /* Kernel symbol table: GPL-future symbols */ \
82 ___start___kcrctab_gpl_future = .; \
83 *(__kcrctab_gpl_future) \
84 ___stop___kcrctab_gpl_future = .; \
77 /* Built-in module parameters */ \ 85 /* Built-in module parameters */ \
78 . = ALIGN (4) ; \ 86 . = ALIGN (4) ; \
79 ___start___param = .; \ 87 ___start___param = .; \
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 35de20cf8fac..9d11550b4818 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -58,6 +58,13 @@
58 VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \ 58 VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \
59 } \ 59 } \
60 \ 60 \
61 /* Kernel symbol table: GPL-future-only symbols */ \
62 __ksymtab_gpl_future : AT(ADDR(__ksymtab_gpl_future) - LOAD_OFFSET) { \
63 VMLINUX_SYMBOL(__start___ksymtab_gpl_future) = .; \
64 *(__ksymtab_gpl_future) \
65 VMLINUX_SYMBOL(__stop___ksymtab_gpl_future) = .; \
66 } \
67 \
61 /* Kernel symbol table: Normal symbols */ \ 68 /* Kernel symbol table: Normal symbols */ \
62 __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ 69 __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \
63 VMLINUX_SYMBOL(__start___kcrctab) = .; \ 70 VMLINUX_SYMBOL(__start___kcrctab) = .; \
@@ -72,6 +79,13 @@
72 VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \ 79 VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \
73 } \ 80 } \
74 \ 81 \
82 /* Kernel symbol table: GPL-future-only symbols */ \
83 __kcrctab_gpl_future : AT(ADDR(__kcrctab_gpl_future) - LOAD_OFFSET) { \
84 VMLINUX_SYMBOL(__start___kcrctab_gpl_future) = .; \
85 *(__kcrctab_gpl_future) \
86 VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \
87 } \
88 \
75 /* Kernel symbol table: strings */ \ 89 /* Kernel symbol table: strings */ \
76 __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ 90 __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
77 *(__ksymtab_strings) \ 91 *(__ksymtab_strings) \
diff --git a/include/linux/module.h b/include/linux/module.h
index 84d75f3a8aca..a25d5f61548c 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -198,6 +198,9 @@ void *__symbol_get_gpl(const char *symbol);
198#define EXPORT_SYMBOL_GPL(sym) \ 198#define EXPORT_SYMBOL_GPL(sym) \
199 __EXPORT_SYMBOL(sym, "_gpl") 199 __EXPORT_SYMBOL(sym, "_gpl")
200 200
201#define EXPORT_SYMBOL_GPL_FUTURE(sym) \
202 __EXPORT_SYMBOL(sym, "_gpl_future")
203
201#endif 204#endif
202 205
203struct module_ref 206struct module_ref
@@ -255,6 +258,11 @@ struct module
255 unsigned int num_gpl_syms; 258 unsigned int num_gpl_syms;
256 const unsigned long *gpl_crcs; 259 const unsigned long *gpl_crcs;
257 260
261 /* symbols that will be GPL-only in the near future. */
262 const struct kernel_symbol *gpl_future_syms;
263 unsigned int num_gpl_future_syms;
264 const unsigned long *gpl_future_crcs;
265
258 /* Exception table */ 266 /* Exception table */
259 unsigned int num_exentries; 267 unsigned int num_exentries;
260 const struct exception_table_entry *extable; 268 const struct exception_table_entry *extable;
@@ -441,6 +449,7 @@ void module_remove_driver(struct device_driver *);
441#else /* !CONFIG_MODULES... */ 449#else /* !CONFIG_MODULES... */
442#define EXPORT_SYMBOL(sym) 450#define EXPORT_SYMBOL(sym)
443#define EXPORT_SYMBOL_GPL(sym) 451#define EXPORT_SYMBOL_GPL(sym)
452#define EXPORT_SYMBOL_GPL_FUTURE(sym)
444 453
445/* Given an address, look for it in the exception tables. */ 454/* Given an address, look for it in the exception tables. */
446static inline const struct exception_table_entry * 455static inline const struct exception_table_entry *
diff --git a/kernel/module.c b/kernel/module.c
index 2a892b20d68f..5ca99fbe9f44 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -126,8 +126,11 @@ extern const struct kernel_symbol __start___ksymtab[];
126extern const struct kernel_symbol __stop___ksymtab[]; 126extern const struct kernel_symbol __stop___ksymtab[];
127extern const struct kernel_symbol __start___ksymtab_gpl[]; 127extern const struct kernel_symbol __start___ksymtab_gpl[];
128extern const struct kernel_symbol __stop___ksymtab_gpl[]; 128extern const struct kernel_symbol __stop___ksymtab_gpl[];
129extern const struct kernel_symbol __start___ksymtab_gpl_future[];
130extern const struct kernel_symbol __stop___ksymtab_gpl_future[];
129extern const unsigned long __start___kcrctab[]; 131extern const unsigned long __start___kcrctab[];
130extern const unsigned long __start___kcrctab_gpl[]; 132extern const unsigned long __start___kcrctab_gpl[];
133extern const unsigned long __start___kcrctab_gpl_future[];
131 134
132#ifndef CONFIG_MODVERSIONS 135#ifndef CONFIG_MODVERSIONS
133#define symversion(base, idx) NULL 136#define symversion(base, idx) NULL
@@ -172,6 +175,22 @@ static unsigned long __find_symbol(const char *name,
172 return ks->value; 175 return ks->value;
173 } 176 }
174 } 177 }
178 ks = lookup_symbol(name, __start___ksymtab_gpl_future,
179 __stop___ksymtab_gpl_future);
180 if (ks) {
181 if (!gplok) {
182 printk(KERN_WARNING "Symbol %s is being used "
183 "by a non-GPL module, which will not "
184 "be allowed in the future\n", name);
185 printk(KERN_WARNING "Please see the file "
186 "Documentation/feature-removal-schedule.txt "
187 "in the kernel source tree for more "
188 "details.\n");
189 }
190 *crc = symversion(__start___kcrctab_gpl_future,
191 (ks - __start___ksymtab_gpl_future));
192 return ks->value;
193 }
175 194
176 /* Now try modules. */ 195 /* Now try modules. */
177 list_for_each_entry(mod, &modules, list) { 196 list_for_each_entry(mod, &modules, list) {
@@ -191,6 +210,23 @@ static unsigned long __find_symbol(const char *name,
191 return ks->value; 210 return ks->value;
192 } 211 }
193 } 212 }
213 ks = lookup_symbol(name, mod->gpl_future_syms,
214 (mod->gpl_future_syms +
215 mod->num_gpl_future_syms));
216 if (ks) {
217 if (!gplok) {
218 printk(KERN_WARNING "Symbol %s is being used "
219 "by a non-GPL module, which will not "
220 "be allowed in the future\n", name);
221 printk(KERN_WARNING "Please see the file "
222 "Documentation/feature-removal-schedule.txt "
223 "in the kernel source tree for more "
224 "details.\n");
225 }
226 *crc = symversion(mod->gpl_future_crcs,
227 (ks - mod->gpl_future_syms));
228 return ks->value;
229 }
194 } 230 }
195 DEBUGP("Failed to find symbol %s\n", name); 231 DEBUGP("Failed to find symbol %s\n", name);
196 return 0; 232 return 0;
@@ -1546,7 +1582,8 @@ static struct module *load_module(void __user *umod,
1546 char *secstrings, *args, *modmagic, *strtab = NULL; 1582 char *secstrings, *args, *modmagic, *strtab = NULL;
1547 unsigned int i, symindex = 0, strindex = 0, setupindex, exindex, 1583 unsigned int i, symindex = 0, strindex = 0, setupindex, exindex,
1548 exportindex, modindex, obsparmindex, infoindex, gplindex, 1584 exportindex, modindex, obsparmindex, infoindex, gplindex,
1549 crcindex, gplcrcindex, versindex, pcpuindex; 1585 crcindex, gplcrcindex, versindex, pcpuindex, gplfutureindex,
1586 gplfuturecrcindex;
1550 long arglen; 1587 long arglen;
1551 struct module *mod; 1588 struct module *mod;
1552 long err = 0; 1589 long err = 0;
@@ -1627,8 +1664,10 @@ static struct module *load_module(void __user *umod,
1627 /* Optional sections */ 1664 /* Optional sections */
1628 exportindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab"); 1665 exportindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab");
1629 gplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl"); 1666 gplindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl");
1667 gplfutureindex = find_sec(hdr, sechdrs, secstrings, "__ksymtab_gpl_future");
1630 crcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab"); 1668 crcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab");
1631 gplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl"); 1669 gplcrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl");
1670 gplfuturecrcindex = find_sec(hdr, sechdrs, secstrings, "__kcrctab_gpl_future");
1632 setupindex = find_sec(hdr, sechdrs, secstrings, "__param"); 1671 setupindex = find_sec(hdr, sechdrs, secstrings, "__param");
1633 exindex = find_sec(hdr, sechdrs, secstrings, "__ex_table"); 1672 exindex = find_sec(hdr, sechdrs, secstrings, "__ex_table");
1634 obsparmindex = find_sec(hdr, sechdrs, secstrings, "__obsparm"); 1673 obsparmindex = find_sec(hdr, sechdrs, secstrings, "__obsparm");
@@ -1784,10 +1823,16 @@ static struct module *load_module(void __user *umod,
1784 mod->gpl_syms = (void *)sechdrs[gplindex].sh_addr; 1823 mod->gpl_syms = (void *)sechdrs[gplindex].sh_addr;
1785 if (gplcrcindex) 1824 if (gplcrcindex)
1786 mod->gpl_crcs = (void *)sechdrs[gplcrcindex].sh_addr; 1825 mod->gpl_crcs = (void *)sechdrs[gplcrcindex].sh_addr;
1826 mod->num_gpl_future_syms = sechdrs[gplfutureindex].sh_size /
1827 sizeof(*mod->gpl_future_syms);
1828 mod->gpl_future_syms = (void *)sechdrs[gplfutureindex].sh_addr;
1829 if (gplfuturecrcindex)
1830 mod->gpl_future_crcs = (void *)sechdrs[gplfuturecrcindex].sh_addr;
1787 1831
1788#ifdef CONFIG_MODVERSIONS 1832#ifdef CONFIG_MODVERSIONS
1789 if ((mod->num_syms && !crcindex) || 1833 if ((mod->num_syms && !crcindex) ||
1790 (mod->num_gpl_syms && !gplcrcindex)) { 1834 (mod->num_gpl_syms && !gplcrcindex) ||
1835 (mod->num_gpl_future_syms && !gplfuturecrcindex)) {
1791 printk(KERN_WARNING "%s: No versions for exported symbols." 1836 printk(KERN_WARNING "%s: No versions for exported symbols."
1792 " Tainting kernel.\n", mod->name); 1837 " Tainting kernel.\n", mod->name);
1793 add_taint(TAINT_FORCED_MODULE); 1838 add_taint(TAINT_FORCED_MODULE);
diff --git a/scripts/genksyms/keywords.c_shipped b/scripts/genksyms/keywords.c_shipped
index ee4647805c58..d8153f572e40 100644
--- a/scripts/genksyms/keywords.c_shipped
+++ b/scripts/genksyms/keywords.c_shipped
@@ -52,9 +52,9 @@ is_reserved_hash (register const char *str, register unsigned int len)
52 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 52 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
53 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 53 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
54 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 54 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
55 71, 71, 71, 71, 71, 71, 71, 71, 71, 15, 55 71, 71, 71, 71, 71, 71, 71, 71, 71, 0,
56 71, 71, 71, 71, 71, 71, 15, 71, 71, 71, 56 71, 71, 71, 71, 71, 71, 35, 71, 71, 71,
57 10, 71, 71, 71, 71, 71, 71, 71, 71, 71, 57 5, 71, 71, 71, 71, 71, 71, 71, 71, 71,
58 71, 71, 71, 71, 71, 0, 71, 0, 71, 5, 58 71, 71, 71, 71, 71, 0, 71, 0, 71, 5,
59 5, 0, 10, 20, 71, 25, 71, 71, 20, 0, 59 5, 0, 10, 20, 71, 25, 71, 71, 20, 0,
60 20, 30, 25, 71, 10, 5, 0, 20, 15, 71, 60 20, 30, 25, 71, 10, 5, 0, 20, 15, 71,
@@ -84,9 +84,9 @@ is_reserved_word (register const char *str, register unsigned int len)
84{ 84{
85 enum 85 enum
86 { 86 {
87 TOTAL_KEYWORDS = 41, 87 TOTAL_KEYWORDS = 42,
88 MIN_WORD_LENGTH = 3, 88 MIN_WORD_LENGTH = 3,
89 MAX_WORD_LENGTH = 17, 89 MAX_WORD_LENGTH = 24,
90 MIN_HASH_VALUE = 3, 90 MIN_HASH_VALUE = 3,
91 MAX_HASH_VALUE = 70 91 MAX_HASH_VALUE = 70
92 }; 92 };
@@ -94,104 +94,105 @@ is_reserved_word (register const char *str, register unsigned int len)
94 static const struct resword wordlist[] = 94 static const struct resword wordlist[] =
95 { 95 {
96 {""}, {""}, {""}, 96 {""}, {""}, {""},
97#line 24 "scripts/genksyms/keywords.gperf" 97#line 25 "scripts/genksyms/keywords.gperf"
98 {"asm", ASM_KEYW}, 98 {"asm", ASM_KEYW},
99 {""}, 99 {""},
100#line 7 "scripts/genksyms/keywords.gperf" 100#line 8 "scripts/genksyms/keywords.gperf"
101 {"__asm", ASM_KEYW}, 101 {"__asm", ASM_KEYW},
102 {""}, 102 {""},
103#line 8 "scripts/genksyms/keywords.gperf" 103#line 9 "scripts/genksyms/keywords.gperf"
104 {"__asm__", ASM_KEYW}, 104 {"__asm__", ASM_KEYW},
105 {""}, 105 {""},
106#line 21 "scripts/genksyms/keywords.gperf" 106#line 22 "scripts/genksyms/keywords.gperf"
107 {"_restrict", RESTRICT_KEYW}, 107 {"_restrict", RESTRICT_KEYW},
108#line 50 "scripts/genksyms/keywords.gperf" 108#line 51 "scripts/genksyms/keywords.gperf"
109 {"__typeof__", TYPEOF_KEYW}, 109 {"__typeof__", TYPEOF_KEYW},
110#line 9 "scripts/genksyms/keywords.gperf" 110#line 10 "scripts/genksyms/keywords.gperf"
111 {"__attribute", ATTRIBUTE_KEYW}, 111 {"__attribute", ATTRIBUTE_KEYW},
112#line 11 "scripts/genksyms/keywords.gperf" 112#line 12 "scripts/genksyms/keywords.gperf"
113 {"__const", CONST_KEYW}, 113 {"__const", CONST_KEYW},
114#line 10 "scripts/genksyms/keywords.gperf" 114#line 11 "scripts/genksyms/keywords.gperf"
115 {"__attribute__", ATTRIBUTE_KEYW}, 115 {"__attribute__", ATTRIBUTE_KEYW},
116#line 12 "scripts/genksyms/keywords.gperf" 116#line 13 "scripts/genksyms/keywords.gperf"
117 {"__const__", CONST_KEYW}, 117 {"__const__", CONST_KEYW},
118#line 16 "scripts/genksyms/keywords.gperf" 118#line 17 "scripts/genksyms/keywords.gperf"
119 {"__signed__", SIGNED_KEYW}, 119 {"__signed__", SIGNED_KEYW},
120#line 42 "scripts/genksyms/keywords.gperf" 120#line 43 "scripts/genksyms/keywords.gperf"
121 {"static", STATIC_KEYW}, 121 {"static", STATIC_KEYW},
122 {""}, 122 {""},
123#line 15 "scripts/genksyms/keywords.gperf" 123#line 16 "scripts/genksyms/keywords.gperf"
124 {"__signed", SIGNED_KEYW}, 124 {"__signed", SIGNED_KEYW},
125#line 30 "scripts/genksyms/keywords.gperf" 125#line 31 "scripts/genksyms/keywords.gperf"
126 {"char", CHAR_KEYW}, 126 {"char", CHAR_KEYW},
127 {""}, 127 {""},
128#line 43 "scripts/genksyms/keywords.gperf" 128#line 44 "scripts/genksyms/keywords.gperf"
129 {"struct", STRUCT_KEYW}, 129 {"struct", STRUCT_KEYW},
130#line 22 "scripts/genksyms/keywords.gperf"
131 {"__restrict__", RESTRICT_KEYW},
132#line 23 "scripts/genksyms/keywords.gperf" 130#line 23 "scripts/genksyms/keywords.gperf"
131 {"__restrict__", RESTRICT_KEYW},
132#line 24 "scripts/genksyms/keywords.gperf"
133 {"restrict", RESTRICT_KEYW}, 133 {"restrict", RESTRICT_KEYW},
134#line 33 "scripts/genksyms/keywords.gperf" 134#line 34 "scripts/genksyms/keywords.gperf"
135 {"enum", ENUM_KEYW}, 135 {"enum", ENUM_KEYW},
136#line 17 "scripts/genksyms/keywords.gperf" 136#line 18 "scripts/genksyms/keywords.gperf"
137 {"__volatile", VOLATILE_KEYW}, 137 {"__volatile", VOLATILE_KEYW},
138#line 34 "scripts/genksyms/keywords.gperf" 138#line 35 "scripts/genksyms/keywords.gperf"
139 {"extern", EXTERN_KEYW}, 139 {"extern", EXTERN_KEYW},
140#line 18 "scripts/genksyms/keywords.gperf" 140#line 19 "scripts/genksyms/keywords.gperf"
141 {"__volatile__", VOLATILE_KEYW}, 141 {"__volatile__", VOLATILE_KEYW},
142#line 37 "scripts/genksyms/keywords.gperf" 142#line 38 "scripts/genksyms/keywords.gperf"
143 {"int", INT_KEYW}, 143 {"int", INT_KEYW},
144 {""}, 144#line 7 "scripts/genksyms/keywords.gperf"
145#line 31 "scripts/genksyms/keywords.gperf" 145 {"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
146 {"const", CONST_KEYW},
147#line 32 "scripts/genksyms/keywords.gperf" 146#line 32 "scripts/genksyms/keywords.gperf"
147 {"const", CONST_KEYW},
148#line 33 "scripts/genksyms/keywords.gperf"
148 {"double", DOUBLE_KEYW}, 149 {"double", DOUBLE_KEYW},
149 {""}, 150 {""},
150#line 13 "scripts/genksyms/keywords.gperf" 151#line 14 "scripts/genksyms/keywords.gperf"
151 {"__inline", INLINE_KEYW}, 152 {"__inline", INLINE_KEYW},
152#line 29 "scripts/genksyms/keywords.gperf" 153#line 30 "scripts/genksyms/keywords.gperf"
153 {"auto", AUTO_KEYW}, 154 {"auto", AUTO_KEYW},
154#line 14 "scripts/genksyms/keywords.gperf" 155#line 15 "scripts/genksyms/keywords.gperf"
155 {"__inline__", INLINE_KEYW}, 156 {"__inline__", INLINE_KEYW},
156#line 41 "scripts/genksyms/keywords.gperf" 157#line 42 "scripts/genksyms/keywords.gperf"
157 {"signed", SIGNED_KEYW}, 158 {"signed", SIGNED_KEYW},
158 {""}, 159 {""},
159#line 46 "scripts/genksyms/keywords.gperf" 160#line 47 "scripts/genksyms/keywords.gperf"
160 {"unsigned", UNSIGNED_KEYW}, 161 {"unsigned", UNSIGNED_KEYW},
161 {""}, 162 {""},
162#line 40 "scripts/genksyms/keywords.gperf" 163#line 41 "scripts/genksyms/keywords.gperf"
163 {"short", SHORT_KEYW}, 164 {"short", SHORT_KEYW},
164#line 49 "scripts/genksyms/keywords.gperf" 165#line 50 "scripts/genksyms/keywords.gperf"
165 {"typeof", TYPEOF_KEYW}, 166 {"typeof", TYPEOF_KEYW},
166#line 44 "scripts/genksyms/keywords.gperf" 167#line 45 "scripts/genksyms/keywords.gperf"
167 {"typedef", TYPEDEF_KEYW}, 168 {"typedef", TYPEDEF_KEYW},
168#line 48 "scripts/genksyms/keywords.gperf" 169#line 49 "scripts/genksyms/keywords.gperf"
169 {"volatile", VOLATILE_KEYW}, 170 {"volatile", VOLATILE_KEYW},
170 {""}, 171 {""},
171#line 35 "scripts/genksyms/keywords.gperf" 172#line 36 "scripts/genksyms/keywords.gperf"
172 {"float", FLOAT_KEYW}, 173 {"float", FLOAT_KEYW},
173 {""}, {""}, 174 {""}, {""},
174#line 39 "scripts/genksyms/keywords.gperf" 175#line 40 "scripts/genksyms/keywords.gperf"
175 {"register", REGISTER_KEYW}, 176 {"register", REGISTER_KEYW},
176#line 47 "scripts/genksyms/keywords.gperf" 177#line 48 "scripts/genksyms/keywords.gperf"
177 {"void", VOID_KEYW}, 178 {"void", VOID_KEYW},
178 {""}, 179 {""},
179#line 36 "scripts/genksyms/keywords.gperf" 180#line 37 "scripts/genksyms/keywords.gperf"
180 {"inline", INLINE_KEYW}, 181 {"inline", INLINE_KEYW},
181 {""}, 182 {""},
182#line 5 "scripts/genksyms/keywords.gperf" 183#line 5 "scripts/genksyms/keywords.gperf"
183 {"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW}, 184 {"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
184 {""}, 185 {""},
185#line 20 "scripts/genksyms/keywords.gperf" 186#line 21 "scripts/genksyms/keywords.gperf"
186 {"_Bool", BOOL_KEYW}, 187 {"_Bool", BOOL_KEYW},
187 {""}, 188 {""},
188#line 6 "scripts/genksyms/keywords.gperf" 189#line 6 "scripts/genksyms/keywords.gperf"
189 {"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW}, 190 {"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
190 {""}, {""}, {""}, {""}, {""}, {""}, 191 {""}, {""}, {""}, {""}, {""}, {""},
191#line 38 "scripts/genksyms/keywords.gperf" 192#line 39 "scripts/genksyms/keywords.gperf"
192 {"long", LONG_KEYW}, 193 {"long", LONG_KEYW},
193 {""}, {""}, {""}, {""}, {""}, 194 {""}, {""}, {""}, {""}, {""},
194#line 45 "scripts/genksyms/keywords.gperf" 195#line 46 "scripts/genksyms/keywords.gperf"
195 {"union", UNION_KEYW} 196 {"union", UNION_KEYW}
196 }; 197 };
197 198
diff --git a/scripts/genksyms/keywords.gperf b/scripts/genksyms/keywords.gperf
index b6bec765996e..c75e0c8d8f0c 100644
--- a/scripts/genksyms/keywords.gperf
+++ b/scripts/genksyms/keywords.gperf
@@ -4,6 +4,7 @@ struct resword { const char *name; int token; }
4%% 4%%
5EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW 5EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW
6EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW 6EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
7EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW
7__asm, ASM_KEYW 8__asm, ASM_KEYW
8__asm__, ASM_KEYW 9__asm__, ASM_KEYW
9__attribute, ATTRIBUTE_KEYW 10__attribute, ATTRIBUTE_KEYW