2N/A/*
2N/A * GRUB -- GRand Unified Bootloader
2N/A * Copyright (C) 2009 Free Software Foundation, Inc.
2N/A *
2N/A * GRUB is free software: you can redistribute it and/or modify
2N/A * it under the terms of the GNU General Public License as published by
2N/A * the Free Software Foundation, either version 3 of the License, or
2N/A * (at your option) any later version.
2N/A *
2N/A * GRUB is distributed in the hope that it will be useful,
2N/A * but WITHOUT ANY WARRANTY; without even the implied warranty of
2N/A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2N/A * GNU General Public License for more details.
2N/A *
2N/A * You should have received a copy of the GNU General Public License
2N/A * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
2N/A */
2N/A
2N/A#ifndef GRUB_EFI_EMU_HEADER
2N/A#define GRUB_EFI_EMU_HEADER 1
2N/A
2N/A#include <grub/efi/api.h>
2N/A#include <grub/file.h>
2N/A#include <grub/memory.h>
2N/A
2N/A#define GRUB_EFIEMU_PAGESIZE 4096
2N/A
2N/A/* EFI api defined in 32-bit and 64-bit version*/
2N/Astruct grub_efi_system_table32
2N/A{
2N/A grub_efi_table_header_t hdr;
2N/A grub_efi_uint32_t firmware_vendor;
2N/A grub_efi_uint32_t firmware_revision;
2N/A grub_efi_uint32_t console_in_handle;
2N/A grub_efi_uint32_t con_in;
2N/A grub_efi_uint32_t console_out_handle;
2N/A grub_efi_uint32_t con_out;
2N/A grub_efi_uint32_t standard_error_handle;
2N/A grub_efi_uint32_t std_err;
2N/A grub_efi_uint32_t runtime_services;
2N/A grub_efi_uint32_t boot_services;
2N/A grub_efi_uint32_t num_table_entries;
2N/A grub_efi_uint32_t configuration_table;
2N/A} __attribute__ ((packed));
2N/Atypedef struct grub_efi_system_table32 grub_efi_system_table32_t;
2N/A
2N/Astruct grub_efi_system_table64
2N/A{
2N/A grub_efi_table_header_t hdr;
2N/A grub_efi_uint64_t firmware_vendor;
2N/A grub_efi_uint32_t firmware_revision;
2N/A grub_efi_uint32_t pad;
2N/A grub_efi_uint64_t console_in_handle;
2N/A grub_efi_uint64_t con_in;
2N/A grub_efi_uint64_t console_out_handle;
2N/A grub_efi_uint64_t con_out;
2N/A grub_efi_uint64_t standard_error_handle;
2N/A grub_efi_uint64_t std_err;
2N/A grub_efi_uint64_t runtime_services;
2N/A grub_efi_uint64_t boot_services;
2N/A grub_efi_uint64_t num_table_entries;
2N/A grub_efi_uint64_t configuration_table;
2N/A} __attribute__ ((packed));
2N/Atypedef struct grub_efi_system_table64 grub_efi_system_table64_t;
2N/A
2N/Astruct grub_efiemu_runtime_services32
2N/A{
2N/A grub_efi_table_header_t hdr;
2N/A grub_efi_uint32_t get_time;
2N/A grub_efi_uint32_t set_time;
2N/A grub_efi_uint32_t get_wakeup_time;
2N/A grub_efi_uint32_t set_wakeup_time;
2N/A grub_efi_uint32_t set_virtual_address_map;
2N/A grub_efi_uint32_t convert_pointer;
2N/A grub_efi_uint32_t get_variable;
2N/A grub_efi_uint32_t get_next_variable_name;
2N/A grub_efi_uint32_t set_variable;
2N/A grub_efi_uint32_t get_next_high_monotonic_count;
2N/A grub_efi_uint32_t reset_system;
2N/A} __attribute__ ((packed));
2N/Atypedef struct grub_efiemu_runtime_services32 grub_efiemu_runtime_services32_t;
2N/A
2N/Astruct grub_efiemu_runtime_services64
2N/A{
2N/A grub_efi_table_header_t hdr;
2N/A grub_efi_uint64_t get_time;
2N/A grub_efi_uint64_t set_time;
2N/A grub_efi_uint64_t get_wakeup_time;
2N/A grub_efi_uint64_t set_wakeup_time;
2N/A grub_efi_uint64_t set_virtual_address_map;
2N/A grub_efi_uint64_t convert_pointer;
2N/A grub_efi_uint64_t get_variable;
2N/A grub_efi_uint64_t get_next_variable_name;
2N/A grub_efi_uint64_t set_variable;
2N/A grub_efi_uint64_t get_next_high_monotonic_count;
2N/A grub_efi_uint64_t reset_system;
2N/A} __attribute__ ((packed));
2N/Atypedef struct grub_efiemu_runtime_services64 grub_efiemu_runtime_services64_t;
2N/A
2N/Aextern grub_efi_system_table32_t *grub_efiemu_system_table32;
2N/Aextern grub_efi_system_table64_t *grub_efiemu_system_table64;
2N/A
2N/A/* Convenience macros to access currently loaded efiemu */
2N/A#define grub_efiemu_system_table ((grub_efiemu_sizeof_uintn_t () == 8) \
2N/A ? (void *) grub_efiemu_system_table64 \
2N/A : (void *) grub_efiemu_system_table32)
2N/A#define GRUB_EFIEMU_SIZEOF_OF_UINTN (grub_efiemu_sizeof_uintn_t ())
2N/A#define GRUB_EFIEMU_SYSTEM_TABLE(x) ((grub_efiemu_sizeof_uintn_t () == 8) \
2N/A ? grub_efiemu_system_table64->x \
2N/A : grub_efiemu_system_table32->x)
2N/A#define GRUB_EFIEMU_SYSTEM_TABLE_SET(x,y) ((grub_efiemu_sizeof_uintn_t () == 8)\
2N/A ? (grub_efiemu_system_table64->x \
2N/A = (y)) \
2N/A : (grub_efiemu_system_table32->x \
2N/A = (y)))
2N/A#define GRUB_EFIEMU_SYSTEM_TABLE_PTR(x) ((grub_efiemu_sizeof_uintn_t () == 8)\
2N/A ? (void *) (grub_addr_t) \
2N/A (grub_efiemu_system_table64->x) \
2N/A : (void *) (grub_addr_t) \
2N/A (grub_efiemu_system_table32->x))
2N/A#define GRUB_EFIEMU_SYSTEM_TABLE_VAR(x) ((grub_efiemu_sizeof_uintn_t () == 8) \
2N/A ? (void *) \
2N/A &(grub_efiemu_system_table64->x) \
2N/A : (void *) \
2N/A &(grub_efiemu_system_table32->x))
2N/A#define GRUB_EFIEMU_SYSTEM_TABLE_SIZEOF(x) \
2N/A ((grub_efiemu_sizeof_uintn_t () == 8) \
2N/A ? sizeof(grub_efiemu_system_table64->x)\
2N/A : sizeof(grub_efiemu_system_table32->x))
2N/A#define GRUB_EFIEMU_SYSTEM_TABLE_SIZEOF_TOTAL ((grub_efiemu_sizeof_uintn_t () == 8) ? sizeof(*grub_efiemu_system_table64):sizeof(*grub_efiemu_system_table32))
2N/A
2N/A/* ELF management definitions and functions */
2N/A
2N/Astruct grub_efiemu_segment
2N/A{
2N/A struct grub_efiemu_segment *next;
2N/A grub_size_t size;
2N/A unsigned section;
2N/A int handle;
2N/A int ptv_rel_needed;
2N/A grub_off_t off;
2N/A void *srcptr;
2N/A};
2N/Atypedef struct grub_efiemu_segment *grub_efiemu_segment_t;
2N/A
2N/Astruct grub_efiemu_elf_sym
2N/A{
2N/A int handle;
2N/A grub_off_t off;
2N/A unsigned section;
2N/A};
2N/A
2N/Aint grub_efiemu_check_header32 (void *ehdr, grub_size_t size);
2N/Aint grub_efiemu_check_header64 (void *ehdr, grub_size_t size);
2N/Agrub_err_t grub_efiemu_loadcore_init32 (void *core, grub_size_t core_size,
2N/A grub_efiemu_segment_t *segments);
2N/Agrub_err_t grub_efiemu_loadcore_init64 (void *core, grub_size_t core_size,
2N/A grub_efiemu_segment_t *segments);
2N/Agrub_err_t grub_efiemu_loadcore_load32 (void *core,
2N/A grub_size_t core_size,
2N/A grub_efiemu_segment_t segments);
2N/Agrub_err_t grub_efiemu_loadcore_load64 (void *core,
2N/A grub_size_t core_size,
2N/A grub_efiemu_segment_t segments);
2N/Agrub_err_t grub_efiemu_loadcore_unload32 (void);
2N/Agrub_err_t grub_efiemu_loadcore_unload64 (void);
2N/Agrub_err_t grub_efiemu_loadcore_unload(void);
2N/Agrub_err_t grub_efiemu_loadcore_init (grub_file_t file);
2N/Agrub_err_t grub_efiemu_loadcore_load (void);
2N/A
2N/A/* Configuration tables manipulation. Definitions and functions */
2N/Astruct grub_efiemu_configuration_table
2N/A{
2N/A struct grub_efiemu_configuration_table *next;
2N/A grub_efi_guid_t guid;
2N/A void * (*get_table) (void *data);
2N/A void (*unload) (void *data);
2N/A void *data;
2N/A};
2N/Astruct grub_efiemu_configuration_table32
2N/A{
2N/A grub_efi_guid_t vendor_guid;
2N/A grub_efi_uint32_t vendor_table;
2N/A} __attribute__ ((packed));
2N/Atypedef struct grub_efiemu_configuration_table32 grub_efiemu_configuration_table32_t;
2N/Astruct grub_efiemu_configuration_table64
2N/A{
2N/A grub_efi_guid_t vendor_guid;
2N/A grub_efi_uint64_t vendor_table;
2N/A} __attribute__ ((packed));
2N/Atypedef struct grub_efiemu_configuration_table64 grub_efiemu_configuration_table64_t;
2N/Agrub_err_t grub_efiemu_unregister_configuration_table (grub_efi_guid_t guid);
2N/Agrub_err_t
2N/Agrub_efiemu_register_configuration_table (grub_efi_guid_t guid,
2N/A void * (*get_table) (void *data),
2N/A void (*unload) (void *data),
2N/A void *data);
2N/A
2N/A/* Memory management functions */
2N/Aint grub_efiemu_request_memalign (grub_size_t align, grub_size_t size,
2N/A grub_efi_memory_type_t type);
2N/Avoid *grub_efiemu_mm_obtain_request (int handle);
2N/Agrub_err_t grub_efiemu_mm_unload (void);
2N/Agrub_err_t grub_efiemu_mm_do_alloc (void);
2N/Agrub_err_t grub_efiemu_mm_init (void);
2N/Avoid grub_efiemu_mm_return_request (int handle);
2N/Agrub_efi_memory_type_t grub_efiemu_mm_get_type (int handle);
2N/A
2N/A/* Drop-in replacements for grub_efi_* and grub_machine_* */
2N/Aint grub_efiemu_get_memory_map (grub_efi_uintn_t *memory_map_size,
2N/A grub_efi_memory_descriptor_t *memory_map,
2N/A grub_efi_uintn_t *map_key,
2N/A grub_efi_uintn_t *descriptor_size,
2N/A grub_efi_uint32_t *descriptor_version);
2N/A
2N/A
2N/Agrub_err_t
2N/Agrub_efiemu_finish_boot_services (grub_efi_uintn_t *memory_map_size,
2N/A grub_efi_memory_descriptor_t *memory_map,
2N/A grub_efi_uintn_t *map_key,
2N/A grub_efi_uintn_t *descriptor_size,
2N/A grub_efi_uint32_t *descriptor_version);
2N/A
2N/Agrub_err_t
2N/Agrub_efiemu_mmap_iterate (grub_memory_hook_t hook);
2N/Aint grub_efiemu_sizeof_uintn_t (void);
2N/Agrub_err_t
2N/Agrub_efiemu_get_lower_upper_memory (grub_uint64_t *lower, grub_uint64_t *upper);
2N/A
2N/A/* efiemu main control definitions and functions*/
2N/Atypedef enum {GRUB_EFIEMU_NOTLOADED,
2N/A GRUB_EFIEMU32, GRUB_EFIEMU64} grub_efiemu_mode_t;
2N/Astruct grub_efiemu_prepare_hook
2N/A{
2N/A struct grub_efiemu_prepare_hook *next;
2N/A grub_err_t (*hook) (void *data);
2N/A void (*unload) (void *data);
2N/A void *data;
2N/A};
2N/Agrub_err_t grub_efiemu_prepare32 (struct grub_efiemu_prepare_hook
2N/A *prepare_hooks,
2N/A struct grub_efiemu_configuration_table
2N/A *config_tables);
2N/Agrub_err_t grub_efiemu_prepare64 (struct grub_efiemu_prepare_hook
2N/A *prepare_hooks,
2N/A struct grub_efiemu_configuration_table
2N/A *config_tables);
2N/Agrub_err_t grub_efiemu_unload (void);
2N/Agrub_err_t grub_efiemu_prepare (void);
2N/Agrub_err_t
2N/Agrub_efiemu_register_prepare_hook (grub_err_t (*hook) (void *data),
2N/A void (*unload) (void *data),
2N/A void *data);
2N/A
2N/A/* symbols and pointers */
2N/Agrub_err_t grub_efiemu_alloc_syms (void);
2N/Agrub_err_t grub_efiemu_request_symbols (int num);
2N/Agrub_err_t grub_efiemu_resolve_symbol (const char *name,
2N/A int *handle, grub_off_t *off);
2N/Agrub_err_t grub_efiemu_register_symbol (const char *name,
2N/A int handle, grub_off_t off);
2N/Avoid grub_efiemu_free_syms (void);
2N/Agrub_err_t grub_efiemu_write_value (void * addr, grub_uint32_t value,
2N/A int plus_handle,
2N/A int minus_handle, int ptv_needed, int size);
2N/Agrub_err_t grub_efiemu_write_sym_markers (void);
2N/Agrub_err_t grub_efiemu_pnvram (void);
2N/Aconst char *grub_efiemu_get_default_core_name (void);
2N/Avoid grub_efiemu_pnvram_cmd_unregister (void);
2N/Agrub_err_t grub_efiemu_autocore (void);
2N/Agrub_err_t grub_efiemu_crc32 (void);
2N/Agrub_err_t grub_efiemu_crc64 (void);
2N/Agrub_err_t
2N/Agrub_efiemu_set_virtual_address_map (grub_efi_uintn_t memory_map_size,
2N/A grub_efi_uintn_t descriptor_size,
2N/A grub_efi_uint32_t descriptor_version
2N/A __attribute__ ((unused)),
2N/A grub_efi_memory_descriptor_t *virtual_map);
2N/A
2N/Agrub_err_t grub_machine_efiemu_init_tables (void);
2N/A
2N/A#endif /* ! GRUB_EFI_EMU_HEADER */