507 |
grub_dl_flush_cache (grub_dl_t mod) |
grub_dl_flush_cache (grub_dl_t mod) |
508 |
{ |
{ |
509 |
grub_dl_segment_t seg; |
grub_dl_segment_t seg; |
510 |
|
|
511 |
for (seg = mod->segment; seg; seg = seg->next) |
for (seg = mod->segment; seg; seg = seg->next) { |
512 |
grub_arch_sync_caches (seg->addr, seg->size); |
if (seg->size) { |
513 |
|
grub_dprintf ("modules", "flushing 0x%x bytes at %p\n", seg->size, |
514 |
|
seg->addr); |
515 |
|
grub_arch_sync_caches (seg->addr, seg->size); |
516 |
|
} |
517 |
|
} |
518 |
} |
} |
519 |
|
|
520 |
/* Load a module from core memory. */ |
/* Load a module from core memory. */ |
523 |
{ |
{ |
524 |
Elf_Ehdr *e; |
Elf_Ehdr *e; |
525 |
grub_dl_t mod; |
grub_dl_t mod; |
526 |
|
|
527 |
|
grub_dprintf ("modules", "module at %p, size 0x%x\n", addr, size); |
528 |
e = addr; |
e = addr; |
529 |
if (grub_dl_check_header (e, size)) |
if (grub_dl_check_header (e, size)) |
530 |
return 0; |
return 0; |
531 |
|
|
532 |
if (e->e_type != ET_REL) |
if (e->e_type != ET_REL) |
533 |
{ |
{ |
534 |
grub_error (GRUB_ERR_BAD_MODULE, "invalid ELF file type"); |
grub_error (GRUB_ERR_BAD_MODULE, "invalid ELF file type"); |
553 |
mod->init = 0; |
mod->init = 0; |
554 |
mod->fini = 0; |
mod->fini = 0; |
555 |
|
|
556 |
|
grub_dprintf ("modules", "relocating to %p\n", mod); |
557 |
if (grub_dl_resolve_name (mod, e) |
if (grub_dl_resolve_name (mod, e) |
558 |
|| grub_dl_resolve_dependencies (mod, e) |
|| grub_dl_resolve_dependencies (mod, e) |
559 |
|| grub_dl_load_segments (mod, e) |
|| grub_dl_load_segments (mod, e) |
566 |
} |
} |
567 |
|
|
568 |
grub_dl_flush_cache (mod); |
grub_dl_flush_cache (mod); |
569 |
|
|
570 |
|
grub_dprintf ("modules", "module name: %s\n", mod->name); |
571 |
|
grub_dprintf ("modules", "init function: %p\n", mod->init); |
572 |
grub_dl_call_init (mod); |
grub_dl_call_init (mod); |
573 |
|
|
574 |
if (grub_dl_add (mod)) |
if (grub_dl_add (mod)) |
575 |
{ |
{ |
576 |
grub_dl_unload (mod); |
grub_dl_unload (mod); |
577 |
return 0; |
return 0; |
578 |
} |
} |
579 |
|
|
580 |
return mod; |
return mod; |
581 |
} |
} |
582 |
|
|