remove all trailing whitespace
This commit is contained in:
parent
d2d4966571
commit
b39f9d20a9
222 changed files with 3286 additions and 3286 deletions
|
@ -38,7 +38,7 @@ grub_arch_efiemu_check_header32 (void *ehdr)
|
|||
|
||||
/* Relocate symbols. */
|
||||
grub_err_t
|
||||
grub_arch_efiemu_relocate_symbols32 (grub_efiemu_segment_t segs,
|
||||
grub_arch_efiemu_relocate_symbols32 (grub_efiemu_segment_t segs,
|
||||
struct grub_efiemu_elf_sym *elfsyms,
|
||||
void *ehdr)
|
||||
{
|
||||
|
@ -66,7 +66,7 @@ grub_arch_efiemu_relocate_symbols32 (grub_efiemu_segment_t segs,
|
|||
if (seg)
|
||||
{
|
||||
Elf32_Rel *rel, *max;
|
||||
|
||||
|
||||
for (rel = (Elf32_Rel *) ((char *) e + s->sh_offset),
|
||||
max = rel + s->sh_size / s->sh_entsize;
|
||||
rel < max;
|
||||
|
@ -77,31 +77,31 @@ grub_arch_efiemu_relocate_symbols32 (grub_efiemu_segment_t segs,
|
|||
if (seg->size < rel->r_offset)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
"reloc offset is out of the segment");
|
||||
|
||||
addr = (Elf32_Word *)
|
||||
((char *) grub_efiemu_mm_obtain_request (seg->handle)
|
||||
|
||||
addr = (Elf32_Word *)
|
||||
((char *) grub_efiemu_mm_obtain_request (seg->handle)
|
||||
+ seg->off + rel->r_offset);
|
||||
sym = elfsyms[ELF32_R_SYM (rel->r_info)];
|
||||
|
||||
|
||||
switch (ELF32_R_TYPE (rel->r_info))
|
||||
{
|
||||
case R_386_32:
|
||||
if ((err = grub_efiemu_write_value
|
||||
(addr, sym.off + *addr, sym.handle, 0,
|
||||
if ((err = grub_efiemu_write_value
|
||||
(addr, sym.off + *addr, sym.handle, 0,
|
||||
seg->ptv_rel_needed, sizeof (grub_uint32_t))))
|
||||
return err;
|
||||
|
||||
|
||||
break;
|
||||
|
||||
case R_386_PC32:
|
||||
if ((err = grub_efiemu_write_value
|
||||
(addr, sym.off + *addr - rel->r_offset
|
||||
- seg->off, sym.handle, seg->handle,
|
||||
(addr, sym.off + *addr - rel->r_offset
|
||||
- seg->off, sym.handle, seg->handle,
|
||||
seg->ptv_rel_needed, sizeof (grub_uint32_t))))
|
||||
return err;
|
||||
break;
|
||||
default:
|
||||
return grub_error (GRUB_ERR_BAD_OS,
|
||||
return grub_error (GRUB_ERR_BAD_OS,
|
||||
"unrecognised relocation");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ grub_arch_efiemu_check_header64 (void *ehdr)
|
|||
|
||||
/* Relocate symbols. */
|
||||
grub_err_t
|
||||
grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs,
|
||||
grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs,
|
||||
struct grub_efiemu_elf_sym *elfsyms,
|
||||
void *ehdr)
|
||||
{
|
||||
|
@ -62,9 +62,9 @@ grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs,
|
|||
if (seg)
|
||||
{
|
||||
Elf64_Rela *rel, *max;
|
||||
|
||||
|
||||
for (rel = (Elf64_Rela *) ((char *) e + s->sh_offset),
|
||||
max = rel + (unsigned long) s->sh_size
|
||||
max = rel + (unsigned long) s->sh_size
|
||||
/ (unsigned long)s->sh_entsize;
|
||||
rel < max;
|
||||
rel++)
|
||||
|
@ -76,40 +76,40 @@ grub_arch_efiemu_relocate_symbols64 (grub_efiemu_segment_t segs,
|
|||
if (seg->size < rel->r_offset)
|
||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||
"reloc offset is out of the segment");
|
||||
|
||||
|
||||
addr =
|
||||
((char *) grub_efiemu_mm_obtain_request (seg->handle)
|
||||
((char *) grub_efiemu_mm_obtain_request (seg->handle)
|
||||
+ seg->off + rel->r_offset);
|
||||
addr32 = (grub_uint32_t *) addr;
|
||||
addr64 = (grub_uint64_t *) addr;
|
||||
sym = elfsyms[ELF64_R_SYM (rel->r_info)];
|
||||
|
||||
|
||||
switch (ELF64_R_TYPE (rel->r_info))
|
||||
{
|
||||
case R_X86_64_64:
|
||||
if ((err = grub_efiemu_write_value
|
||||
(addr, *addr64 + rel->r_addend + sym.off, sym.handle,
|
||||
if ((err = grub_efiemu_write_value
|
||||
(addr, *addr64 + rel->r_addend + sym.off, sym.handle,
|
||||
0, seg->ptv_rel_needed, sizeof (grub_uint64_t))))
|
||||
return err;
|
||||
break;
|
||||
|
||||
case R_X86_64_PC32:
|
||||
if ((err = grub_efiemu_write_value
|
||||
(addr, *addr32 + rel->r_addend + sym.off
|
||||
- rel->r_offset - seg->off, sym.handle, seg->handle,
|
||||
(addr, *addr32 + rel->r_addend + sym.off
|
||||
- rel->r_offset - seg->off, sym.handle, seg->handle,
|
||||
seg->ptv_rel_needed, sizeof (grub_uint32_t))))
|
||||
return err;
|
||||
break;
|
||||
|
||||
case R_X86_64_32:
|
||||
case R_X86_64_32S:
|
||||
if ((err = grub_efiemu_write_value
|
||||
(addr, *addr32 + rel->r_addend + sym.off, sym.handle,
|
||||
if ((err = grub_efiemu_write_value
|
||||
(addr, *addr32 + rel->r_addend + sym.off, sym.handle,
|
||||
0, seg->ptv_rel_needed, sizeof (grub_uint32_t))))
|
||||
return err;
|
||||
break;
|
||||
default:
|
||||
return grub_error (GRUB_ERR_BAD_OS,
|
||||
return grub_error (GRUB_ERR_BAD_OS,
|
||||
"unrecognised relocation");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@ grub_machine_efiemu_init_tables ()
|
|||
return err;
|
||||
}
|
||||
|
||||
for (ptr = (grub_uint8_t *) 0xf0000; ptr < (grub_uint8_t *) 0x100000;
|
||||
for (ptr = (grub_uint8_t *) 0xf0000; ptr < (grub_uint8_t *) 0x100000;
|
||||
ptr += 16)
|
||||
if (grub_memcmp (ptr, "_SM_", 4) == 0
|
||||
&& grub_byte_checksum (ptr, *(ptr + 5)) == 0)
|
||||
|
|
|
@ -40,7 +40,7 @@ grub_efiemu_get_section_addr (grub_efiemu_segment_t segs, unsigned n,
|
|||
if (seg->section == n)
|
||||
{
|
||||
*handle = seg->handle;
|
||||
*off = seg->off;
|
||||
*off = seg->off;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,7 @@ grub_efiemu_load_segments (grub_efiemu_segment_t segs, const Elf_Ehdr *e)
|
|||
grub_efiemu_segment_t cur;
|
||||
|
||||
grub_dprintf ("efiemu", "loading segments\n");
|
||||
|
||||
|
||||
for (cur=segs; cur; cur = cur->next)
|
||||
{
|
||||
s = (Elf_Shdr *)cur->srcptr;
|
||||
|
@ -94,10 +94,10 @@ grub_efiemu_load_segments (grub_efiemu_segment_t segs, const Elf_Ehdr *e)
|
|||
if ((s->sh_flags & SHF_ALLOC) && s->sh_size)
|
||||
{
|
||||
void *addr;
|
||||
|
||||
addr = (grub_uint8_t *) grub_efiemu_mm_obtain_request (cur->handle)
|
||||
|
||||
addr = (grub_uint8_t *) grub_efiemu_mm_obtain_request (cur->handle)
|
||||
+ cur->off;
|
||||
|
||||
|
||||
switch (s->sh_type)
|
||||
{
|
||||
case SHT_PROGBITS:
|
||||
|
@ -145,11 +145,11 @@ grub_efiemu_init_segments (grub_efiemu_segment_t *segs, const Elf_Ehdr *e)
|
|||
seg = (grub_efiemu_segment_t) grub_malloc (sizeof (*seg));
|
||||
if (! seg)
|
||||
return grub_errno;
|
||||
|
||||
|
||||
if (s->sh_size)
|
||||
{
|
||||
seg->handle
|
||||
= grub_efiemu_request_memalign
|
||||
seg->handle
|
||||
= grub_efiemu_request_memalign
|
||||
(s->sh_addralign, s->sh_size,
|
||||
s->sh_flags & SHF_EXECINSTR ? GRUB_EFI_RUNTIME_SERVICES_CODE
|
||||
: GRUB_EFI_RUNTIME_SERVICES_DATA);
|
||||
|
@ -157,12 +157,12 @@ grub_efiemu_init_segments (grub_efiemu_segment_t *segs, const Elf_Ehdr *e)
|
|||
return grub_errno;
|
||||
seg->off = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
/*
|
||||
.text-physical doesn't need to be relocated when switching to
|
||||
virtual mode
|
||||
*/
|
||||
if (!grub_strcmp (grub_efiemu_get_string (s->sh_name, e),
|
||||
if (!grub_strcmp (grub_efiemu_get_string (s->sh_name, e),
|
||||
".text-physical"))
|
||||
seg->ptv_rel_needed = 0;
|
||||
else
|
||||
|
@ -174,7 +174,7 @@ grub_efiemu_init_segments (grub_efiemu_segment_t *segs, const Elf_Ehdr *e)
|
|||
*segs = seg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
@ -185,7 +185,7 @@ grub_efiemu_count_symbols (const Elf_Ehdr *e)
|
|||
unsigned i;
|
||||
Elf_Shdr *s;
|
||||
int num = 0;
|
||||
|
||||
|
||||
/* Symbols */
|
||||
for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff);
|
||||
i < e->e_shnum;
|
||||
|
@ -197,7 +197,7 @@ grub_efiemu_count_symbols (const Elf_Ehdr *e)
|
|||
return grub_error (GRUB_ERR_BAD_OS, "no symbol table");
|
||||
|
||||
grub_efiemu_nelfsyms = (unsigned) s->sh_size / (unsigned) s->sh_entsize;
|
||||
grub_efiemu_elfsyms = (struct grub_efiemu_elf_sym *)
|
||||
grub_efiemu_elfsyms = (struct grub_efiemu_elf_sym *)
|
||||
grub_malloc (sizeof (struct grub_efiemu_elf_sym) * grub_efiemu_nelfsyms);
|
||||
|
||||
/* Relocators */
|
||||
|
@ -221,7 +221,7 @@ grub_efiemu_resolve_symbols (grub_efiemu_segment_t segs, Elf_Ehdr *e)
|
|||
Elf_Sym *sym;
|
||||
const char *str;
|
||||
Elf_Word size, entsize;
|
||||
|
||||
|
||||
grub_dprintf ("efiemu", "resolving symbols\n");
|
||||
|
||||
for (i = 0, s = (Elf_Shdr *) ((char *) e + e->e_shoff);
|
||||
|
@ -267,7 +267,7 @@ grub_efiemu_resolve_symbols (grub_efiemu_segment_t segs, Elf_Ehdr *e)
|
|||
break;
|
||||
|
||||
case STT_OBJECT:
|
||||
if ((err = grub_efiemu_get_section_addr
|
||||
if ((err = grub_efiemu_get_section_addr
|
||||
(segs, sym->st_shndx, &handle, &off)))
|
||||
return err;
|
||||
|
||||
|
@ -280,7 +280,7 @@ grub_efiemu_resolve_symbols (grub_efiemu_segment_t segs, Elf_Ehdr *e)
|
|||
break;
|
||||
|
||||
case STT_FUNC:
|
||||
if ((err = grub_efiemu_get_section_addr
|
||||
if ((err = grub_efiemu_get_section_addr
|
||||
(segs, sym->st_shndx, &handle, &off)))
|
||||
return err;
|
||||
|
||||
|
@ -293,12 +293,12 @@ grub_efiemu_resolve_symbols (grub_efiemu_segment_t segs, Elf_Ehdr *e)
|
|||
break;
|
||||
|
||||
case STT_SECTION:
|
||||
if ((err = grub_efiemu_get_section_addr
|
||||
if ((err = grub_efiemu_get_section_addr
|
||||
(segs, sym->st_shndx, &handle, &off)))
|
||||
{
|
||||
grub_efiemu_elfsyms[i].handle = 0;
|
||||
grub_efiemu_elfsyms[i].off = 0;
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -346,8 +346,8 @@ SUFFIX (grub_efiemu_loadcore_init) (void *core, grub_size_t core_size,
|
|||
|
||||
/* Load runtime definitively */
|
||||
grub_err_t
|
||||
SUFFIX (grub_efiemu_loadcore_load) (void *core,
|
||||
grub_size_t core_size
|
||||
SUFFIX (grub_efiemu_loadcore_load) (void *core,
|
||||
grub_size_t core_size
|
||||
__attribute__ ((unused)),
|
||||
grub_efiemu_segment_t segments)
|
||||
{
|
||||
|
@ -356,10 +356,10 @@ SUFFIX (grub_efiemu_loadcore_load) (void *core,
|
|||
return err;
|
||||
if ((err = grub_efiemu_resolve_symbols (segments, core)))
|
||||
return err;
|
||||
if ((err = SUFFIX (grub_arch_efiemu_relocate_symbols) (segments,
|
||||
if ((err = SUFFIX (grub_arch_efiemu_relocate_symbols) (segments,
|
||||
grub_efiemu_elfsyms,
|
||||
core)))
|
||||
return err;
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ grub_efiemu_sizeof_uintn_t (void)
|
|||
|
||||
/* Check the header and set mode */
|
||||
static grub_err_t
|
||||
grub_efiemu_check_header (void *ehdr, grub_size_t size,
|
||||
grub_efiemu_check_header (void *ehdr, grub_size_t size,
|
||||
grub_efiemu_mode_t *mode)
|
||||
{
|
||||
/* Check the magic numbers. */
|
||||
|
@ -91,7 +91,7 @@ grub_efiemu_loadcore_unload(void)
|
|||
case GRUB_EFIEMU64:
|
||||
grub_efiemu_loadcore_unload64 ();
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ grub_efiemu_loadcore_unload(void)
|
|||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Load runtime file and do some initial preparations */
|
||||
/* Load runtime file and do some initial preparations */
|
||||
grub_err_t
|
||||
grub_efiemu_loadcore_init (grub_file_t file)
|
||||
{
|
||||
|
@ -121,7 +121,7 @@ grub_efiemu_loadcore_init (grub_file_t file)
|
|||
if (! efiemu_core)
|
||||
return grub_errno;
|
||||
|
||||
if (grub_file_read (file, efiemu_core, efiemu_core_size)
|
||||
if (grub_file_read (file, efiemu_core, efiemu_core_size)
|
||||
!= (int) efiemu_core_size)
|
||||
{
|
||||
grub_free (efiemu_core);
|
||||
|
@ -129,7 +129,7 @@ grub_efiemu_loadcore_init (grub_file_t file)
|
|||
return grub_errno;
|
||||
}
|
||||
|
||||
if (grub_efiemu_check_header (efiemu_core, efiemu_core_size,
|
||||
if (grub_efiemu_check_header (efiemu_core, efiemu_core_size,
|
||||
&grub_efiemu_mode))
|
||||
{
|
||||
grub_free (efiemu_core);
|
||||
|
@ -160,7 +160,7 @@ grub_efiemu_loadcore_init (grub_file_t file)
|
|||
return err;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
return grub_error (GRUB_ERR_BAD_OS, "unknown EFI runtime");
|
||||
}
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
*/
|
||||
|
||||
/* This is an emulation of EFI runtime services.
|
||||
This allows a more uniform boot on i386 machines.
|
||||
As it emulates only runtime service it isn't able
|
||||
This allows a more uniform boot on i386 machines.
|
||||
As it emulates only runtime service it isn't able
|
||||
to chainload EFI bootloader on non-EFI system. */
|
||||
|
||||
|
||||
|
@ -112,7 +112,7 @@ grub_efiemu_unregister_configuration_table (grub_efi_guid_t guid)
|
|||
|
||||
grub_err_t
|
||||
grub_efiemu_register_prepare_hook (grub_err_t (*hook) (void *data),
|
||||
void (*unload) (void *data),
|
||||
void (*unload) (void *data),
|
||||
void *data)
|
||||
{
|
||||
struct grub_efiemu_prepare_hook *nhook;
|
||||
|
@ -129,20 +129,20 @@ grub_efiemu_register_prepare_hook (grub_err_t (*hook) (void *data),
|
|||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Register a configuration table either supplying the address directly
|
||||
/* Register a configuration table either supplying the address directly
|
||||
or with a hook
|
||||
*/
|
||||
grub_err_t
|
||||
grub_efiemu_register_configuration_table (grub_efi_guid_t guid,
|
||||
grub_efiemu_register_configuration_table (grub_efi_guid_t guid,
|
||||
void * (*get_table) (void *data),
|
||||
void (*unload) (void *data),
|
||||
void (*unload) (void *data),
|
||||
void *data)
|
||||
{
|
||||
struct grub_efiemu_configuration_table *tbl;
|
||||
grub_err_t err;
|
||||
|
||||
|
||||
if (! get_table && ! data)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
"you must set at least get_table or data");
|
||||
if ((err = grub_efiemu_unregister_configuration_table (guid)))
|
||||
return err;
|
||||
|
@ -163,7 +163,7 @@ grub_efiemu_register_configuration_table (grub_efi_guid_t guid,
|
|||
|
||||
static grub_err_t
|
||||
grub_cmd_efiemu_unload (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc __attribute__ ((unused)),
|
||||
int argc __attribute__ ((unused)),
|
||||
char *args[] __attribute__ ((unused)))
|
||||
{
|
||||
return grub_efiemu_unload ();
|
||||
|
@ -171,7 +171,7 @@ grub_cmd_efiemu_unload (grub_command_t cmd __attribute__ ((unused)),
|
|||
|
||||
static grub_err_t
|
||||
grub_cmd_efiemu_prepare (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc __attribute__ ((unused)),
|
||||
int argc __attribute__ ((unused)),
|
||||
char *args[] __attribute__ ((unused)))
|
||||
{
|
||||
return grub_efiemu_prepare ();
|
||||
|
@ -180,15 +180,15 @@ grub_cmd_efiemu_prepare (grub_command_t cmd __attribute__ ((unused)),
|
|||
|
||||
|
||||
|
||||
int
|
||||
grub_efiemu_exit_boot_services (grub_efi_uintn_t map_key
|
||||
int
|
||||
grub_efiemu_exit_boot_services (grub_efi_uintn_t map_key
|
||||
__attribute__ ((unused)))
|
||||
{
|
||||
/* Nothing to do here yet */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
int
|
||||
grub_efiemu_finish_boot_services (void)
|
||||
{
|
||||
/* Nothing to do here yet */
|
||||
|
@ -201,11 +201,11 @@ grub_efiemu_load_file (const char *filename)
|
|||
{
|
||||
grub_file_t file;
|
||||
grub_err_t err;
|
||||
|
||||
|
||||
file = grub_file_open (filename);
|
||||
if (! file)
|
||||
return 0;
|
||||
|
||||
|
||||
err = grub_efiemu_mm_init ();
|
||||
if (err)
|
||||
{
|
||||
|
@ -244,19 +244,19 @@ grub_efiemu_autocore (void)
|
|||
return GRUB_ERR_NONE;
|
||||
|
||||
prefix = grub_env_get ("prefix");
|
||||
|
||||
|
||||
if (! prefix)
|
||||
return grub_error (GRUB_ERR_FILE_NOT_FOUND,
|
||||
return grub_error (GRUB_ERR_FILE_NOT_FOUND,
|
||||
"couldn't find efiemu core because prefix "
|
||||
"isn't set");
|
||||
|
||||
|
||||
suffix = grub_efiemu_get_default_core_name ();
|
||||
|
||||
|
||||
filename = grub_malloc (grub_strlen (prefix) + grub_strlen (suffix) + 2);
|
||||
if (! filename)
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
"couldn't allocate temporary space");
|
||||
|
||||
|
||||
grub_sprintf (filename, "%s/%s", prefix, suffix);
|
||||
|
||||
err = grub_efiemu_load_file (filename);
|
||||
|
@ -277,7 +277,7 @@ grub_efiemu_prepare (void)
|
|||
{
|
||||
grub_err_t err;
|
||||
|
||||
grub_dprintf ("efiemu", "Preparing %d-bit efiemu\n",
|
||||
grub_dprintf ("efiemu", "Preparing %d-bit efiemu\n",
|
||||
8 * grub_efiemu_sizeof_uintn_t ());
|
||||
|
||||
err = grub_efiemu_autocore ();
|
||||
|
@ -321,16 +321,16 @@ grub_efiemu_pnvram_cmd_register (void);
|
|||
|
||||
GRUB_MOD_INIT(efiemu)
|
||||
{
|
||||
cmd_loadcore = grub_register_command ("efiemu_loadcore",
|
||||
grub_cmd_efiemu_load,
|
||||
"efiemu_loadcore FILE",
|
||||
cmd_loadcore = grub_register_command ("efiemu_loadcore",
|
||||
grub_cmd_efiemu_load,
|
||||
"efiemu_loadcore FILE",
|
||||
"Load and initialize EFI emulator");
|
||||
cmd_prepare = grub_register_command ("efiemu_prepare",
|
||||
grub_cmd_efiemu_prepare,
|
||||
"efiemu_prepare",
|
||||
cmd_prepare = grub_register_command ("efiemu_prepare",
|
||||
grub_cmd_efiemu_prepare,
|
||||
"efiemu_prepare",
|
||||
"Finalize loading of EFI emulator");
|
||||
cmd_unload = grub_register_command ("efiemu_unload", grub_cmd_efiemu_unload,
|
||||
"efiemu_unload",
|
||||
cmd_unload = grub_register_command ("efiemu_unload", grub_cmd_efiemu_unload,
|
||||
"efiemu_unload",
|
||||
"Unload EFI emulator");
|
||||
grub_efiemu_pnvram_cmd_register ();
|
||||
}
|
||||
|
|
114
efiemu/mm.c
114
efiemu/mm.c
|
@ -17,10 +17,10 @@
|
|||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/*
|
||||
To keep efiemu runtime contiguous this mm is special.
|
||||
To keep efiemu runtime contiguous this mm is special.
|
||||
It uses deferred allocation.
|
||||
In the first stage you may request memory with grub_efiemu_request_memalign
|
||||
It will give you a handle with which in the second phase you can access your
|
||||
It will give you a handle with which in the second phase you can access your
|
||||
memory with grub_efiemu_mm_obtain_request (handle). It's guaranteed that
|
||||
subsequent calls with the same handle return the same result. You can't request any additional memory once you're in the second phase
|
||||
*/
|
||||
|
@ -32,7 +32,7 @@
|
|||
#include <grub/machine/memory.h>
|
||||
#include <grub/efiemu/efiemu.h>
|
||||
|
||||
struct grub_efiemu_memrequest
|
||||
struct grub_efiemu_memrequest
|
||||
{
|
||||
struct grub_efiemu_memrequest *next;
|
||||
grub_efi_memory_type_t type;
|
||||
|
@ -54,7 +54,7 @@ static int mmap_reserved_size = 0, mmap_num = 0;
|
|||
|
||||
/* Add a memory region to map*/
|
||||
static grub_err_t
|
||||
grub_efiemu_add_to_mmap (grub_uint64_t start, grub_uint64_t size,
|
||||
grub_efiemu_add_to_mmap (grub_uint64_t start, grub_uint64_t size,
|
||||
grub_efi_memory_type_t type)
|
||||
{
|
||||
grub_uint64_t page_start, npages;
|
||||
|
@ -63,10 +63,10 @@ grub_efiemu_add_to_mmap (grub_uint64_t start, grub_uint64_t size,
|
|||
if (mmap_num >= mmap_reserved_size)
|
||||
{
|
||||
efiemu_mmap = (grub_efi_memory_descriptor_t *)
|
||||
grub_realloc (efiemu_mmap, (++mmap_reserved_size)
|
||||
grub_realloc (efiemu_mmap, (++mmap_reserved_size)
|
||||
* sizeof (grub_efi_memory_descriptor_t));
|
||||
if (!efiemu_mmap)
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
"Not enough space for memory map");
|
||||
}
|
||||
|
||||
|
@ -74,9 +74,9 @@ grub_efiemu_add_to_mmap (grub_uint64_t start, grub_uint64_t size,
|
|||
page_start = start - (start % GRUB_EFIEMU_PAGESIZE);
|
||||
npages = (size + (start % GRUB_EFIEMU_PAGESIZE) + GRUB_EFIEMU_PAGESIZE - 1)
|
||||
/ GRUB_EFIEMU_PAGESIZE;
|
||||
efiemu_mmap[mmap_num].physical_start = page_start;
|
||||
efiemu_mmap[mmap_num].virtual_start = page_start;
|
||||
efiemu_mmap[mmap_num].num_pages = npages;
|
||||
efiemu_mmap[mmap_num].physical_start = page_start;
|
||||
efiemu_mmap[mmap_num].virtual_start = page_start;
|
||||
efiemu_mmap[mmap_num].num_pages = npages;
|
||||
efiemu_mmap[mmap_num].type = type;
|
||||
mmap_num++;
|
||||
|
||||
|
@ -84,11 +84,11 @@ grub_efiemu_add_to_mmap (grub_uint64_t start, grub_uint64_t size,
|
|||
}
|
||||
|
||||
/* Request a resident memory of type TYPE of size SIZE aligned at ALIGN
|
||||
ALIGN must be a divisor of page size (if it's a divisor of 4096
|
||||
ALIGN must be a divisor of page size (if it's a divisor of 4096
|
||||
it should be ok on all platforms)
|
||||
*/
|
||||
int
|
||||
grub_efiemu_request_memalign (grub_size_t align, grub_size_t size,
|
||||
grub_efiemu_request_memalign (grub_size_t align, grub_size_t size,
|
||||
grub_efi_memory_type_t type)
|
||||
{
|
||||
grub_size_t align_overhead;
|
||||
|
@ -113,8 +113,8 @@ grub_efiemu_request_memalign (grub_size_t align, grub_size_t size,
|
|||
ret->val = 0;
|
||||
ret->next = 0;
|
||||
prev = 0;
|
||||
|
||||
/* Add request to the end of the chain.
|
||||
|
||||
/* Add request to the end of the chain.
|
||||
It should be at the end because otherwise alignment isn't guaranteed */
|
||||
for (cur = memrequests; cur; prev = cur, cur = cur->next);
|
||||
if (prev)
|
||||
|
@ -155,20 +155,20 @@ efiemu_alloc_requests (void)
|
|||
GRUB_EFI_RUNTIME_SERVICES_CODE,
|
||||
GRUB_EFI_RUNTIME_SERVICES_DATA,
|
||||
GRUB_EFI_ACPI_MEMORY_NVS,
|
||||
|
||||
/* And then unavailable memory types. This is more for a completeness.
|
||||
|
||||
/* And then unavailable memory types. This is more for a completeness.
|
||||
You should double think before allocating memory of any of these types
|
||||
*/
|
||||
GRUB_EFI_UNUSABLE_MEMORY,
|
||||
GRUB_EFI_MEMORY_MAPPED_IO,
|
||||
GRUB_EFI_MEMORY_MAPPED_IO_PORT_SPACE,
|
||||
GRUB_EFI_PAL_CODE
|
||||
GRUB_EFI_PAL_CODE
|
||||
};
|
||||
|
||||
/* Compute total memory needed */
|
||||
for (i = 0; i < sizeof (reqorder) / sizeof (reqorder[0]); i++)
|
||||
{
|
||||
align_overhead = GRUB_EFIEMU_PAGESIZE
|
||||
align_overhead = GRUB_EFIEMU_PAGESIZE
|
||||
- (requested_memory[reqorder[i]] % GRUB_EFIEMU_PAGESIZE);
|
||||
if (align_overhead == GRUB_EFIEMU_PAGESIZE)
|
||||
align_overhead = 0;
|
||||
|
@ -178,7 +178,7 @@ efiemu_alloc_requests (void)
|
|||
/* Allocate the whole memory in one block */
|
||||
resident_memory = grub_memalign (GRUB_EFIEMU_PAGESIZE, total_alloc);
|
||||
if (!resident_memory)
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
"couldn't allocate resident memory");
|
||||
|
||||
/* Split the memory into blocks by type */
|
||||
|
@ -199,14 +199,14 @@ efiemu_alloc_requests (void)
|
|||
}
|
||||
|
||||
/* Ensure that the regions are page-aligned */
|
||||
align_overhead = GRUB_EFIEMU_PAGESIZE
|
||||
align_overhead = GRUB_EFIEMU_PAGESIZE
|
||||
- (requested_memory[reqorder[i]] % GRUB_EFIEMU_PAGESIZE);
|
||||
if (align_overhead == GRUB_EFIEMU_PAGESIZE)
|
||||
align_overhead = 0;
|
||||
curptr = ((grub_uint8_t *)curptr) + align_overhead;
|
||||
|
||||
|
||||
/* Add the region to memory map */
|
||||
grub_efiemu_add_to_mmap (PTR_TO_UINT64 (typestart),
|
||||
grub_efiemu_add_to_mmap (PTR_TO_UINT64 (typestart),
|
||||
curptr - typestart, reqorder[i]);
|
||||
}
|
||||
|
||||
|
@ -270,7 +270,7 @@ grub_efiemu_mm_return_request (int handle)
|
|||
static grub_err_t
|
||||
grub_efiemu_mmap_init (void)
|
||||
{
|
||||
auto int NESTED_FUNC_ATTR bounds_hook (grub_uint64_t, grub_uint64_t,
|
||||
auto int NESTED_FUNC_ATTR bounds_hook (grub_uint64_t, grub_uint64_t,
|
||||
grub_uint32_t);
|
||||
int NESTED_FUNC_ATTR bounds_hook (grub_uint64_t addr __attribute__ ((unused)),
|
||||
grub_uint64_t size __attribute__ ((unused)),
|
||||
|
@ -302,7 +302,7 @@ grub_efiemu_get_memory_map (grub_efi_uintn_t *memory_map_size,
|
|||
{
|
||||
if (!efiemu_mmap)
|
||||
{
|
||||
grub_error (GRUB_ERR_INVALID_COMMAND,
|
||||
grub_error (GRUB_ERR_INVALID_COMMAND,
|
||||
"you need to first launch efiemu_prepare");
|
||||
return -1;
|
||||
}
|
||||
|
@ -373,26 +373,26 @@ grub_efiemu_mmap_fill (void)
|
|||
switch (type)
|
||||
{
|
||||
case GRUB_MACHINE_MEMORY_AVAILABLE:
|
||||
return grub_efiemu_add_to_mmap (addr, size,
|
||||
return grub_efiemu_add_to_mmap (addr, size,
|
||||
GRUB_EFI_CONVENTIONAL_MEMORY);
|
||||
|
||||
#ifdef GRUB_MACHINE_MEMORY_ACPI
|
||||
case GRUB_MACHINE_MEMORY_ACPI:
|
||||
return grub_efiemu_add_to_mmap (addr, size,
|
||||
return grub_efiemu_add_to_mmap (addr, size,
|
||||
GRUB_EFI_ACPI_RECLAIM_MEMORY);
|
||||
#endif
|
||||
|
||||
#ifdef GRUB_MACHINE_MEMORY_NVS
|
||||
case GRUB_MACHINE_MEMORY_NVS:
|
||||
return grub_efiemu_add_to_mmap (addr, size,
|
||||
return grub_efiemu_add_to_mmap (addr, size,
|
||||
GRUB_EFI_ACPI_MEMORY_NVS);
|
||||
#endif
|
||||
|
||||
default:
|
||||
grub_printf ("Unknown memory type %d. Marking as unusable\n", type);
|
||||
case GRUB_MACHINE_MEMORY_RESERVED:
|
||||
return grub_efiemu_add_to_mmap (addr, size,
|
||||
GRUB_EFI_UNUSABLE_MEMORY);
|
||||
return grub_efiemu_add_to_mmap (addr, size,
|
||||
GRUB_EFI_UNUSABLE_MEMORY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -404,8 +404,8 @@ grub_efiemu_mmap_fill (void)
|
|||
}
|
||||
|
||||
grub_err_t
|
||||
grub_efiemu_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t,
|
||||
grub_uint64_t,
|
||||
grub_efiemu_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t,
|
||||
grub_uint64_t,
|
||||
grub_uint32_t))
|
||||
{
|
||||
unsigned i;
|
||||
|
@ -414,10 +414,10 @@ grub_efiemu_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t,
|
|||
switch (efiemu_mmap[i].type)
|
||||
{
|
||||
case GRUB_EFI_RUNTIME_SERVICES_CODE:
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
GRUB_EFIEMU_MEMORY_CODE);
|
||||
break;
|
||||
|
||||
|
||||
case GRUB_EFI_RESERVED_MEMORY_TYPE:
|
||||
case GRUB_EFI_RUNTIME_SERVICES_DATA:
|
||||
case GRUB_EFI_UNUSABLE_MEMORY:
|
||||
|
@ -425,30 +425,30 @@ grub_efiemu_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t,
|
|||
case GRUB_EFI_MEMORY_MAPPED_IO_PORT_SPACE:
|
||||
case GRUB_EFI_PAL_CODE:
|
||||
case GRUB_EFI_MAX_MEMORY_TYPE:
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
GRUB_EFIEMU_MEMORY_RESERVED);
|
||||
break;
|
||||
|
||||
|
||||
case GRUB_EFI_LOADER_CODE:
|
||||
case GRUB_EFI_LOADER_DATA:
|
||||
case GRUB_EFI_BOOT_SERVICES_CODE:
|
||||
case GRUB_EFI_BOOT_SERVICES_DATA:
|
||||
case GRUB_EFI_CONVENTIONAL_MEMORY:
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
GRUB_EFIEMU_MEMORY_AVAILABLE);
|
||||
break;
|
||||
|
||||
|
||||
case GRUB_EFI_ACPI_RECLAIM_MEMORY:
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
GRUB_EFIEMU_MEMORY_ACPI);
|
||||
break;
|
||||
|
||||
|
||||
case GRUB_EFI_ACPI_MEMORY_NVS:
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
hook (efiemu_mmap[i].physical_start, efiemu_mmap[i].num_pages * 4096,
|
||||
GRUB_EFIEMU_MEMORY_NVS);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -459,8 +459,8 @@ grub_efiemu_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t,
|
|||
static grub_err_t
|
||||
grub_efiemu_mmap_sort_and_uniq (void)
|
||||
{
|
||||
/* If same page is used by multiple types it's resolved
|
||||
according to priority
|
||||
/* If same page is used by multiple types it's resolved
|
||||
according to priority
|
||||
0 - free memory
|
||||
1 - memory immediately usable after ExitBootServices
|
||||
2 - memory usable after loading ACPI tables
|
||||
|
@ -512,20 +512,20 @@ grub_efiemu_mmap_sort_and_uniq (void)
|
|||
|
||||
/* Initialize variables*/
|
||||
grub_memset (present, 0, sizeof (int) * GRUB_EFI_MAX_MEMORY_TYPE);
|
||||
scanline_events = (struct grub_efiemu_mmap_scan *)
|
||||
scanline_events = (struct grub_efiemu_mmap_scan *)
|
||||
grub_malloc (sizeof (struct grub_efiemu_mmap_scan) * 2 * mmap_num);
|
||||
|
||||
/* Number of chunks can't increase more than by factor of 2 */
|
||||
result = (grub_efi_memory_descriptor_t *)
|
||||
result = (grub_efi_memory_descriptor_t *)
|
||||
grub_malloc (sizeof (grub_efi_memory_descriptor_t) * 2 * mmap_num);
|
||||
if (!result || !scanline_events)
|
||||
{
|
||||
grub_free (result);
|
||||
grub_free (scanline_events);
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
"couldn't allocate space for new memory map");
|
||||
}
|
||||
|
||||
|
||||
/* Register scanline events */
|
||||
for (i = 0; i < mmap_num; i++)
|
||||
{
|
||||
|
@ -538,8 +538,8 @@ grub_efiemu_mmap_sort_and_uniq (void)
|
|||
scanline_events[2 * i + 1].memtype = efiemu_mmap[i].type;
|
||||
}
|
||||
|
||||
/* Primitive bubble sort. It has complexity O(n^2) but since we're
|
||||
unlikely to have more than 100 chunks it's probably one of the
|
||||
/* Primitive bubble sort. It has complexity O(n^2) but since we're
|
||||
unlikely to have more than 100 chunks it's probably one of the
|
||||
fastest for one purpose */
|
||||
done = 1;
|
||||
while (done)
|
||||
|
@ -574,29 +574,29 @@ grub_efiemu_mmap_sort_and_uniq (void)
|
|||
curtype = k;
|
||||
|
||||
/* Add memory region to resulting map if necessary */
|
||||
if ((curtype == -1 || curtype != lasttype)
|
||||
if ((curtype == -1 || curtype != lasttype)
|
||||
&& lastaddr != scanline_events[i].pos
|
||||
&& lasttype != -1)
|
||||
{
|
||||
result[j].virtual_start = result[j].physical_start = lastaddr;
|
||||
result[j].num_pages = (scanline_events[i].pos - lastaddr)
|
||||
result[j].num_pages = (scanline_events[i].pos - lastaddr)
|
||||
/ GRUB_EFIEMU_PAGESIZE;
|
||||
result[j].type = lasttype;
|
||||
|
||||
/* We set runtime attribute on pages we need to be mapped */
|
||||
result[j].attribute
|
||||
result[j].attribute
|
||||
= (lasttype == GRUB_EFI_RUNTIME_SERVICES_CODE
|
||||
|| lasttype == GRUB_EFI_RUNTIME_SERVICES_DATA)
|
||||
? GRUB_EFI_MEMORY_RUNTIME : 0;
|
||||
grub_dprintf ("efiemu",
|
||||
"mmap entry: type %d start 0x%llx 0x%llx pages\n",
|
||||
grub_dprintf ("efiemu",
|
||||
"mmap entry: type %d start 0x%llx 0x%llx pages\n",
|
||||
result[j].type,
|
||||
result[j].physical_start, result[j].num_pages);
|
||||
j++;
|
||||
}
|
||||
|
||||
/* Update last values if necessary */
|
||||
if (curtype == -1 || curtype != lasttype)
|
||||
if (curtype == -1 || curtype != lasttype)
|
||||
{
|
||||
lasttype = curtype;
|
||||
lastaddr = scanline_events[i].pos;
|
||||
|
@ -605,7 +605,7 @@ grub_efiemu_mmap_sort_and_uniq (void)
|
|||
|
||||
grub_free (scanline_events);
|
||||
|
||||
/* Shrink resulting memory map to really used size and replace efiemu_mmap
|
||||
/* Shrink resulting memory map to really used size and replace efiemu_mmap
|
||||
by new value */
|
||||
grub_free (efiemu_mmap);
|
||||
efiemu_mmap = grub_realloc (result, j * sizeof (*result));
|
||||
|
@ -619,7 +619,7 @@ grub_efiemu_mm_do_alloc (void)
|
|||
grub_err_t err;
|
||||
|
||||
/* Preallocate mmap */
|
||||
efiemu_mmap = (grub_efi_memory_descriptor_t *)
|
||||
efiemu_mmap = (grub_efi_memory_descriptor_t *)
|
||||
grub_malloc (mmap_reserved_size * sizeof (grub_efi_memory_descriptor_t));
|
||||
if (!efiemu_mmap)
|
||||
{
|
||||
|
@ -632,4 +632,4 @@ grub_efiemu_mm_do_alloc (void)
|
|||
if ((err = grub_efiemu_mmap_fill ()))
|
||||
return err;
|
||||
return grub_efiemu_mmap_sort_and_uniq ();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,13 +45,13 @@ static grub_uint32_t accuracy;
|
|||
static const struct grub_arg_option options[] = {
|
||||
{"size", 's', 0, "number of bytes to reserve for pseudo NVRAM", 0,
|
||||
ARG_TYPE_INT},
|
||||
{"high-monotonic-count", 'm', 0,
|
||||
{"high-monotonic-count", 'm', 0,
|
||||
"Initial value of high monotonic count", 0, ARG_TYPE_INT},
|
||||
{"timezone", 't', 0,
|
||||
{"timezone", 't', 0,
|
||||
"Timezone, offset in minutes from GMT", 0, ARG_TYPE_INT},
|
||||
{"accuracy", 'a', 0,
|
||||
{"accuracy", 'a', 0,
|
||||
"Accuracy of clock, in 1e-12 units", 0, ARG_TYPE_INT},
|
||||
{"daylight", 'd', 0,
|
||||
{"daylight", 'd', 0,
|
||||
"Daylight value, as per EFI specifications", 0, ARG_TYPE_INT},
|
||||
{0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
@ -68,14 +68,14 @@ grub_strtosl (char *arg, char **end, int base)
|
|||
/* Export stuff for efiemu */
|
||||
static grub_err_t
|
||||
nvram_set (void * data __attribute__ ((unused)))
|
||||
{
|
||||
{
|
||||
/* Take definitive pointers */
|
||||
grub_uint8_t *nvram_def = grub_efiemu_mm_obtain_request (nvram_handle);
|
||||
grub_uint32_t *nvramsize_def
|
||||
grub_uint32_t *nvramsize_def
|
||||
= grub_efiemu_mm_obtain_request (nvramsize_handle);
|
||||
grub_uint32_t *high_monotonic_count_def
|
||||
= grub_efiemu_mm_obtain_request (high_monotonic_count_handle);
|
||||
grub_int16_t *timezone_def
|
||||
grub_int16_t *timezone_def
|
||||
= grub_efiemu_mm_obtain_request (timezone_handle);
|
||||
grub_uint8_t *daylight_def
|
||||
= grub_efiemu_mm_obtain_request (daylight_handle);
|
||||
|
@ -94,11 +94,11 @@ nvram_set (void * data __attribute__ ((unused)))
|
|||
/* Register symbols */
|
||||
grub_efiemu_register_symbol ("efiemu_variables", nvram_handle, 0);
|
||||
grub_efiemu_register_symbol ("efiemu_varsize", nvramsize_handle, 0);
|
||||
grub_efiemu_register_symbol ("efiemu_high_monotonic_count",
|
||||
grub_efiemu_register_symbol ("efiemu_high_monotonic_count",
|
||||
high_monotonic_count_handle, 0);
|
||||
grub_efiemu_register_symbol ("efiemu_time_zone", timezone_handle, 0);
|
||||
grub_efiemu_register_symbol ("efiemu_time_daylight", daylight_handle, 0);
|
||||
grub_efiemu_register_symbol ("efiemu_time_accuracy",
|
||||
grub_efiemu_register_symbol ("efiemu_time_accuracy",
|
||||
accuracy_handle, 0);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
@ -134,7 +134,7 @@ read_pnvram (char *filename)
|
|||
struct efi_variable *efivar;
|
||||
grub_size_t guidlen, datalen;
|
||||
unsigned i, j;
|
||||
|
||||
|
||||
file = grub_file_open (filename);
|
||||
if (!file)
|
||||
return grub_error (GRUB_ERR_BAD_OS, "couldn't read pnvram");
|
||||
|
@ -157,17 +157,17 @@ read_pnvram (char *filename)
|
|||
|
||||
efivar = (struct efi_variable *) nvramptr;
|
||||
if (nvramptr - nvram + sizeof (struct efi_variable) > nvramsize)
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
"file is too large for reserved variable space");
|
||||
|
||||
nvramptr += sizeof (struct efi_variable);
|
||||
|
||||
/* look ahow long guid field is*/
|
||||
guidlen = 0;
|
||||
for (ptr2 = ptr; (grub_isspace (*ptr2)
|
||||
guidlen = 0;
|
||||
for (ptr2 = ptr; (grub_isspace (*ptr2)
|
||||
|| (*ptr2 >= '0' && *ptr2 <= '9')
|
||||
|| (*ptr2 >= 'a' && *ptr2 <= 'f')
|
||||
|| (*ptr2 >= 'A' && *ptr2 <= 'F'));
|
||||
|| (*ptr2 >= 'A' && *ptr2 <= 'F'));
|
||||
ptr2++)
|
||||
if (!grub_isspace (*ptr2))
|
||||
guidlen++;
|
||||
|
@ -175,7 +175,7 @@ read_pnvram (char *filename)
|
|||
|
||||
/* Read guid */
|
||||
if (guidlen != sizeof (efivar->guid))
|
||||
{
|
||||
{
|
||||
grub_free (buf);
|
||||
return grub_error (GRUB_ERR_BAD_OS, "can't parse %s", filename);
|
||||
}
|
||||
|
@ -190,14 +190,14 @@ read_pnvram (char *filename)
|
|||
hex = *ptr - 'a' + 10;
|
||||
if (*ptr >= 'A' && *ptr <= 'F')
|
||||
hex = *ptr - 'A' + 10;
|
||||
|
||||
|
||||
if (i%2 == 0)
|
||||
((grub_uint8_t *)&(efivar->guid))[i/2] = hex << 4;
|
||||
else
|
||||
((grub_uint8_t *)&(efivar->guid))[i/2] |= hex;
|
||||
ptr++;
|
||||
}
|
||||
|
||||
|
||||
while (grub_isspace (*ptr))
|
||||
ptr++;
|
||||
if (*ptr != ':')
|
||||
|
@ -230,23 +230,23 @@ read_pnvram (char *filename)
|
|||
{
|
||||
/* Look the length */
|
||||
datalen = 0;
|
||||
for (ptr2 = ptr; *ptr2 && (grub_isspace (*ptr2)
|
||||
for (ptr2 = ptr; *ptr2 && (grub_isspace (*ptr2)
|
||||
|| (*ptr2 >= '0' && *ptr2 <= '9')
|
||||
|| (*ptr2 >= 'a' && *ptr2 <= 'f')
|
||||
|| (*ptr2 >= 'A' && *ptr2 <= 'F'));
|
||||
|| (*ptr2 >= 'A' && *ptr2 <= 'F'));
|
||||
ptr2++)
|
||||
if (!grub_isspace (*ptr2))
|
||||
datalen++;
|
||||
datalen /= 2;
|
||||
|
||||
|
||||
if (nvramptr - nvram + datalen > nvramsize)
|
||||
{
|
||||
grub_free (buf);
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
"file is too large for reserved "
|
||||
" variable space");
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < 2 * datalen; i++)
|
||||
{
|
||||
int hex = 0;
|
||||
|
@ -258,7 +258,7 @@ read_pnvram (char *filename)
|
|||
hex = *ptr - 'a' + 10;
|
||||
if (*ptr >= 'A' && *ptr <= 'F')
|
||||
hex = *ptr - 'A' + 10;
|
||||
|
||||
|
||||
if (i%2 == 0)
|
||||
nvramptr[i/2] = hex << 4;
|
||||
else
|
||||
|
@ -278,7 +278,7 @@ read_pnvram (char *filename)
|
|||
efivar->size = datalen;
|
||||
else
|
||||
efivar->namelen = datalen;
|
||||
|
||||
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
|
@ -304,23 +304,23 @@ grub_efiemu_make_nvram (void)
|
|||
grub_free (nvram);
|
||||
return err;
|
||||
}
|
||||
nvram_handle
|
||||
= grub_efiemu_request_memalign (1, nvramsize,
|
||||
nvram_handle
|
||||
= grub_efiemu_request_memalign (1, nvramsize,
|
||||
GRUB_EFI_RUNTIME_SERVICES_DATA);
|
||||
nvramsize_handle
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint32_t),
|
||||
nvramsize_handle
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint32_t),
|
||||
GRUB_EFI_RUNTIME_SERVICES_DATA);
|
||||
high_monotonic_count_handle
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint32_t),
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint32_t),
|
||||
GRUB_EFI_RUNTIME_SERVICES_DATA);
|
||||
timezone_handle
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint16_t),
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint16_t),
|
||||
GRUB_EFI_RUNTIME_SERVICES_DATA);
|
||||
daylight_handle
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint8_t),
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint8_t),
|
||||
GRUB_EFI_RUNTIME_SERVICES_DATA);
|
||||
accuracy_handle
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint32_t),
|
||||
= grub_efiemu_request_memalign (1, sizeof (grub_uint32_t),
|
||||
GRUB_EFI_RUNTIME_SERVICES_DATA);
|
||||
|
||||
grub_efiemu_request_symbols (6);
|
||||
|
@ -341,7 +341,7 @@ grub_efiemu_pnvram (void)
|
|||
|
||||
nvram = grub_malloc (nvramsize);
|
||||
if (!nvram)
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
"Couldn't allocate space for temporary pnvram storage");
|
||||
grub_memset (nvram, 0, nvramsize);
|
||||
|
||||
|
@ -360,16 +360,16 @@ grub_cmd_efiemu_pnvram (struct grub_extcmd *cmd,
|
|||
|
||||
nvramsize = state[0].set ? grub_strtoul (state[0].arg, 0, 0) : 2048;
|
||||
high_monotonic_count = state[1].set ? grub_strtoul (state[1].arg, 0, 0) : 1;
|
||||
timezone = state[2].set ? grub_strtosl (state[2].arg, 0, 0)
|
||||
timezone = state[2].set ? grub_strtosl (state[2].arg, 0, 0)
|
||||
: GRUB_EFI_UNSPECIFIED_TIMEZONE;
|
||||
accuracy = state[3].set ? grub_strtoul (state[3].arg, 0, 0) : 50000000;
|
||||
daylight = state[4].set ? grub_strtoul (state[4].arg, 0, 0) : 0;
|
||||
|
||||
|
||||
nvram = grub_malloc (nvramsize);
|
||||
if (!nvram)
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
"Couldn't allocate space for temporary pnvram storage");
|
||||
grub_memset (nvram, 0, nvramsize);
|
||||
grub_memset (nvram, 0, nvramsize);
|
||||
|
||||
if (argc == 1 && (err = read_pnvram (args[0])))
|
||||
{
|
||||
|
@ -387,11 +387,11 @@ void grub_efiemu_pnvram_cmd_unregister (void);
|
|||
void
|
||||
grub_efiemu_pnvram_cmd_register (void)
|
||||
{
|
||||
cmd = grub_register_extcmd ("efiemu_pnvram", grub_cmd_efiemu_pnvram,
|
||||
cmd = grub_register_extcmd ("efiemu_pnvram", grub_cmd_efiemu_pnvram,
|
||||
GRUB_COMMAND_FLAG_BOTH,
|
||||
"efiemu_pnvram [FILENAME]",
|
||||
"Initialise pseudo-NVRAM and load variables "
|
||||
"from FILE",
|
||||
"from FILE",
|
||||
options);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Prepare efiemu. E.g. allocate memory, load the runtime
|
||||
/* Prepare efiemu. E.g. allocate memory, load the runtime
|
||||
to appropriate place, etc */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
|
@ -26,7 +26,7 @@
|
|||
|
||||
grub_err_t
|
||||
SUFFIX (grub_efiemu_prepare) (struct grub_efiemu_prepare_hook *prepare_hooks,
|
||||
struct grub_efiemu_configuration_table
|
||||
struct grub_efiemu_configuration_table
|
||||
*config_tables)
|
||||
{
|
||||
grub_err_t err;
|
||||
|
@ -46,8 +46,8 @@ SUFFIX (grub_efiemu_prepare) (struct grub_efiemu_prepare_hook *prepare_hooks,
|
|||
/* Request space for the list of configuration tables */
|
||||
for (cur = config_tables; cur; cur = cur->next)
|
||||
cntconftables++;
|
||||
conftable_handle
|
||||
= grub_efiemu_request_memalign (GRUB_EFIEMU_PAGESIZE,
|
||||
conftable_handle
|
||||
= grub_efiemu_request_memalign (GRUB_EFIEMU_PAGESIZE,
|
||||
cntconftables * sizeof (*conftables),
|
||||
GRUB_EFI_RUNTIME_SERVICES_DATA);
|
||||
|
||||
|
@ -69,31 +69,31 @@ SUFFIX (grub_efiemu_prepare) (struct grub_efiemu_prepare_hook *prepare_hooks,
|
|||
return err;
|
||||
}
|
||||
|
||||
if ((err = grub_efiemu_resolve_symbol ("efiemu_system_table",
|
||||
if ((err = grub_efiemu_resolve_symbol ("efiemu_system_table",
|
||||
&handle, &off)))
|
||||
{
|
||||
grub_efiemu_unload ();
|
||||
return err;
|
||||
}
|
||||
|
||||
SUFFIX (grub_efiemu_system_table)
|
||||
= (TYPE (grub_efi_system_table) *)
|
||||
SUFFIX (grub_efiemu_system_table)
|
||||
= (TYPE (grub_efi_system_table) *)
|
||||
((grub_uint8_t *)grub_efiemu_mm_obtain_request (handle) + off);
|
||||
|
||||
/* compute CRC32 of runtime_services */
|
||||
if ((err = grub_efiemu_resolve_symbol ("efiemu_runtime_services",
|
||||
if ((err = grub_efiemu_resolve_symbol ("efiemu_runtime_services",
|
||||
&handle, &off)))
|
||||
return err;
|
||||
runtime_services = (TYPE (grub_efiemu_runtime_services) *)
|
||||
((grub_uint8_t *)grub_efiemu_mm_obtain_request (handle) + off);
|
||||
runtime_services->hdr.crc32 = 0;
|
||||
runtime_services->hdr.crc32 = grub_getcrc32
|
||||
runtime_services->hdr.crc32 = grub_getcrc32
|
||||
(0, runtime_services, runtime_services->hdr.header_size);
|
||||
|
||||
/* Put pointer to the list of configuration tables in system table */
|
||||
grub_efiemu_write_value
|
||||
(&(SUFFIX (grub_efiemu_system_table)->configuration_table), 0,
|
||||
conftable_handle, 0, 1,
|
||||
(&(SUFFIX (grub_efiemu_system_table)->configuration_table), 0,
|
||||
conftable_handle, 0, 1,
|
||||
sizeof (SUFFIX (grub_efiemu_system_table)->configuration_table));
|
||||
SUFFIX(grub_efiemu_system_table)->num_table_entries = cntconftables;
|
||||
|
||||
|
@ -103,7 +103,7 @@ SUFFIX (grub_efiemu_prepare) (struct grub_efiemu_prepare_hook *prepare_hooks,
|
|||
i = 0;
|
||||
for (cur = config_tables; cur; cur = cur->next, i++)
|
||||
{
|
||||
grub_memcpy (&(conftables[i].vendor_guid), &(cur->guid),
|
||||
grub_memcpy (&(conftables[i].vendor_guid), &(cur->guid),
|
||||
sizeof (cur->guid));
|
||||
if (cur->get_table)
|
||||
conftables[i].vendor_table
|
||||
|
@ -114,13 +114,13 @@ SUFFIX (grub_efiemu_prepare) (struct grub_efiemu_prepare_hook *prepare_hooks,
|
|||
|
||||
/* compute CRC32 of system table */
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.crc32 = 0;
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.crc32
|
||||
= grub_getcrc32 (0, SUFFIX (grub_efiemu_system_table),
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.crc32
|
||||
= grub_getcrc32 (0, SUFFIX (grub_efiemu_system_table),
|
||||
SUFFIX (grub_efiemu_system_table)->hdr.header_size);
|
||||
|
||||
grub_dprintf ("efiemu","system_table = %p, runtime_services = %p,"
|
||||
" conftables = %p (%d entries)\n",
|
||||
SUFFIX (grub_efiemu_system_table), runtime_services,
|
||||
SUFFIX (grub_efiemu_system_table), runtime_services,
|
||||
conftables, cntconftables);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
|
|
@ -29,10 +29,10 @@
|
|||
* %rcx, %rdx, %r8, %r9, 32(%rsp), 40(%rsp), 48(%rsp), ...
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
.file "efiemu.S"
|
||||
.text
|
||||
|
||||
|
||||
FUNCTION (efiemu_get_time)
|
||||
push %rdi
|
||||
push %rsi
|
||||
|
@ -104,7 +104,7 @@ FUNCTION (efiemu_set_variable)
|
|||
mov %rcx, %rdi
|
||||
mov %rdx, %rsi
|
||||
mov %r8, %rdx
|
||||
mov %r9, %rcx
|
||||
mov %r9, %rcx
|
||||
mov 56(%rsp), %r8
|
||||
call efiemu_set_variable_real
|
||||
pop %rsi
|
||||
|
@ -133,8 +133,8 @@ FUNCTION (efiemu_reset_system)
|
|||
ret
|
||||
|
||||
/* The following functions are always called in physical mode */
|
||||
.section ".text-physical", "ax"
|
||||
|
||||
.section ".text-physical", "ax"
|
||||
|
||||
FUNCTION (efiemu_set_virtual_address_map)
|
||||
push %rdi
|
||||
push %rsi
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
*/
|
||||
|
||||
/* This is an emulation of EFI runtime services.
|
||||
This allows a more uniform boot on i386 machines.
|
||||
As it emulates only runtime serviceit isn't able
|
||||
This allows a more uniform boot on i386 machines.
|
||||
As it emulates only runtime serviceit isn't able
|
||||
to chainload EFI bootloader on non-EFI system (TODO) */
|
||||
|
||||
#include <grub/symbol.h>
|
||||
|
@ -26,7 +26,7 @@
|
|||
#include <grub/efi/api.h>
|
||||
#include <grub/efiemu/runtime.h>
|
||||
|
||||
grub_efi_status_t
|
||||
grub_efi_status_t
|
||||
efiemu_get_time (grub_efi_time_t *time,
|
||||
grub_efi_time_capabilities_t *capabilities);
|
||||
grub_efi_status_t
|
||||
|
@ -54,7 +54,7 @@ efiemu_set_virtual_address_map (grub_efi_uintn_t memory_map_size,
|
|||
PHYSICAL_ATTRIBUTE;
|
||||
|
||||
grub_efi_status_t
|
||||
efiemu_convert_pointer (grub_efi_uintn_t debug_disposition,
|
||||
efiemu_convert_pointer (grub_efi_uintn_t debug_disposition,
|
||||
void **address)
|
||||
PHYSICAL_ATTRIBUTE;
|
||||
|
||||
|
@ -84,14 +84,14 @@ efiemu_reset_system (grub_efi_reset_type_t reset_type,
|
|||
grub_efi_uintn_t data_size,
|
||||
grub_efi_char16_t *reset_data);
|
||||
|
||||
grub_efi_status_t
|
||||
grub_efi_status_t
|
||||
EFI_FUNC (efiemu_set_virtual_address_map) (grub_efi_uintn_t,
|
||||
grub_efi_uintn_t,
|
||||
grub_efi_uint32_t,
|
||||
grub_efi_memory_descriptor_t *)
|
||||
PHYSICAL_ATTRIBUTE;
|
||||
grub_efi_status_t
|
||||
EFI_FUNC (efiemu_convert_pointer) (grub_efi_uintn_t debug_disposition,
|
||||
EFI_FUNC (efiemu_convert_pointer) (grub_efi_uintn_t debug_disposition,
|
||||
void **address)
|
||||
PHYSICAL_ATTRIBUTE;
|
||||
static grub_uint32_t
|
||||
|
@ -100,15 +100,15 @@ efiemu_getcrc32 (grub_uint32_t crc, void *buf, int size)
|
|||
static void
|
||||
init_crc32_table (void)
|
||||
PHYSICAL_ATTRIBUTE;
|
||||
static grub_uint32_t
|
||||
static grub_uint32_t
|
||||
reflect (grub_uint32_t ref, int len)
|
||||
PHYSICAL_ATTRIBUTE;
|
||||
|
||||
|
||||
/*
|
||||
The log. It's used when examining memory dump
|
||||
*/
|
||||
*/
|
||||
static grub_uint8_t loge[1000] = "EFIEMULOG";
|
||||
static int logn = 9;
|
||||
static int logn = 9;
|
||||
#define LOG(x) { if (logn<900) loge[logn++]=x; }
|
||||
|
||||
static int ptv_relocated = 0;
|
||||
|
@ -189,7 +189,7 @@ int __stack_chk_fail ()
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* The function that implement runtime services as specified in
|
||||
/* The function that implement runtime services as specified in
|
||||
EFI specification */
|
||||
static inline grub_uint8_t
|
||||
bcd_to_hex (grub_uint8_t in)
|
||||
|
@ -197,7 +197,7 @@ bcd_to_hex (grub_uint8_t in)
|
|||
return 10 * ((in & 0xf0) >> 4) + (in & 0x0f);
|
||||
}
|
||||
|
||||
grub_efi_status_t
|
||||
grub_efi_status_t
|
||||
EFI_FUNC (efiemu_get_time) (grub_efi_time_t *time,
|
||||
grub_efi_time_capabilities_t *capabilities)
|
||||
{
|
||||
|
@ -279,19 +279,19 @@ EFI_FUNC (efiemu_set_wakeup_time) (grub_efi_boolean_t enabled,
|
|||
|
||||
static grub_uint32_t crc32_table [256];
|
||||
|
||||
static grub_uint32_t
|
||||
static grub_uint32_t
|
||||
reflect (grub_uint32_t ref, int len)
|
||||
{
|
||||
grub_uint32_t result = 0;
|
||||
int i;
|
||||
|
||||
|
||||
for (i = 1; i <= len; i++)
|
||||
{
|
||||
if (ref & 1)
|
||||
result |= 1 << (len - i);
|
||||
ref >>= 1;
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -332,7 +332,7 @@ efiemu_getcrc32 (grub_uint32_t crc, void *buf, int size)
|
|||
}
|
||||
|
||||
|
||||
grub_efi_status_t EFI_FUNC
|
||||
grub_efi_status_t EFI_FUNC
|
||||
(efiemu_set_virtual_address_map) (grub_efi_uintn_t memory_map_size,
|
||||
grub_efi_uintn_t descriptor_size,
|
||||
grub_efi_uint32_t descriptor_version,
|
||||
|
@ -341,12 +341,12 @@ grub_efi_status_t EFI_FUNC
|
|||
struct grub_efiemu_ptv_rel *cur_relloc;
|
||||
|
||||
LOG ('e');
|
||||
|
||||
|
||||
/* Ensure that we are called only once */
|
||||
if (ptv_relocated)
|
||||
return GRUB_EFI_UNSUPPORTED;
|
||||
ptv_relocated = 1;
|
||||
|
||||
|
||||
/* Correct addresses using information supplied by grub */
|
||||
for (cur_relloc = efiemu_ptv_relloc; cur_relloc->size;cur_relloc++)
|
||||
{
|
||||
|
@ -354,8 +354,8 @@ grub_efi_status_t EFI_FUNC
|
|||
grub_efi_memory_descriptor_t *descptr;
|
||||
|
||||
/* Compute correction */
|
||||
for (descptr = virtual_map;
|
||||
((grub_uint8_t *) descptr - (grub_uint8_t *) virtual_map)
|
||||
for (descptr = virtual_map;
|
||||
((grub_uint8_t *) descptr - (grub_uint8_t *) virtual_map)
|
||||
< memory_map_size;
|
||||
descptr = (grub_efi_memory_descriptor_t *)
|
||||
((grub_uint8_t *) descptr + descriptor_size))
|
||||
|
@ -386,27 +386,27 @@ grub_efi_status_t EFI_FUNC
|
|||
|
||||
/* Recompute crc32 of system table and runtime services */
|
||||
efiemu_system_table.hdr.crc32 = 0;
|
||||
efiemu_system_table.hdr.crc32 = efiemu_getcrc32
|
||||
efiemu_system_table.hdr.crc32 = efiemu_getcrc32
|
||||
(0, &efiemu_system_table, sizeof (efiemu_system_table));
|
||||
|
||||
efiemu_runtime_services.hdr.crc32 = 0;
|
||||
efiemu_runtime_services.hdr.crc32 = efiemu_getcrc32
|
||||
efiemu_runtime_services.hdr.crc32 = efiemu_getcrc32
|
||||
(0, &efiemu_runtime_services, sizeof (efiemu_runtime_services));
|
||||
|
||||
return GRUB_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/* since efiemu_set_virtual_address_map corrects all the pointers
|
||||
/* since efiemu_set_virtual_address_map corrects all the pointers
|
||||
we don't need efiemu_convert_pointer */
|
||||
grub_efi_status_t
|
||||
EFI_FUNC (efiemu_convert_pointer) (grub_efi_uintn_t debug_disposition,
|
||||
EFI_FUNC (efiemu_convert_pointer) (grub_efi_uintn_t debug_disposition,
|
||||
void **address)
|
||||
{
|
||||
LOG ('f');
|
||||
return GRUB_EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/* Next comes variable services. Because we have no vendor-independent
|
||||
/* Next comes variable services. Because we have no vendor-independent
|
||||
way to store these variables we have no non-volatility */
|
||||
|
||||
/* Find variable by name and GUID. */
|
||||
|
@ -423,7 +423,7 @@ find_variable (grub_efi_guid_t *vendor_guid,
|
|||
if (!efivar->namelen)
|
||||
return 0;
|
||||
if (efiemu_str16equal((grub_efi_char16_t *)(efivar + 1), variable_name)
|
||||
&& efiemu_memequal (&(efivar->guid), vendor_guid,
|
||||
&& efiemu_memequal (&(efivar->guid), vendor_guid,
|
||||
sizeof (efivar->guid)))
|
||||
return efivar;
|
||||
ptr += efivar->namelen + efivar->size + sizeof (*efivar);
|
||||
|
@ -452,11 +452,11 @@ EFI_FUNC (efiemu_get_variable) (grub_efi_char16_t *variable_name,
|
|||
efiemu_memcpy (data, (grub_uint8_t *)(efivar + 1) + efivar->namelen,
|
||||
efivar->size);
|
||||
*attributes = efivar->attributes;
|
||||
|
||||
|
||||
return GRUB_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
grub_efi_status_t EFI_FUNC
|
||||
grub_efi_status_t EFI_FUNC
|
||||
(efiemu_get_next_variable_name) (grub_efi_uintn_t *variable_name_size,
|
||||
grub_efi_char16_t *variable_name,
|
||||
grub_efi_guid_t *vendor_guid)
|
||||
|
@ -471,15 +471,15 @@ grub_efi_status_t EFI_FUNC
|
|||
efivar = find_variable (vendor_guid, variable_name);
|
||||
if (!efivar)
|
||||
return GRUB_EFI_NOT_FOUND;
|
||||
efivar = (struct efi_variable *)((grub_uint8_t *)efivar
|
||||
+ efivar->namelen
|
||||
efivar = (struct efi_variable *)((grub_uint8_t *)efivar
|
||||
+ efivar->namelen
|
||||
+ efivar->size + sizeof (*efivar));
|
||||
}
|
||||
else
|
||||
efivar = (struct efi_variable *) (efiemu_variables);
|
||||
|
||||
LOG ('m');
|
||||
if ((grub_uint8_t *)efivar >= efiemu_variables + efiemu_varsize
|
||||
if ((grub_uint8_t *)efivar >= efiemu_variables + efiemu_varsize
|
||||
|| !efivar->namelen)
|
||||
return GRUB_EFI_NOT_FOUND;
|
||||
if (*variable_name_size < efivar->namelen)
|
||||
|
@ -489,7 +489,7 @@ grub_efi_status_t EFI_FUNC
|
|||
}
|
||||
|
||||
efiemu_memcpy (variable_name, efivar + 1, efivar->namelen);
|
||||
efiemu_memcpy (vendor_guid, &(efivar->guid),
|
||||
efiemu_memcpy (vendor_guid, &(efivar->guid),
|
||||
sizeof (efivar->guid));
|
||||
|
||||
LOG('h');
|
||||
|
@ -513,12 +513,12 @@ EFI_FUNC (efiemu_set_variable) (grub_efi_char16_t *variable_name,
|
|||
/* Delete variable if any */
|
||||
if (efivar)
|
||||
{
|
||||
efiemu_memcpy (efivar, (grub_uint8_t *)(efivar + 1)
|
||||
+ efivar->namelen + efivar->size,
|
||||
efiemu_memcpy (efivar, (grub_uint8_t *)(efivar + 1)
|
||||
+ efivar->namelen + efivar->size,
|
||||
(efiemu_variables + efiemu_varsize)
|
||||
- ((grub_uint8_t *)(efivar + 1)
|
||||
- ((grub_uint8_t *)(efivar + 1)
|
||||
+ efivar->namelen + efivar->size));
|
||||
efiemu_memset (efiemu_variables + efiemu_varsize
|
||||
efiemu_memset (efiemu_variables + efiemu_varsize
|
||||
- (sizeof (*efivar) + efivar->namelen + efivar->size),
|
||||
0, (sizeof (*efivar) + efivar->namelen + efivar->size));
|
||||
}
|
||||
|
@ -533,8 +533,8 @@ EFI_FUNC (efiemu_set_variable) (grub_efi_char16_t *variable_name,
|
|||
if (!efivar->namelen)
|
||||
break;
|
||||
}
|
||||
if ((grub_uint8_t *)(efivar + 1) + data_size
|
||||
+ 2 * (efiemu_str16len (variable_name) + 1)
|
||||
if ((grub_uint8_t *)(efivar + 1) + data_size
|
||||
+ 2 * (efiemu_str16len (variable_name) + 1)
|
||||
>= efiemu_variables + efiemu_varsize)
|
||||
return GRUB_EFI_OUT_OF_RESOURCES;
|
||||
|
||||
|
@ -542,16 +542,16 @@ EFI_FUNC (efiemu_set_variable) (grub_efi_char16_t *variable_name,
|
|||
efivar->namelen = 2 * (efiemu_str16len (variable_name) + 1);
|
||||
efivar->size = data_size;
|
||||
efivar->attributes = attributes;
|
||||
efiemu_memcpy (efivar + 1, variable_name,
|
||||
efiemu_memcpy (efivar + 1, variable_name,
|
||||
2 * (efiemu_str16len (variable_name) + 1));
|
||||
efiemu_memcpy ((grub_uint8_t *)(efivar + 1)
|
||||
+ 2 * (efiemu_str16len (variable_name) + 1),
|
||||
efiemu_memcpy ((grub_uint8_t *)(efivar + 1)
|
||||
+ 2 * (efiemu_str16len (variable_name) + 1),
|
||||
data, data_size);
|
||||
|
||||
return GRUB_EFI_SUCCESS;
|
||||
}
|
||||
|
||||
grub_efi_status_t EFI_FUNC
|
||||
grub_efi_status_t EFI_FUNC
|
||||
(efiemu_get_next_high_monotonic_count) (grub_efi_uint32_t *high_count)
|
||||
{
|
||||
LOG ('j');
|
||||
|
@ -574,9 +574,9 @@ EFI_FUNC (efiemu_reset_system) (grub_efi_reset_type_t reset_type,
|
|||
LOG ('k');
|
||||
}
|
||||
|
||||
struct grub_efi_runtime_services efiemu_runtime_services =
|
||||
struct grub_efi_runtime_services efiemu_runtime_services =
|
||||
{
|
||||
.hdr =
|
||||
.hdr =
|
||||
{
|
||||
.signature = GRUB_EFIEMU_RUNTIME_SERVICES_SIGNATURE,
|
||||
.revision = 0x0001000a,
|
||||
|
@ -596,18 +596,18 @@ struct grub_efi_runtime_services efiemu_runtime_services =
|
|||
.get_next_variable_name = efiemu_get_next_variable_name,
|
||||
.set_variable = efiemu_set_variable,
|
||||
.get_next_high_monotonic_count = efiemu_get_next_high_monotonic_count,
|
||||
|
||||
|
||||
.reset_system = efiemu_reset_system
|
||||
};
|
||||
|
||||
|
||||
static grub_uint16_t efiemu_vendor[] =
|
||||
static grub_uint16_t efiemu_vendor[] =
|
||||
{'G', 'R', 'U', 'B', ' ', 'E', 'F', 'I', ' ',
|
||||
'R', 'U', 'N', 'T', 'I', 'M', 'E', 0};
|
||||
|
||||
struct grub_efi_system_table efiemu_system_table =
|
||||
{
|
||||
.hdr =
|
||||
.hdr =
|
||||
{
|
||||
.signature = GRUB_EFIEMU_SYSTEM_TABLE_SIGNATURE,
|
||||
.revision = 0x0001000a,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
gcc -c -m32 -DELF32 -o efiemu32.o ./efiemu.c -Wall -Werror -nostdlib -O2 -I. -I../../include
|
||||
gcc -c -m64 -DELF64 -o efiemu64_c.o ./efiemu.c -Wall -Werror -mcmodel=large -O2 -I. -I../../include
|
||||
gcc -c -m64 -DELF64 -o efiemu64_s.o ./efiemu.S -Wall -Werror -mcmodel=large -O2 -I. -I../../include
|
||||
ld -o efiemu64.o -r efiemu64_s.o efiemu64_c.o -nostdlib
|
||||
ld -o efiemu64.o -r efiemu64_s.o efiemu64_c.o -nostdlib
|
||||
|
|
|
@ -57,16 +57,16 @@ grub_efiemu_free_syms (void)
|
|||
}
|
||||
|
||||
/* Announce that the module will need NUM allocators */
|
||||
/* Because of deferred memory allocation all the relocators have to be
|
||||
/* Because of deferred memory allocation all the relocators have to be
|
||||
announced during phase 1*/
|
||||
grub_err_t
|
||||
grub_efiemu_request_symbols (int num)
|
||||
{
|
||||
if (ptv_alloc)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
"symbols have already been allocated");
|
||||
if (num < 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
"can't request negative symbols");
|
||||
ptv_requested += num;
|
||||
return GRUB_ERR_NONE;
|
||||
|
@ -111,15 +111,15 @@ grub_err_t
|
|||
grub_efiemu_alloc_syms (void)
|
||||
{
|
||||
ptv_alloc = ptv_requested;
|
||||
ptv_handle = grub_efiemu_request_memalign
|
||||
(1, (ptv_requested + 1) * sizeof (struct grub_efiemu_ptv_rel),
|
||||
ptv_handle = grub_efiemu_request_memalign
|
||||
(1, (ptv_requested + 1) * sizeof (struct grub_efiemu_ptv_rel),
|
||||
GRUB_EFI_RUNTIME_SERVICES_DATA);
|
||||
grub_efiemu_register_symbol ("efiemu_ptv_relloc", ptv_handle, 0);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
/* Write value (pointer to memory PLUS_HANDLE)
|
||||
- (pointer to memory MINUS_HANDLE) + VALUE to ADDR assuming that the
|
||||
/* Write value (pointer to memory PLUS_HANDLE)
|
||||
- (pointer to memory MINUS_HANDLE) + VALUE to ADDR assuming that the
|
||||
size SIZE bytes. If PTV_NEEDED is 1 then announce it to runtime that this
|
||||
value needs to be recomputed before going to virtual mode
|
||||
*/
|
||||
|
@ -130,22 +130,22 @@ grub_efiemu_write_value (void *addr, grub_uint32_t value, int plus_handle,
|
|||
/* Announce relocator to runtime */
|
||||
if (ptv_needed)
|
||||
{
|
||||
struct grub_efiemu_ptv_rel *ptv_rels
|
||||
struct grub_efiemu_ptv_rel *ptv_rels
|
||||
= grub_efiemu_mm_obtain_request (ptv_handle);
|
||||
|
||||
if (ptv_needed && ptv_written >= ptv_alloc)
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||
"your module didn't declare efiemu "
|
||||
" relocators correctly");
|
||||
|
||||
if (minus_handle)
|
||||
ptv_rels[ptv_written].minustype
|
||||
ptv_rels[ptv_written].minustype
|
||||
= grub_efiemu_mm_get_type (minus_handle);
|
||||
else
|
||||
ptv_rels[ptv_written].minustype = 0;
|
||||
|
||||
if (plus_handle)
|
||||
ptv_rels[ptv_written].plustype
|
||||
ptv_rels[ptv_written].plustype
|
||||
= grub_efiemu_mm_get_type (plus_handle);
|
||||
else
|
||||
ptv_rels[ptv_written].plustype = 0;
|
||||
|
@ -153,7 +153,7 @@ grub_efiemu_write_value (void *addr, grub_uint32_t value, int plus_handle,
|
|||
ptv_rels[ptv_written].addr = PTR_TO_UINT64 (addr);
|
||||
ptv_rels[ptv_written].size = size;
|
||||
ptv_written++;
|
||||
|
||||
|
||||
/* memset next value to zero to mark the end */
|
||||
grub_memset (&ptv_rels[ptv_written], 0, sizeof (ptv_rels[ptv_written]));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue