2009-11-21 Samuel Thibault <samuel.thibault@ens-lyon.org>
[grub2.git] / include / grub / efiemu / efiemu.h
blob20163dd610c3467ba0d0271b9763a84f094182eb
1 /*
2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2009 Free Software Foundation, Inc.
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.
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.
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/>.
19 #ifndef GRUB_EFI_EMU_HEADER
20 #define GRUB_EFI_EMU_HEADER 1
22 #include <grub/efi/api.h>
23 #include <grub/file.h>
25 #define GRUB_EFIEMU_PAGESIZE 4096
27 /* EFI api defined in 32-bit and 64-bit version*/
28 struct grub_efi_system_table32
30 grub_efi_table_header_t hdr;
31 grub_efi_uint32_t firmware_vendor;
32 grub_efi_uint32_t firmware_revision;
33 grub_efi_uint32_t console_in_handler;
34 grub_efi_uint32_t con_in;
35 grub_efi_uint32_t console_out_handler;
36 grub_efi_uint32_t con_out;
37 grub_efi_uint32_t standard_error_handle;
38 grub_efi_uint32_t std_err;
39 grub_efi_uint32_t runtime_services;
40 grub_efi_uint32_t boot_services;
41 grub_efi_uint32_t num_table_entries;
42 grub_efi_uint32_t configuration_table;
43 } __attribute__ ((packed));
44 typedef struct grub_efi_system_table32 grub_efi_system_table32_t;
46 struct grub_efi_system_table64
48 grub_efi_table_header_t hdr;
49 grub_efi_uint64_t firmware_vendor;
50 grub_efi_uint32_t firmware_revision;
51 grub_efi_uint32_t pad;
52 grub_efi_uint64_t console_in_handler;
53 grub_efi_uint64_t con_in;
54 grub_efi_uint64_t console_out_handler;
55 grub_efi_uint64_t con_out;
56 grub_efi_uint64_t standard_error_handle;
57 grub_efi_uint64_t std_err;
58 grub_efi_uint64_t runtime_services;
59 grub_efi_uint64_t boot_services;
60 grub_efi_uint64_t num_table_entries;
61 grub_efi_uint64_t configuration_table;
62 } __attribute__ ((packed));
63 typedef struct grub_efi_system_table64 grub_efi_system_table64_t;
65 struct grub_efiemu_runtime_services32
67 grub_efi_table_header_t hdr;
68 grub_efi_uint32_t get_time;
69 grub_efi_uint32_t set_time;
70 grub_efi_uint32_t get_wakeup_time;
71 grub_efi_uint32_t set_wakeup_time;
72 grub_efi_uint32_t set_virtual_address_map;
73 grub_efi_uint32_t convert_pointer;
74 grub_efi_uint32_t get_variable;
75 grub_efi_uint32_t get_next_variable_name;
76 grub_efi_uint32_t set_variable;
77 grub_efi_uint32_t get_next_high_monotonic_count;
78 grub_efi_uint32_t reset_system;
79 } __attribute__ ((packed));
80 typedef struct grub_efiemu_runtime_services32 grub_efiemu_runtime_services32_t;
82 struct grub_efiemu_runtime_services64
84 grub_efi_table_header_t hdr;
85 grub_efi_uint64_t get_time;
86 grub_efi_uint64_t set_time;
87 grub_efi_uint64_t get_wakeup_time;
88 grub_efi_uint64_t set_wakeup_time;
89 grub_efi_uint64_t set_virtual_address_map;
90 grub_efi_uint64_t convert_pointer;
91 grub_efi_uint64_t get_variable;
92 grub_efi_uint64_t get_next_variable_name;
93 grub_efi_uint64_t set_variable;
94 grub_efi_uint64_t get_next_high_monotonic_count;
95 grub_efi_uint64_t reset_system;
96 } __attribute__ ((packed));
97 typedef struct grub_efiemu_runtime_services64 grub_efiemu_runtime_services64_t;
99 extern grub_efi_system_table32_t *grub_efiemu_system_table32;
100 extern grub_efi_system_table64_t *grub_efiemu_system_table64;
102 /* Convenience macros to access currently loaded efiemu */
103 #define grub_efiemu_system_table ((grub_efiemu_sizeof_uintn_t () == 8) \
104 ? (void *) grub_efiemu_system_table64 \
105 : (void *) grub_efiemu_system_table32)
106 #define GRUB_EFIEMU_SIZEOF_OF_UINTN (grub_efiemu_sizeof_uintn_t ())
107 #define GRUB_EFIEMU_SYSTEM_TABLE(x) ((grub_efiemu_sizeof_uintn_t () == 8) \
108 ? grub_efiemu_system_table64->x \
109 : grub_efiemu_system_table32->x)
110 #define GRUB_EFIEMU_SYSTEM_TABLE_SET(x,y) ((grub_efiemu_sizeof_uintn_t () == 8)\
111 ? (grub_efiemu_system_table64->x \
112 = (y)) \
113 : (grub_efiemu_system_table32->x \
114 = (y)))
115 #define GRUB_EFIEMU_SYSTEM_TABLE_PTR(x) ((grub_efiemu_sizeof_uintn_t () == 8)\
116 ? UINT_TO_PTR \
117 (grub_efiemu_system_table64->x) \
118 : UINT_TO_PTR \
119 (grub_efiemu_system_table32->x))
120 #define GRUB_EFIEMU_SYSTEM_TABLE_VAR(x) ((grub_efiemu_sizeof_uintn_t () == 8) \
121 ? (void *) \
122 &(grub_efiemu_system_table64->x) \
123 : (void *) \
124 &(grub_efiemu_system_table32->x))
125 #define GRUB_EFIEMU_SYSTEM_TABLE_SIZEOF(x) \
126 ((grub_efiemu_sizeof_uintn_t () == 8) \
127 ? sizeof(grub_efiemu_system_table64->x)\
128 : sizeof(grub_efiemu_system_table32->x))
129 #define GRUB_EFIEMU_SYSTEM_TABLE_SIZEOF_TOTAL ((grub_efiemu_sizeof_uintn_t () == 8) ? sizeof(*grub_efiemu_system_table64):sizeof(*grub_efiemu_system_table32))
131 /* ELF management definitions and functions */
133 struct grub_efiemu_segment
135 struct grub_efiemu_segment *next;
136 grub_size_t size;
137 unsigned section;
138 int handle;
139 int ptv_rel_needed;
140 grub_off_t off;
141 void *srcptr;
143 typedef struct grub_efiemu_segment *grub_efiemu_segment_t;
145 struct grub_efiemu_elf_sym
147 int handle;
148 grub_off_t off;
149 unsigned section;
152 int grub_efiemu_check_header32 (void *ehdr, grub_size_t size);
153 int grub_efiemu_check_header64 (void *ehdr, grub_size_t size);
154 grub_err_t grub_efiemu_loadcore_init32 (void *core, grub_size_t core_size,
155 grub_efiemu_segment_t *segments);
156 grub_err_t grub_efiemu_loadcore_init64 (void *core, grub_size_t core_size,
157 grub_efiemu_segment_t *segments);
158 grub_err_t grub_efiemu_loadcore_load32 (void *core,
159 grub_size_t core_size,
160 grub_efiemu_segment_t segments);
161 grub_err_t grub_efiemu_loadcore_load64 (void *core,
162 grub_size_t core_size,
163 grub_efiemu_segment_t segments);
164 grub_err_t grub_efiemu_loadcore_unload32 (void);
165 grub_err_t grub_efiemu_loadcore_unload64 (void);
166 grub_err_t grub_efiemu_loadcore_unload(void);
167 grub_err_t grub_efiemu_loadcore_init (grub_file_t file);
168 grub_err_t grub_efiemu_loadcore_load (void);
170 /* Configuration tables manipulation. Definitions and functions */
171 struct grub_efiemu_configuration_table
173 struct grub_efiemu_configuration_table *next;
174 grub_efi_guid_t guid;
175 void * (*get_table) (void *data);
176 void (*unload) (void *data);
177 void *data;
179 struct grub_efiemu_configuration_table32
181 grub_efi_guid_t vendor_guid;
182 grub_efi_uint32_t vendor_table;
183 } __attribute__ ((packed));
184 typedef struct grub_efiemu_configuration_table32 grub_efiemu_configuration_table32_t;
185 struct grub_efiemu_configuration_table64
187 grub_efi_guid_t vendor_guid;
188 grub_efi_uint64_t vendor_table;
189 } __attribute__ ((packed));
190 typedef struct grub_efiemu_configuration_table64 grub_efiemu_configuration_table64_t;
191 grub_err_t grub_efiemu_unregister_configuration_table (grub_efi_guid_t guid);
192 grub_err_t
193 grub_efiemu_register_configuration_table (grub_efi_guid_t guid,
194 void * (*get_table) (void *data),
195 void (*unload) (void *data),
196 void *data);
198 /* Memory management functions */
199 int grub_efiemu_request_memalign (grub_size_t align, grub_size_t size,
200 grub_efi_memory_type_t type);
201 void *grub_efiemu_mm_obtain_request (int handle);
202 int grub_efiemu_get_memory_map (grub_efi_uintn_t *memory_map_size,
203 grub_efi_memory_descriptor_t *memory_map,
204 grub_efi_uintn_t *map_key,
205 grub_efi_uintn_t *descriptor_size,
206 grub_efi_uint32_t *descriptor_version);
207 grub_err_t grub_efiemu_mm_unload (void);
208 grub_err_t grub_efiemu_mm_do_alloc (void);
209 grub_err_t grub_efiemu_mm_init (void);
210 void *grub_efiemu_mm_obtain_request (int handle);
211 void grub_efiemu_mm_return_request (int handle);
212 grub_efi_memory_type_t grub_efiemu_mm_get_type (int handle);
214 /* Drop-in replacements for grub_efi_* and grub_machine_* */
215 int grub_efiemu_get_memory_map (grub_efi_uintn_t *memory_map_size,
216 grub_efi_memory_descriptor_t *memory_map,
217 grub_efi_uintn_t *map_key,
218 grub_efi_uintn_t *descriptor_size,
219 grub_efi_uint32_t *descriptor_version);
220 grub_err_t
221 grub_efiemu_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t,
222 grub_uint64_t,
223 grub_uint32_t));
224 int grub_efiemu_sizeof_uintn_t (void);
225 int grub_efiemu_exit_boot_services (grub_efi_uintn_t map_key);
226 int grub_efiemu_finish_boot_services (void);
227 grub_err_t
228 grub_efiemu_get_lower_upper_memory (grub_uint64_t *lower, grub_uint64_t *upper);
229 #define GRUB_EFIEMU_MEMORY_AVAILABLE 1
230 #define GRUB_EFIEMU_MEMORY_RESERVED 2
231 #define GRUB_EFIEMU_MEMORY_ACPI 3
232 #define GRUB_EFIEMU_MEMORY_NVS 4
233 #define GRUB_EFIEMU_MEMORY_CODE 5
235 /* efiemu main control definitions and functions*/
236 typedef enum {GRUB_EFIEMU_NOTLOADED,
237 GRUB_EFIEMU32, GRUB_EFIEMU64} grub_efiemu_mode_t;
238 struct grub_efiemu_prepare_hook
240 struct grub_efiemu_prepare_hook *next;
241 grub_err_t (*hook) (void *data);
242 void (*unload) (void *data);
243 void *data;
245 grub_err_t grub_efiemu_prepare32 (struct grub_efiemu_prepare_hook
246 *prepare_hooks,
247 struct grub_efiemu_configuration_table
248 *config_tables);
249 grub_err_t grub_efiemu_prepare64 (struct grub_efiemu_prepare_hook
250 *prepare_hooks,
251 struct grub_efiemu_configuration_table
252 *config_tables);
253 grub_err_t grub_efiemu_unload (void);
254 grub_err_t grub_efiemu_prepare (void);
255 grub_err_t
256 grub_efiemu_register_prepare_hook (grub_err_t (*hook) (void *data),
257 void (*unload) (void *data),
258 void *data);
260 /* symbols and pointers */
261 grub_err_t grub_efiemu_alloc_syms (void);
262 grub_err_t grub_efiemu_request_symbols (int num);
263 grub_err_t grub_efiemu_resolve_symbol (const char *name,
264 int *handle, grub_off_t *off);
265 grub_err_t grub_efiemu_register_symbol (const char *name,
266 int handle, grub_off_t off);
267 void grub_efiemu_free_syms (void);
268 grub_err_t grub_efiemu_write_value (void * addr, grub_uint32_t value,
269 int plus_handle,
270 int minus_handle, int ptv_needed, int size);
271 grub_err_t grub_efiemu_pnvram (void);
272 grub_err_t grub_efiemu_prepare (void);
273 char *grub_efiemu_get_default_core_name (void);
274 void grub_efiemu_pnvram_cmd_unregister (void);
275 grub_err_t grub_efiemu_autocore (void);
276 #endif /* ! GRUB_EFI_EMU_HEADER */