diff options
Diffstat (limited to 'arch/blackfin/kernel/module.c')
-rw-r--r-- | arch/blackfin/kernel/module.c | 74 |
1 files changed, 59 insertions, 15 deletions
diff --git a/arch/blackfin/kernel/module.c b/arch/blackfin/kernel/module.c index 14a42848f37f..e1bebc80a5bf 100644 --- a/arch/blackfin/kernel/module.c +++ b/arch/blackfin/kernel/module.c | |||
@@ -173,7 +173,7 @@ module_frob_arch_sections(Elf_Ehdr * hdr, Elf_Shdr * sechdrs, | |||
173 | for (s = sechdrs; s < sechdrs_end; ++s) { | 173 | for (s = sechdrs; s < sechdrs_end; ++s) { |
174 | if ((strcmp(".l1.text", secstrings + s->sh_name) == 0) || | 174 | if ((strcmp(".l1.text", secstrings + s->sh_name) == 0) || |
175 | ((strcmp(".text", secstrings + s->sh_name) == 0) && | 175 | ((strcmp(".text", secstrings + s->sh_name) == 0) && |
176 | (hdr->e_flags & FLG_CODE_IN_L1) && (s->sh_size > 0))) { | 176 | (hdr->e_flags & EF_BFIN_CODE_IN_L1) && (s->sh_size > 0))) { |
177 | dest = l1_inst_sram_alloc(s->sh_size); | 177 | dest = l1_inst_sram_alloc(s->sh_size); |
178 | mod->arch.text_l1 = dest; | 178 | mod->arch.text_l1 = dest; |
179 | if (dest == NULL) { | 179 | if (dest == NULL) { |
@@ -188,7 +188,7 @@ module_frob_arch_sections(Elf_Ehdr * hdr, Elf_Shdr * sechdrs, | |||
188 | } | 188 | } |
189 | if ((strcmp(".l1.data", secstrings + s->sh_name) == 0) || | 189 | if ((strcmp(".l1.data", secstrings + s->sh_name) == 0) || |
190 | ((strcmp(".data", secstrings + s->sh_name) == 0) && | 190 | ((strcmp(".data", secstrings + s->sh_name) == 0) && |
191 | (hdr->e_flags & FLG_DATA_IN_L1) && (s->sh_size > 0))) { | 191 | (hdr->e_flags & EF_BFIN_DATA_IN_L1) && (s->sh_size > 0))) { |
192 | dest = l1_data_sram_alloc(s->sh_size); | 192 | dest = l1_data_sram_alloc(s->sh_size); |
193 | mod->arch.data_a_l1 = dest; | 193 | mod->arch.data_a_l1 = dest; |
194 | if (dest == NULL) { | 194 | if (dest == NULL) { |
@@ -203,7 +203,7 @@ module_frob_arch_sections(Elf_Ehdr * hdr, Elf_Shdr * sechdrs, | |||
203 | } | 203 | } |
204 | if (strcmp(".l1.bss", secstrings + s->sh_name) == 0 || | 204 | if (strcmp(".l1.bss", secstrings + s->sh_name) == 0 || |
205 | ((strcmp(".bss", secstrings + s->sh_name) == 0) && | 205 | ((strcmp(".bss", secstrings + s->sh_name) == 0) && |
206 | (hdr->e_flags & FLG_DATA_IN_L1) && (s->sh_size > 0))) { | 206 | (hdr->e_flags & EF_BFIN_DATA_IN_L1) && (s->sh_size > 0))) { |
207 | dest = l1_data_sram_alloc(s->sh_size); | 207 | dest = l1_data_sram_alloc(s->sh_size); |
208 | mod->arch.bss_a_l1 = dest; | 208 | mod->arch.bss_a_l1 = dest; |
209 | if (dest == NULL) { | 209 | if (dest == NULL) { |
@@ -242,6 +242,51 @@ module_frob_arch_sections(Elf_Ehdr * hdr, Elf_Shdr * sechdrs, | |||
242 | s->sh_flags &= ~SHF_ALLOC; | 242 | s->sh_flags &= ~SHF_ALLOC; |
243 | s->sh_addr = (unsigned long)dest; | 243 | s->sh_addr = (unsigned long)dest; |
244 | } | 244 | } |
245 | if ((strcmp(".l2.text", secstrings + s->sh_name) == 0) || | ||
246 | ((strcmp(".text", secstrings + s->sh_name) == 0) && | ||
247 | (hdr->e_flags & EF_BFIN_CODE_IN_L2) && (s->sh_size > 0))) { | ||
248 | dest = l2_sram_alloc(s->sh_size); | ||
249 | mod->arch.text_l2 = dest; | ||
250 | if (dest == NULL) { | ||
251 | printk(KERN_ERR | ||
252 | "module %s: L2 SRAM allocation failed\n", | ||
253 | mod->name); | ||
254 | return -1; | ||
255 | } | ||
256 | memcpy(dest, (void *)s->sh_addr, s->sh_size); | ||
257 | s->sh_flags &= ~SHF_ALLOC; | ||
258 | s->sh_addr = (unsigned long)dest; | ||
259 | } | ||
260 | if ((strcmp(".l2.data", secstrings + s->sh_name) == 0) || | ||
261 | ((strcmp(".data", secstrings + s->sh_name) == 0) && | ||
262 | (hdr->e_flags & EF_BFIN_DATA_IN_L2) && (s->sh_size > 0))) { | ||
263 | dest = l2_sram_alloc(s->sh_size); | ||
264 | mod->arch.data_l2 = dest; | ||
265 | if (dest == NULL) { | ||
266 | printk(KERN_ERR | ||
267 | "module %s: L2 SRAM allocation failed\n", | ||
268 | mod->name); | ||
269 | return -1; | ||
270 | } | ||
271 | memcpy(dest, (void *)s->sh_addr, s->sh_size); | ||
272 | s->sh_flags &= ~SHF_ALLOC; | ||
273 | s->sh_addr = (unsigned long)dest; | ||
274 | } | ||
275 | if (strcmp(".l2.bss", secstrings + s->sh_name) == 0 || | ||
276 | ((strcmp(".bss", secstrings + s->sh_name) == 0) && | ||
277 | (hdr->e_flags & EF_BFIN_DATA_IN_L2) && (s->sh_size > 0))) { | ||
278 | dest = l2_sram_alloc(s->sh_size); | ||
279 | mod->arch.bss_l2 = dest; | ||
280 | if (dest == NULL) { | ||
281 | printk(KERN_ERR | ||
282 | "module %s: L2 SRAM allocation failed\n", | ||
283 | mod->name); | ||
284 | return -1; | ||
285 | } | ||
286 | memset(dest, 0, s->sh_size); | ||
287 | s->sh_flags &= ~SHF_ALLOC; | ||
288 | s->sh_addr = (unsigned long)dest; | ||
289 | } | ||
245 | } | 290 | } |
246 | return 0; | 291 | return 0; |
247 | } | 292 | } |
@@ -411,9 +456,10 @@ module_finalize(const Elf_Ehdr * hdr, | |||
411 | continue; | 456 | continue; |
412 | 457 | ||
413 | if ((sechdrs[i].sh_type == SHT_RELA) && | 458 | if ((sechdrs[i].sh_type == SHT_RELA) && |
414 | ((strcmp(".rela.l1.text", secstrings + sechdrs[i].sh_name) == 0) || | 459 | ((strcmp(".rela.l2.text", secstrings + sechdrs[i].sh_name) == 0) || |
460 | (strcmp(".rela.l1.text", secstrings + sechdrs[i].sh_name) == 0) || | ||
415 | ((strcmp(".rela.text", secstrings + sechdrs[i].sh_name) == 0) && | 461 | ((strcmp(".rela.text", secstrings + sechdrs[i].sh_name) == 0) && |
416 | (hdr->e_flags & FLG_CODE_IN_L1)))) { | 462 | (hdr->e_flags & (EF_BFIN_CODE_IN_L1|EF_BFIN_CODE_IN_L2))))) { |
417 | apply_relocate_add((Elf_Shdr *) sechdrs, strtab, | 463 | apply_relocate_add((Elf_Shdr *) sechdrs, strtab, |
418 | symindex, i, mod); | 464 | symindex, i, mod); |
419 | } | 465 | } |
@@ -423,14 +469,12 @@ module_finalize(const Elf_Ehdr * hdr, | |||
423 | 469 | ||
424 | void module_arch_cleanup(struct module *mod) | 470 | void module_arch_cleanup(struct module *mod) |
425 | { | 471 | { |
426 | if (mod->arch.text_l1) | 472 | l1_inst_sram_free(mod->arch.text_l1); |
427 | l1_inst_sram_free((void *)mod->arch.text_l1); | 473 | l1_data_A_sram_free(mod->arch.data_a_l1); |
428 | if (mod->arch.data_a_l1) | 474 | l1_data_A_sram_free(mod->arch.bss_a_l1); |
429 | l1_data_sram_free((void *)mod->arch.data_a_l1); | 475 | l1_data_B_sram_free(mod->arch.data_b_l1); |
430 | if (mod->arch.bss_a_l1) | 476 | l1_data_B_sram_free(mod->arch.bss_b_l1); |
431 | l1_data_sram_free((void *)mod->arch.bss_a_l1); | 477 | l2_sram_free(mod->arch.text_l2); |
432 | if (mod->arch.data_b_l1) | 478 | l2_sram_free(mod->arch.data_l2); |
433 | l1_data_B_sram_free((void *)mod->arch.data_b_l1); | 479 | l2_sram_free(mod->arch.bss_l2); |
434 | if (mod->arch.bss_b_l1) | ||
435 | l1_data_B_sram_free((void *)mod->arch.bss_b_l1); | ||
436 | } | 480 | } |