1 /* Load the given section: NULL on error. */
2 static void *PERBIT(load_section
)(ElfPERBIT(Ehdr
) *hdr
,
7 ElfPERBIT(Shdr
) *sechdrs
;
11 /* Grab section headers and strings so we can tell who is who */
12 sechdrs
= (void *)hdr
+ END(hdr
->e_shoff
, conv
);
13 secnames
= (void *)hdr
14 + END(sechdrs
[END(hdr
->e_shstrndx
, conv
)].sh_offset
, conv
);
16 /* Find the section they want */
17 for (i
= 1; i
< END(hdr
->e_shnum
, conv
); i
++) {
18 if (streq(secnames
+END(sechdrs
[i
].sh_name
, conv
), secname
)) {
19 *size
= END(sechdrs
[i
].sh_size
, conv
);
20 return (void *)hdr
+ END(sechdrs
[i
].sh_offset
, conv
);
27 static void PERBIT(load_symbols
)(struct module
*module
)
29 struct PERBIT(kernel_symbol
) *ksyms
;
31 unsigned long i
, size
;
33 /* New-style: strings are in this section. */
34 ksymstrings
= PERBIT(load_section
)(module
->data
, "__ksymtab_strings",
39 /* Skip any zero padding. */
40 while (!ksymstrings
[i
])
43 add_symbol(ksymstrings
+i
, module
);
44 i
+= strlen(ksymstrings
+i
);
47 ksymstrings
= PERBIT(load_section
)(module
->data
,
48 "__ksymtab_strings_gpl",
51 /* Skip any zero padding. */
52 while (!ksymstrings
[i
])
55 add_symbol(ksymstrings
+i
, module
);
56 i
+= strlen(ksymstrings
+i
);
62 ksyms
= PERBIT(load_section
)(module
->data
, "__ksymtab", &size
,
64 for (i
= 0; i
< size
/ sizeof(struct PERBIT(kernel_symbol
)); i
++)
65 add_symbol(ksyms
[i
].name
, module
);
66 ksyms
= PERBIT(load_section
)(module
->data
, "__gpl_ksymtab", &size
,
68 for (i
= 0; i
< size
/ sizeof(struct PERBIT(kernel_symbol
)); i
++)
69 add_symbol(ksyms
[i
].name
, module
);
72 static char *PERBIT(get_aliases
)(struct module
*module
, unsigned long *size
)
74 return PERBIT(load_section
)(module
->data
, ".modalias", size
,
78 static char *PERBIT(get_modinfo
)(struct module
*module
, unsigned long *size
)
80 return PERBIT(load_section
)(module
->data
, ".modinfo", size
,
85 #define STT_REGISTER 13 /* Global register reserved to app. */
88 /* Calculate the dependencies for this module */
89 static void PERBIT(calculate_deps
)(struct module
*module
, int verbose
)
96 int handle_register_symbols
;
98 strings
= PERBIT(load_section
)(module
->data
, ".strtab", &size
,
100 syms
= PERBIT(load_section
)(module
->data
, ".symtab", &size
,
103 module
->num_deps
= 0;
106 if (!strings
|| !syms
) {
107 warn("Couldn't find symtab and strtab in module %s\n",
113 handle_register_symbols
= 0;
114 if (END(hdr
->e_machine
, module
->conv
) == EM_SPARC
||
115 END(hdr
->e_machine
, module
->conv
) == EM_SPARCV9
)
116 handle_register_symbols
= 1;
118 for (i
= 1; i
< size
/ sizeof(syms
[0]); i
++) {
119 if (END(syms
[i
].st_shndx
, module
->conv
) == SHN_UNDEF
) {
120 /* Look for symbol */
122 struct module
*owner
;
125 name
= strings
+ END(syms
[i
].st_name
, module
->conv
);
127 /* Not really undefined: sparc gcc 3.3 creates
128 U references when you have global asm
129 variables, to avoid anyone else misusing
131 if (handle_register_symbols
132 && (ELFPERBIT(ST_TYPE
)(END(syms
[i
].st_info
,
137 weak
= (ELFPERBIT(ST_BIND
)(END(syms
[i
].st_info
,
140 owner
= find_symbol(name
, module
->pathname
, weak
);
143 printf("%s needs \"%s\": %s\n",
144 module
->pathname
, name
,
146 add_dep(module
, owner
);
152 static void *PERBIT(deref_sym
)(ElfPERBIT(Ehdr
) *hdr
, const char *name
,
153 unsigned int *secsize
,
159 ElfPERBIT(Sym
) *syms
;
160 ElfPERBIT(Shdr
) *sechdrs
;
162 sechdrs
= (void *)hdr
+ END(hdr
->e_shoff
, conv
);
163 strings
= PERBIT(load_section
)(hdr
, ".strtab", &size
, conv
);
164 syms
= PERBIT(load_section
)(hdr
, ".symtab", &size
, conv
);
166 /* Don't warn again: we already have above */
167 if (!strings
|| !syms
)
170 for (i
= 0; i
< size
/ sizeof(syms
[0]); i
++) {
171 if (streq(strings
+ END(syms
[i
].st_name
, conv
), name
)) {
172 /* In BSS? Happens for empty device tables on
173 * recent GCC versions. */
174 if (END(sechdrs
[END(syms
[i
].st_shndx
, conv
)].sh_type
,
178 *secsize
= END(syms
[i
].st_size
, conv
);
180 + END(sechdrs
[END(syms
[i
].st_shndx
, conv
)]
182 + END(syms
[i
].st_value
, conv
);
188 /* FIXME: Check size, unless we end up using aliases anyway --RR */
189 static void PERBIT(fetch_tables
)(struct module
*module
)
191 module
->pci_size
= PERBIT(PCI_DEVICE_SIZE
);
192 module
->pci_table
= PERBIT(deref_sym
)(module
->data
,
193 "__mod_pci_device_table",
196 module
->usb_size
= PERBIT(USB_DEVICE_SIZE
);
197 module
->usb_table
= PERBIT(deref_sym
)(module
->data
,
198 "__mod_usb_device_table",
201 module
->ccw_size
= PERBIT(CCW_DEVICE_SIZE
);
202 module
->ccw_table
= PERBIT(deref_sym
)(module
->data
,
203 "__mod_ccw_device_table",
206 module
->ieee1394_size
= PERBIT(IEEE1394_DEVICE_SIZE
);
207 module
->ieee1394_table
= PERBIT(deref_sym
)(module
->data
,
208 "__mod_ieee1394_device_table",
211 module
->pnp_size
= PERBIT(PNP_DEVICE_SIZE
);
212 module
->pnp_table
= PERBIT(deref_sym
)(module
->data
,
213 "__mod_pnp_device_table",
216 module
->pnp_card_size
= PERBIT(PNP_CARD_DEVICE_SIZE
);
217 module
->pnp_card_table
= PERBIT(deref_sym
)(module
->data
,
218 "__mod_pnp_card_device_table",
220 module
->pnp_card_offset
= PERBIT(PNP_CARD_DEVICE_OFFSET
);
222 module
->input_size
= PERBIT(INPUT_DEVICE_SIZE
);
223 module
->input_table
= PERBIT(deref_sym
)(module
->data
,
224 "__mod_input_device_table",
225 &module
->input_table_size
,
228 module
->serio_size
= PERBIT(SERIO_DEVICE_SIZE
);
229 module
->serio_table
= PERBIT(deref_sym
)(module
->data
,
230 "__mod_serio_device_table",
233 module
->of_size
= PERBIT(OF_DEVICE_SIZE
);
234 module
->of_table
= PERBIT(deref_sym
)(module
->data
,
235 "__mod_of_device_table",
239 struct module_ops
PERBIT(mod_ops
) = {
240 .load_symbols
= PERBIT(load_symbols
),
241 .calculate_deps
= PERBIT(calculate_deps
),
242 .fetch_tables
= PERBIT(fetch_tables
),
243 .get_aliases
= PERBIT(get_aliases
),
244 .get_modinfo
= PERBIT(get_modinfo
),