Efiemu stylistic fixes and gettext.
* grub-core/efiemu/i386/loadcore32.c (grub_arch_efiemu_relocate_symbols32): Avoid set in if. * grub-core/efiemu/i386/loadcore64.c (grub_arch_efiemu_relocate_symbols64): Likewise. * grub-core/efiemu/i386/pc/cfgtables.c (grub_machine_efiemu_init_tables): Likewise. * grub-core/efiemu/loadcore.c (grub_efiemu_resolve_symbols): Likewise. (grub_efiemu_loadcore_initXX): Add a filename argument. All users updated. Improved error message. * grub-core/efiemu/loadcore_common.c (grub_efiemu_loadcore_init): Add a filename argument. All users updated. * grub-core/efiemu/symbols.c (grub_efiemu_set_virtual_address_map): Reclassify double relocation as GRUB_ERR_BUG.
This commit is contained in:
parent
306fc0741f
commit
0331e102c9
9 changed files with 102 additions and 45 deletions
20
ChangeLog
20
ChangeLog
|
@ -1,3 +1,23 @@
|
||||||
|
2012-02-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Efiemu stylistic fixes and gettext.
|
||||||
|
|
||||||
|
* grub-core/efiemu/i386/loadcore32.c
|
||||||
|
(grub_arch_efiemu_relocate_symbols32): Avoid set in if.
|
||||||
|
* grub-core/efiemu/i386/loadcore64.c
|
||||||
|
(grub_arch_efiemu_relocate_symbols64): Likewise.
|
||||||
|
* grub-core/efiemu/i386/pc/cfgtables.c
|
||||||
|
(grub_machine_efiemu_init_tables): Likewise.
|
||||||
|
* grub-core/efiemu/loadcore.c (grub_efiemu_resolve_symbols): Likewise.
|
||||||
|
(grub_efiemu_loadcore_initXX): Add a filename argument.
|
||||||
|
All users updated.
|
||||||
|
Improved error message.
|
||||||
|
* grub-core/efiemu/loadcore_common.c (grub_efiemu_loadcore_init):
|
||||||
|
Add a filename argument.
|
||||||
|
All users updated.
|
||||||
|
* grub-core/efiemu/symbols.c (grub_efiemu_set_virtual_address_map):
|
||||||
|
Reclassify double relocation as GRUB_ERR_BUG.
|
||||||
|
|
||||||
2012-02-12 Vladimir Serbinenko <phcoder@gmail.com>
|
2012-02-12 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/commands/i386/pc/play.c (grub_cmd_play): Improve error
|
* grub-core/commands/i386/pc/play.c (grub_cmd_play): Improve error
|
||||||
|
|
|
@ -87,18 +87,23 @@ grub_arch_efiemu_relocate_symbols32 (grub_efiemu_segment_t segs,
|
||||||
switch (ELF32_R_TYPE (rel->r_info))
|
switch (ELF32_R_TYPE (rel->r_info))
|
||||||
{
|
{
|
||||||
case R_386_32:
|
case R_386_32:
|
||||||
if ((err = grub_efiemu_write_value
|
err = grub_efiemu_write_value (addr, sym.off + *addr,
|
||||||
(addr, sym.off + *addr, sym.handle, 0,
|
sym.handle, 0,
|
||||||
seg->ptv_rel_needed, sizeof (grub_uint32_t))))
|
seg->ptv_rel_needed,
|
||||||
|
sizeof (grub_uint32_t));
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_386_PC32:
|
case R_386_PC32:
|
||||||
if ((err = grub_efiemu_write_value
|
err = grub_efiemu_write_value (addr, sym.off + *addr
|
||||||
(addr, sym.off + *addr - rel->r_offset
|
- rel->r_offset
|
||||||
- seg->off, sym.handle, seg->handle,
|
- seg->off, sym.handle,
|
||||||
seg->ptv_rel_needed, sizeof (grub_uint32_t))))
|
seg->handle,
|
||||||
|
seg->ptv_rel_needed,
|
||||||
|
sizeof (grub_uint32_t));
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -88,25 +88,35 @@ grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs,
|
||||||
switch (ELF64_R_TYPE (rel->r_info))
|
switch (ELF64_R_TYPE (rel->r_info))
|
||||||
{
|
{
|
||||||
case R_X86_64_64:
|
case R_X86_64_64:
|
||||||
if ((err = grub_efiemu_write_value
|
err = grub_efiemu_write_value (addr,
|
||||||
(addr, *addr64 + rel->r_addend + sym.off, sym.handle,
|
*addr64 + rel->r_addend
|
||||||
0, seg->ptv_rel_needed, sizeof (grub_uint64_t))))
|
+ sym.off, sym.handle,
|
||||||
|
0, seg->ptv_rel_needed,
|
||||||
|
sizeof (grub_uint64_t));
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_X86_64_PC32:
|
case R_X86_64_PC32:
|
||||||
if ((err = grub_efiemu_write_value
|
err = grub_efiemu_write_value (addr,
|
||||||
(addr, *addr32 + rel->r_addend + sym.off
|
*addr32 + rel->r_addend
|
||||||
- rel->r_offset - seg->off, sym.handle, seg->handle,
|
+ sym.off
|
||||||
seg->ptv_rel_needed, sizeof (grub_uint32_t))))
|
- rel->r_offset - seg->off,
|
||||||
|
sym.handle, seg->handle,
|
||||||
|
seg->ptv_rel_needed,
|
||||||
|
sizeof (grub_uint32_t));
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_X86_64_32:
|
case R_X86_64_32:
|
||||||
case R_X86_64_32S:
|
case R_X86_64_32S:
|
||||||
if ((err = grub_efiemu_write_value
|
err = grub_efiemu_write_value (addr,
|
||||||
(addr, *addr32 + rel->r_addend + sym.off, sym.handle,
|
*addr32 + rel->r_addend
|
||||||
0, seg->ptv_rel_needed, sizeof (grub_uint32_t))))
|
+ sym.off, sym.handle,
|
||||||
|
0, seg->ptv_rel_needed,
|
||||||
|
sizeof (grub_uint32_t));
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -67,7 +67,8 @@ grub_machine_efiemu_init_tables (void)
|
||||||
if (ptr < (grub_uint8_t *) 0x100000)
|
if (ptr < (grub_uint8_t *) 0x100000)
|
||||||
{
|
{
|
||||||
grub_dprintf ("efiemu", "Registering SMBIOS\n");
|
grub_dprintf ("efiemu", "Registering SMBIOS\n");
|
||||||
if ((err = grub_efiemu_register_configuration_table (smbios, 0, 0, ptr)))
|
err = grub_efiemu_register_configuration_table (smbios, 0, 0, ptr);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -257,7 +257,8 @@ grub_efiemu_resolve_symbols (grub_efiemu_segment_t segs, Elf_Ehdr *e)
|
||||||
/* Resolve a global symbol. */
|
/* Resolve a global symbol. */
|
||||||
if (sym->st_name != 0 && sym->st_shndx == 0)
|
if (sym->st_name != 0 && sym->st_shndx == 0)
|
||||||
{
|
{
|
||||||
if ((err = grub_efiemu_resolve_symbol (name, &handle, &off)))
|
err = grub_efiemu_resolve_symbol (name, &handle, &off);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
grub_efiemu_elfsyms[i].handle = handle;
|
grub_efiemu_elfsyms[i].handle = handle;
|
||||||
grub_efiemu_elfsyms[i].off = off;
|
grub_efiemu_elfsyms[i].off = off;
|
||||||
|
@ -267,34 +268,43 @@ grub_efiemu_resolve_symbols (grub_efiemu_segment_t segs, Elf_Ehdr *e)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STT_OBJECT:
|
case STT_OBJECT:
|
||||||
if ((err = grub_efiemu_get_section_addr
|
err = grub_efiemu_get_section_addr (segs, sym->st_shndx,
|
||||||
(segs, sym->st_shndx, &handle, &off)))
|
&handle, &off);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
off += sym->st_value;
|
off += sym->st_value;
|
||||||
if (bind != STB_LOCAL)
|
if (bind != STB_LOCAL)
|
||||||
if ((err = grub_efiemu_register_symbol (name, handle, off)))
|
{
|
||||||
|
err = grub_efiemu_register_symbol (name, handle, off);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
}
|
||||||
grub_efiemu_elfsyms[i].handle = handle;
|
grub_efiemu_elfsyms[i].handle = handle;
|
||||||
grub_efiemu_elfsyms[i].off = off;
|
grub_efiemu_elfsyms[i].off = off;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STT_FUNC:
|
case STT_FUNC:
|
||||||
if ((err = grub_efiemu_get_section_addr
|
err = grub_efiemu_get_section_addr (segs, sym->st_shndx,
|
||||||
(segs, sym->st_shndx, &handle, &off)))
|
&handle, &off);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
off += sym->st_value;
|
off += sym->st_value;
|
||||||
if (bind != STB_LOCAL)
|
if (bind != STB_LOCAL)
|
||||||
if ((err = grub_efiemu_register_symbol (name, handle, off)))
|
{
|
||||||
|
err = grub_efiemu_register_symbol (name, handle, off);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
}
|
||||||
grub_efiemu_elfsyms[i].handle = handle;
|
grub_efiemu_elfsyms[i].handle = handle;
|
||||||
grub_efiemu_elfsyms[i].off = off;
|
grub_efiemu_elfsyms[i].off = off;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STT_SECTION:
|
case STT_SECTION:
|
||||||
if ((err = grub_efiemu_get_section_addr
|
err = grub_efiemu_get_section_addr (segs, sym->st_shndx,
|
||||||
(segs, sym->st_shndx, &handle, &off)))
|
&handle, &off);
|
||||||
|
if (err)
|
||||||
{
|
{
|
||||||
grub_efiemu_elfsyms[i].handle = 0;
|
grub_efiemu_elfsyms[i].handle = 0;
|
||||||
grub_efiemu_elfsyms[i].off = 0;
|
grub_efiemu_elfsyms[i].off = 0;
|
||||||
|
@ -322,7 +332,8 @@ grub_efiemu_resolve_symbols (grub_efiemu_segment_t segs, Elf_Ehdr *e)
|
||||||
|
|
||||||
/* Load runtime to the memory and request memory for definitive location*/
|
/* Load runtime to the memory and request memory for definitive location*/
|
||||||
grub_err_t
|
grub_err_t
|
||||||
SUFFIX (grub_efiemu_loadcore_init) (void *core, grub_size_t core_size,
|
SUFFIX (grub_efiemu_loadcore_init) (void *core, const char *filename,
|
||||||
|
grub_size_t core_size,
|
||||||
grub_efiemu_segment_t *segments)
|
grub_efiemu_segment_t *segments)
|
||||||
{
|
{
|
||||||
Elf_Ehdr *e = (Elf_Ehdr *) core;
|
Elf_Ehdr *e = (Elf_Ehdr *) core;
|
||||||
|
@ -333,11 +344,14 @@ SUFFIX (grub_efiemu_loadcore_init) (void *core, grub_size_t core_size,
|
||||||
|
|
||||||
/* Make sure that every section is within the core. */
|
/* Make sure that every section is within the core. */
|
||||||
if ((grub_size_t) core_size < e->e_shoff + e->e_shentsize * e->e_shnum)
|
if ((grub_size_t) core_size < e->e_shoff + e->e_shentsize * e->e_shnum)
|
||||||
return grub_error (GRUB_ERR_BAD_OS, "ELF sections outside core");
|
return grub_error (GRUB_ERR_BAD_OS, N_("premature end of file %s"),
|
||||||
|
filename);
|
||||||
|
|
||||||
if ((err = grub_efiemu_init_segments (segments, core)))
|
err = grub_efiemu_init_segments (segments, core);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
if ((err = grub_efiemu_count_symbols (core)))
|
err = grub_efiemu_count_symbols (core);
|
||||||
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
grub_efiemu_request_symbols (1);
|
grub_efiemu_request_symbols (1);
|
||||||
|
|
|
@ -111,7 +111,8 @@ grub_efiemu_loadcore_unload(void)
|
||||||
|
|
||||||
/* Load runtime file and do some initial preparations */
|
/* Load runtime file and do some initial preparations */
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_efiemu_loadcore_init (grub_file_t file)
|
grub_efiemu_loadcore_init (grub_file_t file,
|
||||||
|
const char *filename)
|
||||||
{
|
{
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
|
|
||||||
|
@ -140,7 +141,8 @@ grub_efiemu_loadcore_init (grub_file_t file)
|
||||||
switch (grub_efiemu_mode)
|
switch (grub_efiemu_mode)
|
||||||
{
|
{
|
||||||
case GRUB_EFIEMU32:
|
case GRUB_EFIEMU32:
|
||||||
err = grub_efiemu_loadcore_init32 (efiemu_core, efiemu_core_size,
|
err = grub_efiemu_loadcore_init32 (efiemu_core, filename,
|
||||||
|
efiemu_core_size,
|
||||||
&efiemu_segments);
|
&efiemu_segments);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
|
@ -152,7 +154,8 @@ grub_efiemu_loadcore_init (grub_file_t file)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GRUB_EFIEMU64:
|
case GRUB_EFIEMU64:
|
||||||
err = grub_efiemu_loadcore_init64 (efiemu_core, efiemu_core_size,
|
err = grub_efiemu_loadcore_init64 (efiemu_core, filename,
|
||||||
|
efiemu_core_size,
|
||||||
&efiemu_segments);
|
&efiemu_segments);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
|
|
|
@ -201,7 +201,7 @@ grub_efiemu_load_file (const char *filename)
|
||||||
|
|
||||||
grub_dprintf ("efiemu", "mm initialized\n");
|
grub_dprintf ("efiemu", "mm initialized\n");
|
||||||
|
|
||||||
err = grub_efiemu_loadcore_init (file);
|
err = grub_efiemu_loadcore_init (file, filename);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
grub_file_close (file);
|
grub_file_close (file);
|
||||||
|
|
|
@ -223,7 +223,7 @@ grub_efiemu_set_virtual_address_map (grub_efi_uintn_t memory_map_size,
|
||||||
|
|
||||||
/* Ensure that we are called only once */
|
/* Ensure that we are called only once */
|
||||||
if (*ptv_relocated)
|
if (*ptv_relocated)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "EfiEmu is already relocated");
|
return grub_error (GRUB_ERR_BUG, "EfiEmu is already relocated");
|
||||||
*ptv_relocated = 1;
|
*ptv_relocated = 1;
|
||||||
|
|
||||||
/* Correct addresses using information supplied by grub */
|
/* Correct addresses using information supplied by grub */
|
||||||
|
|
|
@ -152,9 +152,12 @@ struct grub_efiemu_elf_sym
|
||||||
|
|
||||||
int grub_efiemu_check_header32 (void *ehdr, grub_size_t size);
|
int grub_efiemu_check_header32 (void *ehdr, grub_size_t size);
|
||||||
int grub_efiemu_check_header64 (void *ehdr, grub_size_t size);
|
int grub_efiemu_check_header64 (void *ehdr, grub_size_t size);
|
||||||
grub_err_t grub_efiemu_loadcore_init32 (void *core, grub_size_t core_size,
|
grub_err_t grub_efiemu_loadcore_init32 (void *core,
|
||||||
|
const char *filename,
|
||||||
|
grub_size_t core_size,
|
||||||
grub_efiemu_segment_t *segments);
|
grub_efiemu_segment_t *segments);
|
||||||
grub_err_t grub_efiemu_loadcore_init64 (void *core, grub_size_t core_size,
|
grub_err_t grub_efiemu_loadcore_init64 (void *core, const char *filename,
|
||||||
|
grub_size_t core_size,
|
||||||
grub_efiemu_segment_t *segments);
|
grub_efiemu_segment_t *segments);
|
||||||
grub_err_t grub_efiemu_loadcore_load32 (void *core,
|
grub_err_t grub_efiemu_loadcore_load32 (void *core,
|
||||||
grub_size_t core_size,
|
grub_size_t core_size,
|
||||||
|
@ -165,7 +168,8 @@ grub_err_t grub_efiemu_loadcore_load64 (void *core,
|
||||||
grub_err_t grub_efiemu_loadcore_unload32 (void);
|
grub_err_t grub_efiemu_loadcore_unload32 (void);
|
||||||
grub_err_t grub_efiemu_loadcore_unload64 (void);
|
grub_err_t grub_efiemu_loadcore_unload64 (void);
|
||||||
grub_err_t grub_efiemu_loadcore_unload(void);
|
grub_err_t grub_efiemu_loadcore_unload(void);
|
||||||
grub_err_t grub_efiemu_loadcore_init (grub_file_t file);
|
grub_err_t grub_efiemu_loadcore_init (grub_file_t file,
|
||||||
|
const char *filename);
|
||||||
grub_err_t grub_efiemu_loadcore_load (void);
|
grub_err_t grub_efiemu_loadcore_load (void);
|
||||||
|
|
||||||
/* Configuration tables manipulation. Definitions and functions */
|
/* Configuration tables manipulation. Definitions and functions */
|
||||||
|
|
Loading…
Reference in a new issue