]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - drivers/firmware/efi/libstub/efi-stub-helper.c
Merge remote-tracking branches 'asoc/topic/sgtl5000', 'asoc/topic/simple', 'asoc...
[mirror_ubuntu-zesty-kernel.git] / drivers / firmware / efi / libstub / efi-stub-helper.c
1 /*
2 * Helper functions used by the EFI stub on multiple
3 * architectures. This should be #included by the EFI stub
4 * implementation files.
5 *
6 * Copyright 2011 Intel Corporation; author Matt Fleming
7 *
8 * This file is part of the Linux kernel, and is made available
9 * under the terms of the GNU General Public License version 2.
10 *
11 */
12
13 #include <linux/efi.h>
14 #include <asm/efi.h>
15
16 #include "efistub.h"
17
18 /*
19 * Some firmware implementations have problems reading files in one go.
20 * A read chunk size of 1MB seems to work for most platforms.
21 *
22 * Unfortunately, reading files in chunks triggers *other* bugs on some
23 * platforms, so we provide a way to disable this workaround, which can
24 * be done by passing "efi=nochunk" on the EFI boot stub command line.
25 *
26 * If you experience issues with initrd images being corrupt it's worth
27 * trying efi=nochunk, but chunking is enabled by default because there
28 * are far more machines that require the workaround than those that
29 * break with it enabled.
30 */
31 #define EFI_READ_CHUNK_SIZE (1024 * 1024)
32
33 static unsigned long __chunk_size = EFI_READ_CHUNK_SIZE;
34
35 /*
36 * Allow the platform to override the allocation granularity: this allows
37 * systems that have the capability to run with a larger page size to deal
38 * with the allocations for initrd and fdt more efficiently.
39 */
40 #ifndef EFI_ALLOC_ALIGN
41 #define EFI_ALLOC_ALIGN EFI_PAGE_SIZE
42 #endif
43
44 #define EFI_MMAP_NR_SLACK_SLOTS 8
45
46 struct file_info {
47 efi_file_handle_t *handle;
48 u64 size;
49 };
50
51 void efi_printk(efi_system_table_t *sys_table_arg, char *str)
52 {
53 char *s8;
54
55 for (s8 = str; *s8; s8++) {
56 efi_char16_t ch[2] = { 0 };
57
58 ch[0] = *s8;
59 if (*s8 == '\n') {
60 efi_char16_t nl[2] = { '\r', 0 };
61 efi_char16_printk(sys_table_arg, nl);
62 }
63
64 efi_char16_printk(sys_table_arg, ch);
65 }
66 }
67
68 static inline bool mmap_has_headroom(unsigned long buff_size,
69 unsigned long map_size,
70 unsigned long desc_size)
71 {
72 unsigned long slack = buff_size - map_size;
73
74 return slack / desc_size >= EFI_MMAP_NR_SLACK_SLOTS;
75 }
76
77 efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg,
78 struct efi_boot_memmap *map)
79 {
80 efi_memory_desc_t *m = NULL;
81 efi_status_t status;
82 unsigned long key;
83 u32 desc_version;
84
85 *map->desc_size = sizeof(*m);
86 *map->map_size = *map->desc_size * 32;
87 *map->buff_size = *map->map_size;
88 again:
89 status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
90 *map->map_size, (void **)&m);
91 if (status != EFI_SUCCESS)
92 goto fail;
93
94 *map->desc_size = 0;
95 key = 0;
96 status = efi_call_early(get_memory_map, map->map_size, m,
97 &key, map->desc_size, &desc_version);
98 if (status == EFI_BUFFER_TOO_SMALL ||
99 !mmap_has_headroom(*map->buff_size, *map->map_size,
100 *map->desc_size)) {
101 efi_call_early(free_pool, m);
102 /*
103 * Make sure there is some entries of headroom so that the
104 * buffer can be reused for a new map after allocations are
105 * no longer permitted. Its unlikely that the map will grow to
106 * exceed this headroom once we are ready to trigger
107 * ExitBootServices()
108 */
109 *map->map_size += *map->desc_size * EFI_MMAP_NR_SLACK_SLOTS;
110 *map->buff_size = *map->map_size;
111 goto again;
112 }
113
114 if (status != EFI_SUCCESS)
115 efi_call_early(free_pool, m);
116
117 if (map->key_ptr && status == EFI_SUCCESS)
118 *map->key_ptr = key;
119 if (map->desc_ver && status == EFI_SUCCESS)
120 *map->desc_ver = desc_version;
121
122 fail:
123 *map->map = m;
124 return status;
125 }
126
127
128 unsigned long get_dram_base(efi_system_table_t *sys_table_arg)
129 {
130 efi_status_t status;
131 unsigned long map_size, buff_size;
132 unsigned long membase = EFI_ERROR;
133 struct efi_memory_map map;
134 efi_memory_desc_t *md;
135 struct efi_boot_memmap boot_map;
136
137 boot_map.map = (efi_memory_desc_t **)&map.map;
138 boot_map.map_size = &map_size;
139 boot_map.desc_size = &map.desc_size;
140 boot_map.desc_ver = NULL;
141 boot_map.key_ptr = NULL;
142 boot_map.buff_size = &buff_size;
143
144 status = efi_get_memory_map(sys_table_arg, &boot_map);
145 if (status != EFI_SUCCESS)
146 return membase;
147
148 map.map_end = map.map + map_size;
149
150 for_each_efi_memory_desc_in_map(&map, md) {
151 if (md->attribute & EFI_MEMORY_WB) {
152 if (membase > md->phys_addr)
153 membase = md->phys_addr;
154 }
155 }
156
157 efi_call_early(free_pool, map.map);
158
159 return membase;
160 }
161
162 /*
163 * Allocate at the highest possible address that is not above 'max'.
164 */
165 efi_status_t efi_high_alloc(efi_system_table_t *sys_table_arg,
166 unsigned long size, unsigned long align,
167 unsigned long *addr, unsigned long max)
168 {
169 unsigned long map_size, desc_size, buff_size;
170 efi_memory_desc_t *map;
171 efi_status_t status;
172 unsigned long nr_pages;
173 u64 max_addr = 0;
174 int i;
175 struct efi_boot_memmap boot_map;
176
177 boot_map.map = &map;
178 boot_map.map_size = &map_size;
179 boot_map.desc_size = &desc_size;
180 boot_map.desc_ver = NULL;
181 boot_map.key_ptr = NULL;
182 boot_map.buff_size = &buff_size;
183
184 status = efi_get_memory_map(sys_table_arg, &boot_map);
185 if (status != EFI_SUCCESS)
186 goto fail;
187
188 /*
189 * Enforce minimum alignment that EFI requires when requesting
190 * a specific address. We are doing page-based allocations,
191 * so we must be aligned to a page.
192 */
193 if (align < EFI_ALLOC_ALIGN)
194 align = EFI_ALLOC_ALIGN;
195
196 nr_pages = round_up(size, EFI_ALLOC_ALIGN) / EFI_PAGE_SIZE;
197 again:
198 for (i = 0; i < map_size / desc_size; i++) {
199 efi_memory_desc_t *desc;
200 unsigned long m = (unsigned long)map;
201 u64 start, end;
202
203 desc = (efi_memory_desc_t *)(m + (i * desc_size));
204 if (desc->type != EFI_CONVENTIONAL_MEMORY)
205 continue;
206
207 if (desc->num_pages < nr_pages)
208 continue;
209
210 start = desc->phys_addr;
211 end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT);
212
213 if (end > max)
214 end = max;
215
216 if ((start + size) > end)
217 continue;
218
219 if (round_down(end - size, align) < start)
220 continue;
221
222 start = round_down(end - size, align);
223
224 /*
225 * Don't allocate at 0x0. It will confuse code that
226 * checks pointers against NULL.
227 */
228 if (start == 0x0)
229 continue;
230
231 if (start > max_addr)
232 max_addr = start;
233 }
234
235 if (!max_addr)
236 status = EFI_NOT_FOUND;
237 else {
238 status = efi_call_early(allocate_pages,
239 EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
240 nr_pages, &max_addr);
241 if (status != EFI_SUCCESS) {
242 max = max_addr;
243 max_addr = 0;
244 goto again;
245 }
246
247 *addr = max_addr;
248 }
249
250 efi_call_early(free_pool, map);
251 fail:
252 return status;
253 }
254
255 /*
256 * Allocate at the lowest possible address.
257 */
258 efi_status_t efi_low_alloc(efi_system_table_t *sys_table_arg,
259 unsigned long size, unsigned long align,
260 unsigned long *addr)
261 {
262 unsigned long map_size, desc_size, buff_size;
263 efi_memory_desc_t *map;
264 efi_status_t status;
265 unsigned long nr_pages;
266 int i;
267 struct efi_boot_memmap boot_map;
268
269 boot_map.map = &map;
270 boot_map.map_size = &map_size;
271 boot_map.desc_size = &desc_size;
272 boot_map.desc_ver = NULL;
273 boot_map.key_ptr = NULL;
274 boot_map.buff_size = &buff_size;
275
276 status = efi_get_memory_map(sys_table_arg, &boot_map);
277 if (status != EFI_SUCCESS)
278 goto fail;
279
280 /*
281 * Enforce minimum alignment that EFI requires when requesting
282 * a specific address. We are doing page-based allocations,
283 * so we must be aligned to a page.
284 */
285 if (align < EFI_ALLOC_ALIGN)
286 align = EFI_ALLOC_ALIGN;
287
288 nr_pages = round_up(size, EFI_ALLOC_ALIGN) / EFI_PAGE_SIZE;
289 for (i = 0; i < map_size / desc_size; i++) {
290 efi_memory_desc_t *desc;
291 unsigned long m = (unsigned long)map;
292 u64 start, end;
293
294 desc = (efi_memory_desc_t *)(m + (i * desc_size));
295
296 if (desc->type != EFI_CONVENTIONAL_MEMORY)
297 continue;
298
299 if (desc->num_pages < nr_pages)
300 continue;
301
302 start = desc->phys_addr;
303 end = start + desc->num_pages * (1UL << EFI_PAGE_SHIFT);
304
305 /*
306 * Don't allocate at 0x0. It will confuse code that
307 * checks pointers against NULL. Skip the first 8
308 * bytes so we start at a nice even number.
309 */
310 if (start == 0x0)
311 start += 8;
312
313 start = round_up(start, align);
314 if ((start + size) > end)
315 continue;
316
317 status = efi_call_early(allocate_pages,
318 EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
319 nr_pages, &start);
320 if (status == EFI_SUCCESS) {
321 *addr = start;
322 break;
323 }
324 }
325
326 if (i == map_size / desc_size)
327 status = EFI_NOT_FOUND;
328
329 efi_call_early(free_pool, map);
330 fail:
331 return status;
332 }
333
334 void efi_free(efi_system_table_t *sys_table_arg, unsigned long size,
335 unsigned long addr)
336 {
337 unsigned long nr_pages;
338
339 if (!size)
340 return;
341
342 nr_pages = round_up(size, EFI_ALLOC_ALIGN) / EFI_PAGE_SIZE;
343 efi_call_early(free_pages, addr, nr_pages);
344 }
345
346 /*
347 * Parse the ASCII string 'cmdline' for EFI options, denoted by the efi=
348 * option, e.g. efi=nochunk.
349 *
350 * It should be noted that efi= is parsed in two very different
351 * environments, first in the early boot environment of the EFI boot
352 * stub, and subsequently during the kernel boot.
353 */
354 efi_status_t efi_parse_options(char *cmdline)
355 {
356 char *str;
357
358 /*
359 * If no EFI parameters were specified on the cmdline we've got
360 * nothing to do.
361 */
362 str = strstr(cmdline, "efi=");
363 if (!str)
364 return EFI_SUCCESS;
365
366 /* Skip ahead to first argument */
367 str += strlen("efi=");
368
369 /*
370 * Remember, because efi= is also used by the kernel we need to
371 * skip over arguments we don't understand.
372 */
373 while (*str) {
374 if (!strncmp(str, "nochunk", 7)) {
375 str += strlen("nochunk");
376 __chunk_size = -1UL;
377 }
378
379 /* Group words together, delimited by "," */
380 while (*str && *str != ',')
381 str++;
382
383 if (*str == ',')
384 str++;
385 }
386
387 return EFI_SUCCESS;
388 }
389
390 /*
391 * Check the cmdline for a LILO-style file= arguments.
392 *
393 * We only support loading a file from the same filesystem as
394 * the kernel image.
395 */
396 efi_status_t handle_cmdline_files(efi_system_table_t *sys_table_arg,
397 efi_loaded_image_t *image,
398 char *cmd_line, char *option_string,
399 unsigned long max_addr,
400 unsigned long *load_addr,
401 unsigned long *load_size)
402 {
403 struct file_info *files;
404 unsigned long file_addr;
405 u64 file_size_total;
406 efi_file_handle_t *fh = NULL;
407 efi_status_t status;
408 int nr_files;
409 char *str;
410 int i, j, k;
411
412 file_addr = 0;
413 file_size_total = 0;
414
415 str = cmd_line;
416
417 j = 0; /* See close_handles */
418
419 if (!load_addr || !load_size)
420 return EFI_INVALID_PARAMETER;
421
422 *load_addr = 0;
423 *load_size = 0;
424
425 if (!str || !*str)
426 return EFI_SUCCESS;
427
428 for (nr_files = 0; *str; nr_files++) {
429 str = strstr(str, option_string);
430 if (!str)
431 break;
432
433 str += strlen(option_string);
434
435 /* Skip any leading slashes */
436 while (*str == '/' || *str == '\\')
437 str++;
438
439 while (*str && *str != ' ' && *str != '\n')
440 str++;
441 }
442
443 if (!nr_files)
444 return EFI_SUCCESS;
445
446 status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
447 nr_files * sizeof(*files), (void **)&files);
448 if (status != EFI_SUCCESS) {
449 pr_efi_err(sys_table_arg, "Failed to alloc mem for file handle list\n");
450 goto fail;
451 }
452
453 str = cmd_line;
454 for (i = 0; i < nr_files; i++) {
455 struct file_info *file;
456 efi_char16_t filename_16[256];
457 efi_char16_t *p;
458
459 str = strstr(str, option_string);
460 if (!str)
461 break;
462
463 str += strlen(option_string);
464
465 file = &files[i];
466 p = filename_16;
467
468 /* Skip any leading slashes */
469 while (*str == '/' || *str == '\\')
470 str++;
471
472 while (*str && *str != ' ' && *str != '\n') {
473 if ((u8 *)p >= (u8 *)filename_16 + sizeof(filename_16))
474 break;
475
476 if (*str == '/') {
477 *p++ = '\\';
478 str++;
479 } else {
480 *p++ = *str++;
481 }
482 }
483
484 *p = '\0';
485
486 /* Only open the volume once. */
487 if (!i) {
488 status = efi_open_volume(sys_table_arg, image,
489 (void **)&fh);
490 if (status != EFI_SUCCESS)
491 goto free_files;
492 }
493
494 status = efi_file_size(sys_table_arg, fh, filename_16,
495 (void **)&file->handle, &file->size);
496 if (status != EFI_SUCCESS)
497 goto close_handles;
498
499 file_size_total += file->size;
500 }
501
502 if (file_size_total) {
503 unsigned long addr;
504
505 /*
506 * Multiple files need to be at consecutive addresses in memory,
507 * so allocate enough memory for all the files. This is used
508 * for loading multiple files.
509 */
510 status = efi_high_alloc(sys_table_arg, file_size_total, 0x1000,
511 &file_addr, max_addr);
512 if (status != EFI_SUCCESS) {
513 pr_efi_err(sys_table_arg, "Failed to alloc highmem for files\n");
514 goto close_handles;
515 }
516
517 /* We've run out of free low memory. */
518 if (file_addr > max_addr) {
519 pr_efi_err(sys_table_arg, "We've run out of free low memory\n");
520 status = EFI_INVALID_PARAMETER;
521 goto free_file_total;
522 }
523
524 addr = file_addr;
525 for (j = 0; j < nr_files; j++) {
526 unsigned long size;
527
528 size = files[j].size;
529 while (size) {
530 unsigned long chunksize;
531 if (size > __chunk_size)
532 chunksize = __chunk_size;
533 else
534 chunksize = size;
535
536 status = efi_file_read(files[j].handle,
537 &chunksize,
538 (void *)addr);
539 if (status != EFI_SUCCESS) {
540 pr_efi_err(sys_table_arg, "Failed to read file\n");
541 goto free_file_total;
542 }
543 addr += chunksize;
544 size -= chunksize;
545 }
546
547 efi_file_close(files[j].handle);
548 }
549
550 }
551
552 efi_call_early(free_pool, files);
553
554 *load_addr = file_addr;
555 *load_size = file_size_total;
556
557 return status;
558
559 free_file_total:
560 efi_free(sys_table_arg, file_size_total, file_addr);
561
562 close_handles:
563 for (k = j; k < i; k++)
564 efi_file_close(files[k].handle);
565 free_files:
566 efi_call_early(free_pool, files);
567 fail:
568 *load_addr = 0;
569 *load_size = 0;
570
571 return status;
572 }
573 /*
574 * Relocate a kernel image, either compressed or uncompressed.
575 * In the ARM64 case, all kernel images are currently
576 * uncompressed, and as such when we relocate it we need to
577 * allocate additional space for the BSS segment. Any low
578 * memory that this function should avoid needs to be
579 * unavailable in the EFI memory map, as if the preferred
580 * address is not available the lowest available address will
581 * be used.
582 */
583 efi_status_t efi_relocate_kernel(efi_system_table_t *sys_table_arg,
584 unsigned long *image_addr,
585 unsigned long image_size,
586 unsigned long alloc_size,
587 unsigned long preferred_addr,
588 unsigned long alignment)
589 {
590 unsigned long cur_image_addr;
591 unsigned long new_addr = 0;
592 efi_status_t status;
593 unsigned long nr_pages;
594 efi_physical_addr_t efi_addr = preferred_addr;
595
596 if (!image_addr || !image_size || !alloc_size)
597 return EFI_INVALID_PARAMETER;
598 if (alloc_size < image_size)
599 return EFI_INVALID_PARAMETER;
600
601 cur_image_addr = *image_addr;
602
603 /*
604 * The EFI firmware loader could have placed the kernel image
605 * anywhere in memory, but the kernel has restrictions on the
606 * max physical address it can run at. Some architectures
607 * also have a prefered address, so first try to relocate
608 * to the preferred address. If that fails, allocate as low
609 * as possible while respecting the required alignment.
610 */
611 nr_pages = round_up(alloc_size, EFI_ALLOC_ALIGN) / EFI_PAGE_SIZE;
612 status = efi_call_early(allocate_pages,
613 EFI_ALLOCATE_ADDRESS, EFI_LOADER_DATA,
614 nr_pages, &efi_addr);
615 new_addr = efi_addr;
616 /*
617 * If preferred address allocation failed allocate as low as
618 * possible.
619 */
620 if (status != EFI_SUCCESS) {
621 status = efi_low_alloc(sys_table_arg, alloc_size, alignment,
622 &new_addr);
623 }
624 if (status != EFI_SUCCESS) {
625 pr_efi_err(sys_table_arg, "Failed to allocate usable memory for kernel.\n");
626 return status;
627 }
628
629 /*
630 * We know source/dest won't overlap since both memory ranges
631 * have been allocated by UEFI, so we can safely use memcpy.
632 */
633 memcpy((void *)new_addr, (void *)cur_image_addr, image_size);
634
635 /* Return the new address of the relocated image. */
636 *image_addr = new_addr;
637
638 return status;
639 }
640
641 /*
642 * Get the number of UTF-8 bytes corresponding to an UTF-16 character.
643 * This overestimates for surrogates, but that is okay.
644 */
645 static int efi_utf8_bytes(u16 c)
646 {
647 return 1 + (c >= 0x80) + (c >= 0x800);
648 }
649
650 /*
651 * Convert an UTF-16 string, not necessarily null terminated, to UTF-8.
652 */
653 static u8 *efi_utf16_to_utf8(u8 *dst, const u16 *src, int n)
654 {
655 unsigned int c;
656
657 while (n--) {
658 c = *src++;
659 if (n && c >= 0xd800 && c <= 0xdbff &&
660 *src >= 0xdc00 && *src <= 0xdfff) {
661 c = 0x10000 + ((c & 0x3ff) << 10) + (*src & 0x3ff);
662 src++;
663 n--;
664 }
665 if (c >= 0xd800 && c <= 0xdfff)
666 c = 0xfffd; /* Unmatched surrogate */
667 if (c < 0x80) {
668 *dst++ = c;
669 continue;
670 }
671 if (c < 0x800) {
672 *dst++ = 0xc0 + (c >> 6);
673 goto t1;
674 }
675 if (c < 0x10000) {
676 *dst++ = 0xe0 + (c >> 12);
677 goto t2;
678 }
679 *dst++ = 0xf0 + (c >> 18);
680 *dst++ = 0x80 + ((c >> 12) & 0x3f);
681 t2:
682 *dst++ = 0x80 + ((c >> 6) & 0x3f);
683 t1:
684 *dst++ = 0x80 + (c & 0x3f);
685 }
686
687 return dst;
688 }
689
690 #ifndef MAX_CMDLINE_ADDRESS
691 #define MAX_CMDLINE_ADDRESS ULONG_MAX
692 #endif
693
694 /*
695 * Convert the unicode UEFI command line to ASCII to pass to kernel.
696 * Size of memory allocated return in *cmd_line_len.
697 * Returns NULL on error.
698 */
699 char *efi_convert_cmdline(efi_system_table_t *sys_table_arg,
700 efi_loaded_image_t *image,
701 int *cmd_line_len)
702 {
703 const u16 *s2;
704 u8 *s1 = NULL;
705 unsigned long cmdline_addr = 0;
706 int load_options_chars = image->load_options_size / 2; /* UTF-16 */
707 const u16 *options = image->load_options;
708 int options_bytes = 0; /* UTF-8 bytes */
709 int options_chars = 0; /* UTF-16 chars */
710 efi_status_t status;
711 u16 zero = 0;
712
713 if (options) {
714 s2 = options;
715 while (*s2 && *s2 != '\n'
716 && options_chars < load_options_chars) {
717 options_bytes += efi_utf8_bytes(*s2++);
718 options_chars++;
719 }
720 }
721
722 if (!options_chars) {
723 /* No command line options, so return empty string*/
724 options = &zero;
725 }
726
727 options_bytes++; /* NUL termination */
728
729 status = efi_high_alloc(sys_table_arg, options_bytes, 0,
730 &cmdline_addr, MAX_CMDLINE_ADDRESS);
731 if (status != EFI_SUCCESS)
732 return NULL;
733
734 s1 = (u8 *)cmdline_addr;
735 s2 = (const u16 *)options;
736
737 s1 = efi_utf16_to_utf8(s1, s2, options_chars);
738 *s1 = '\0';
739
740 *cmd_line_len = options_bytes;
741 return (char *)cmdline_addr;
742 }
743
744 /*
745 * Handle calling ExitBootServices according to the requirements set out by the
746 * spec. Obtains the current memory map, and returns that info after calling
747 * ExitBootServices. The client must specify a function to perform any
748 * processing of the memory map data prior to ExitBootServices. A client
749 * specific structure may be passed to the function via priv. The client
750 * function may be called multiple times.
751 */
752 efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table_arg,
753 void *handle,
754 struct efi_boot_memmap *map,
755 void *priv,
756 efi_exit_boot_map_processing priv_func)
757 {
758 efi_status_t status;
759
760 status = efi_get_memory_map(sys_table_arg, map);
761
762 if (status != EFI_SUCCESS)
763 goto fail;
764
765 status = priv_func(sys_table_arg, map, priv);
766 if (status != EFI_SUCCESS)
767 goto free_map;
768
769 status = efi_call_early(exit_boot_services, handle, *map->key_ptr);
770
771 if (status == EFI_INVALID_PARAMETER) {
772 /*
773 * The memory map changed between efi_get_memory_map() and
774 * exit_boot_services(). Per the UEFI Spec v2.6, Section 6.4:
775 * EFI_BOOT_SERVICES.ExitBootServices we need to get the
776 * updated map, and try again. The spec implies one retry
777 * should be sufficent, which is confirmed against the EDK2
778 * implementation. Per the spec, we can only invoke
779 * get_memory_map() and exit_boot_services() - we cannot alloc
780 * so efi_get_memory_map() cannot be used, and we must reuse
781 * the buffer. For all practical purposes, the headroom in the
782 * buffer should account for any changes in the map so the call
783 * to get_memory_map() is expected to succeed here.
784 */
785 *map->map_size = *map->buff_size;
786 status = efi_call_early(get_memory_map,
787 map->map_size,
788 *map->map,
789 map->key_ptr,
790 map->desc_size,
791 map->desc_ver);
792
793 /* exit_boot_services() was called, thus cannot free */
794 if (status != EFI_SUCCESS)
795 goto fail;
796
797 status = priv_func(sys_table_arg, map, priv);
798 /* exit_boot_services() was called, thus cannot free */
799 if (status != EFI_SUCCESS)
800 goto fail;
801
802 status = efi_call_early(exit_boot_services, handle, *map->key_ptr);
803 }
804
805 /* exit_boot_services() was called, thus cannot free */
806 if (status != EFI_SUCCESS)
807 goto fail;
808
809 return EFI_SUCCESS;
810
811 free_map:
812 efi_call_early(free_pool, *map->map);
813 fail:
814 return status;
815 }