]> git.proxmox.com Git - grub2.git/blame - include/grub/efiemu/efiemu.h
Add gcc_struct to all packed structures when compiling with mingw.
[grub2.git] / include / grub / efiemu / efiemu.h
CommitLineData
5caf964d 1/*
2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2009 Free Software Foundation, Inc.
4 *
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * GRUB is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifndef GRUB_EFI_EMU_HEADER
20#define GRUB_EFI_EMU_HEADER 1
21
22#include <grub/efi/api.h>
23#include <grub/file.h>
4ed4ce58 24#include <grub/memory.h>
5caf964d 25
26#define GRUB_EFIEMU_PAGESIZE 4096
27
28/* EFI api defined in 32-bit and 64-bit version*/
29struct grub_efi_system_table32
30{
31 grub_efi_table_header_t hdr;
32 grub_efi_uint32_t firmware_vendor;
33 grub_efi_uint32_t firmware_revision;
34 grub_efi_uint32_t console_in_handler;
35 grub_efi_uint32_t con_in;
36 grub_efi_uint32_t console_out_handler;
37 grub_efi_uint32_t con_out;
38 grub_efi_uint32_t standard_error_handle;
39 grub_efi_uint32_t std_err;
40 grub_efi_uint32_t runtime_services;
41 grub_efi_uint32_t boot_services;
42 grub_efi_uint32_t num_table_entries;
43 grub_efi_uint32_t configuration_table;
7e47e27b 44} GRUB_PACKED;
5caf964d 45typedef struct grub_efi_system_table32 grub_efi_system_table32_t;
46
47struct grub_efi_system_table64
48{
49 grub_efi_table_header_t hdr;
50 grub_efi_uint64_t firmware_vendor;
51 grub_efi_uint32_t firmware_revision;
52 grub_efi_uint32_t pad;
53 grub_efi_uint64_t console_in_handler;
54 grub_efi_uint64_t con_in;
55 grub_efi_uint64_t console_out_handler;
56 grub_efi_uint64_t con_out;
57 grub_efi_uint64_t standard_error_handle;
58 grub_efi_uint64_t std_err;
59 grub_efi_uint64_t runtime_services;
60 grub_efi_uint64_t boot_services;
61 grub_efi_uint64_t num_table_entries;
62 grub_efi_uint64_t configuration_table;
7e47e27b 63} GRUB_PACKED;
5caf964d 64typedef struct grub_efi_system_table64 grub_efi_system_table64_t;
65
66struct grub_efiemu_runtime_services32
67{
68 grub_efi_table_header_t hdr;
69 grub_efi_uint32_t get_time;
70 grub_efi_uint32_t set_time;
71 grub_efi_uint32_t get_wakeup_time;
72 grub_efi_uint32_t set_wakeup_time;
73 grub_efi_uint32_t set_virtual_address_map;
74 grub_efi_uint32_t convert_pointer;
75 grub_efi_uint32_t get_variable;
76 grub_efi_uint32_t get_next_variable_name;
77 grub_efi_uint32_t set_variable;
78 grub_efi_uint32_t get_next_high_monotonic_count;
79 grub_efi_uint32_t reset_system;
7e47e27b 80} GRUB_PACKED;
5caf964d 81typedef struct grub_efiemu_runtime_services32 grub_efiemu_runtime_services32_t;
82
83struct grub_efiemu_runtime_services64
84{
85 grub_efi_table_header_t hdr;
86 grub_efi_uint64_t get_time;
87 grub_efi_uint64_t set_time;
88 grub_efi_uint64_t get_wakeup_time;
89 grub_efi_uint64_t set_wakeup_time;
90 grub_efi_uint64_t set_virtual_address_map;
91 grub_efi_uint64_t convert_pointer;
92 grub_efi_uint64_t get_variable;
93 grub_efi_uint64_t get_next_variable_name;
94 grub_efi_uint64_t set_variable;
95 grub_efi_uint64_t get_next_high_monotonic_count;
96 grub_efi_uint64_t reset_system;
7e47e27b 97} GRUB_PACKED;
5caf964d 98typedef struct grub_efiemu_runtime_services64 grub_efiemu_runtime_services64_t;
99
100extern grub_efi_system_table32_t *grub_efiemu_system_table32;
101extern grub_efi_system_table64_t *grub_efiemu_system_table64;
102
4241d2b1 103/* Convenience macros to access currently loaded efiemu */
5caf964d 104#define grub_efiemu_system_table ((grub_efiemu_sizeof_uintn_t () == 8) \
105 ? (void *) grub_efiemu_system_table64 \
106 : (void *) grub_efiemu_system_table32)
107#define GRUB_EFIEMU_SIZEOF_OF_UINTN (grub_efiemu_sizeof_uintn_t ())
108#define GRUB_EFIEMU_SYSTEM_TABLE(x) ((grub_efiemu_sizeof_uintn_t () == 8) \
109 ? grub_efiemu_system_table64->x \
110 : grub_efiemu_system_table32->x)
111#define GRUB_EFIEMU_SYSTEM_TABLE_SET(x,y) ((grub_efiemu_sizeof_uintn_t () == 8)\
112 ? (grub_efiemu_system_table64->x \
113 = (y)) \
114 : (grub_efiemu_system_table32->x \
115 = (y)))
116#define GRUB_EFIEMU_SYSTEM_TABLE_PTR(x) ((grub_efiemu_sizeof_uintn_t () == 8)\
f2b60fbd 117 ? (void *) (grub_addr_t) \
5caf964d 118 (grub_efiemu_system_table64->x) \
f2b60fbd 119 : (void *) (grub_addr_t) \
5caf964d 120 (grub_efiemu_system_table32->x))
121#define GRUB_EFIEMU_SYSTEM_TABLE_VAR(x) ((grub_efiemu_sizeof_uintn_t () == 8) \
122 ? (void *) \
123 &(grub_efiemu_system_table64->x) \
124 : (void *) \
125 &(grub_efiemu_system_table32->x))
126#define GRUB_EFIEMU_SYSTEM_TABLE_SIZEOF(x) \
127 ((grub_efiemu_sizeof_uintn_t () == 8) \
128 ? sizeof(grub_efiemu_system_table64->x)\
129 : sizeof(grub_efiemu_system_table32->x))
130#define GRUB_EFIEMU_SYSTEM_TABLE_SIZEOF_TOTAL ((grub_efiemu_sizeof_uintn_t () == 8) ? sizeof(*grub_efiemu_system_table64):sizeof(*grub_efiemu_system_table32))
131
132/* ELF management definitions and functions */
133
134struct grub_efiemu_segment
135{
136 struct grub_efiemu_segment *next;
137 grub_size_t size;
138 unsigned section;
139 int handle;
140 int ptv_rel_needed;
141 grub_off_t off;
142 void *srcptr;
143};
144typedef struct grub_efiemu_segment *grub_efiemu_segment_t;
145
146struct grub_efiemu_elf_sym
147{
148 int handle;
149 grub_off_t off;
150 unsigned section;
151};
152
153int grub_efiemu_check_header32 (void *ehdr, grub_size_t size);
154int grub_efiemu_check_header64 (void *ehdr, grub_size_t size);
0331e102
VS
155grub_err_t grub_efiemu_loadcore_init32 (void *core,
156 const char *filename,
157 grub_size_t core_size,
5caf964d 158 grub_efiemu_segment_t *segments);
0331e102
VS
159grub_err_t grub_efiemu_loadcore_init64 (void *core, const char *filename,
160 grub_size_t core_size,
5caf964d 161 grub_efiemu_segment_t *segments);
b39f9d20 162grub_err_t grub_efiemu_loadcore_load32 (void *core,
5caf964d 163 grub_size_t core_size,
164 grub_efiemu_segment_t segments);
b39f9d20 165grub_err_t grub_efiemu_loadcore_load64 (void *core,
5caf964d 166 grub_size_t core_size,
167 grub_efiemu_segment_t segments);
168grub_err_t grub_efiemu_loadcore_unload32 (void);
169grub_err_t grub_efiemu_loadcore_unload64 (void);
170grub_err_t grub_efiemu_loadcore_unload(void);
0331e102
VS
171grub_err_t grub_efiemu_loadcore_init (grub_file_t file,
172 const char *filename);
5caf964d 173grub_err_t grub_efiemu_loadcore_load (void);
174
175/* Configuration tables manipulation. Definitions and functions */
176struct grub_efiemu_configuration_table
177{
178 struct grub_efiemu_configuration_table *next;
179 grub_efi_guid_t guid;
180 void * (*get_table) (void *data);
181 void (*unload) (void *data);
182 void *data;
183};
184struct grub_efiemu_configuration_table32
185{
6644d973 186 grub_efi_packed_guid_t vendor_guid;
5caf964d 187 grub_efi_uint32_t vendor_table;
7e47e27b 188} GRUB_PACKED;
5caf964d 189typedef struct grub_efiemu_configuration_table32 grub_efiemu_configuration_table32_t;
190struct grub_efiemu_configuration_table64
191{
6644d973 192 grub_efi_packed_guid_t vendor_guid;
5caf964d 193 grub_efi_uint64_t vendor_table;
7e47e27b 194} GRUB_PACKED;
a58da8c7 195typedef struct grub_efiemu_configuration_table64 grub_efiemu_configuration_table64_t;
5caf964d 196grub_err_t grub_efiemu_unregister_configuration_table (grub_efi_guid_t guid);
b39f9d20 197grub_err_t
198grub_efiemu_register_configuration_table (grub_efi_guid_t guid,
5caf964d 199 void * (*get_table) (void *data),
b39f9d20 200 void (*unload) (void *data),
5caf964d 201 void *data);
202
203/* Memory management functions */
b39f9d20 204int grub_efiemu_request_memalign (grub_size_t align, grub_size_t size,
5caf964d 205 grub_efi_memory_type_t type);
206void *grub_efiemu_mm_obtain_request (int handle);
5caf964d 207grub_err_t grub_efiemu_mm_unload (void);
208grub_err_t grub_efiemu_mm_do_alloc (void);
209grub_err_t grub_efiemu_mm_init (void);
5caf964d 210void grub_efiemu_mm_return_request (int handle);
211grub_efi_memory_type_t grub_efiemu_mm_get_type (int handle);
212
213/* Drop-in replacements for grub_efi_* and grub_machine_* */
214int grub_efiemu_get_memory_map (grub_efi_uintn_t *memory_map_size,
215 grub_efi_memory_descriptor_t *memory_map,
216 grub_efi_uintn_t *map_key,
217 grub_efi_uintn_t *descriptor_size,
218 grub_efi_uint32_t *descriptor_version);
65ce0931
VS
219
220
221grub_err_t
222grub_efiemu_finish_boot_services (grub_efi_uintn_t *memory_map_size,
223 grub_efi_memory_descriptor_t *memory_map,
224 grub_efi_uintn_t *map_key,
225 grub_efi_uintn_t *descriptor_size,
226 grub_efi_uint32_t *descriptor_version);
227
5caf964d 228grub_err_t
d0d4b8a0 229grub_efiemu_mmap_iterate (grub_memory_hook_t hook, void *hook_data);
5caf964d 230int grub_efiemu_sizeof_uintn_t (void);
5caf964d 231grub_err_t
232grub_efiemu_get_lower_upper_memory (grub_uint64_t *lower, grub_uint64_t *upper);
5caf964d 233
234/* efiemu main control definitions and functions*/
235typedef enum {GRUB_EFIEMU_NOTLOADED,
236 GRUB_EFIEMU32, GRUB_EFIEMU64} grub_efiemu_mode_t;
237struct grub_efiemu_prepare_hook
238{
239 struct grub_efiemu_prepare_hook *next;
240 grub_err_t (*hook) (void *data);
241 void (*unload) (void *data);
242 void *data;
243};
b39f9d20 244grub_err_t grub_efiemu_prepare32 (struct grub_efiemu_prepare_hook
5caf964d 245 *prepare_hooks,
b39f9d20 246 struct grub_efiemu_configuration_table
5caf964d 247 *config_tables);
b39f9d20 248grub_err_t grub_efiemu_prepare64 (struct grub_efiemu_prepare_hook
5caf964d 249 *prepare_hooks,
b39f9d20 250 struct grub_efiemu_configuration_table
5caf964d 251 *config_tables);
252grub_err_t grub_efiemu_unload (void);
253grub_err_t grub_efiemu_prepare (void);
254grub_err_t
255grub_efiemu_register_prepare_hook (grub_err_t (*hook) (void *data),
b39f9d20 256 void (*unload) (void *data),
5caf964d 257 void *data);
258
259/* symbols and pointers */
260grub_err_t grub_efiemu_alloc_syms (void);
261grub_err_t grub_efiemu_request_symbols (int num);
b39f9d20 262grub_err_t grub_efiemu_resolve_symbol (const char *name,
5caf964d 263 int *handle, grub_off_t *off);
b39f9d20 264grub_err_t grub_efiemu_register_symbol (const char *name,
5caf964d 265 int handle, grub_off_t off);
266void grub_efiemu_free_syms (void);
b39f9d20 267grub_err_t grub_efiemu_write_value (void * addr, grub_uint32_t value,
5caf964d 268 int plus_handle,
269 int minus_handle, int ptv_needed, int size);
8a10b2c6 270grub_err_t grub_efiemu_write_sym_markers (void);
5caf964d 271grub_err_t grub_efiemu_pnvram (void);
bf3a3857 272const char *grub_efiemu_get_default_core_name (void);
5caf964d 273void grub_efiemu_pnvram_cmd_unregister (void);
274grub_err_t grub_efiemu_autocore (void);
8a10b2c6 275grub_err_t grub_efiemu_crc32 (void);
276grub_err_t grub_efiemu_crc64 (void);
277grub_err_t
278grub_efiemu_set_virtual_address_map (grub_efi_uintn_t memory_map_size,
279 grub_efi_uintn_t descriptor_size,
280 grub_efi_uint32_t descriptor_version
281 __attribute__ ((unused)),
282 grub_efi_memory_descriptor_t *virtual_map);
283
05f602fc
VS
284grub_err_t grub_machine_efiemu_init_tables (void);
285
5caf964d 286#endif /* ! GRUB_EFI_EMU_HEADER */