Merge tag 'efi-2020-10-rc1-5' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
[platform/kernel/u-boot.git] / cmd / bootefi.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  *  EFI application loader
4  *
5  *  Copyright (c) 2016 Alexander Graf
6  */
7
8 #define LOG_CATEGORY LOGC_EFI
9
10 #include <common.h>
11 #include <charset.h>
12 #include <command.h>
13 #include <dm.h>
14 #include <efi_loader.h>
15 #include <efi_selftest.h>
16 #include <env.h>
17 #include <errno.h>
18 #include <image.h>
19 #include <log.h>
20 #include <malloc.h>
21 #include <linux/libfdt.h>
22 #include <linux/libfdt_env.h>
23 #include <mapmem.h>
24 #include <memalign.h>
25 #include <asm-generic/sections.h>
26 #include <linux/linkage.h>
27
28 DECLARE_GLOBAL_DATA_PTR;
29
30 static struct efi_device_path *bootefi_image_path;
31 static struct efi_device_path *bootefi_device_path;
32
33 /**
34  * Set the load options of an image from an environment variable.
35  *
36  * @handle:             the image handle
37  * @env_var:            name of the environment variable
38  * @load_options:       pointer to load options (output)
39  * Return:              status code
40  */
41 static efi_status_t set_load_options(efi_handle_t handle, const char *env_var,
42                                      u16 **load_options)
43 {
44         struct efi_loaded_image *loaded_image_info;
45         size_t size;
46         const char *env = env_get(env_var);
47         u16 *pos;
48         efi_status_t ret;
49
50         *load_options = NULL;
51         ret = EFI_CALL(systab.boottime->open_protocol(
52                                         handle,
53                                         &efi_guid_loaded_image,
54                                         (void **)&loaded_image_info,
55                                         efi_root, NULL,
56                                         EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL));
57         if (ret != EFI_SUCCESS)
58                 return EFI_INVALID_PARAMETER;
59
60         loaded_image_info->load_options = NULL;
61         loaded_image_info->load_options_size = 0;
62         if (!env)
63                 goto out;
64
65         size = utf8_utf16_strlen(env) + 1;
66         loaded_image_info->load_options = calloc(size, sizeof(u16));
67         if (!loaded_image_info->load_options) {
68                 log_err("ERROR: Out of memory\n");
69                 EFI_CALL(systab.boottime->close_protocol(handle,
70                                                          &efi_guid_loaded_image,
71                                                          efi_root, NULL));
72                 return EFI_OUT_OF_RESOURCES;
73         }
74         pos = loaded_image_info->load_options;
75         *load_options = pos;
76         utf8_utf16_strcpy(&pos, env);
77         loaded_image_info->load_options_size = size * 2;
78
79 out:
80         return EFI_CALL(systab.boottime->close_protocol(handle,
81                                                         &efi_guid_loaded_image,
82                                                         efi_root, NULL));
83 }
84
85 #if !CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE)
86
87 /**
88  * copy_fdt() - Copy the device tree to a new location available to EFI
89  *
90  * The FDT is copied to a suitable location within the EFI memory map.
91  * Additional 12 KiB are added to the space in case the device tree needs to be
92  * expanded later with fdt_open_into().
93  *
94  * @fdtp:       On entry a pointer to the flattened device tree.
95  *              On exit a pointer to the copy of the flattened device tree.
96  *              FDT start
97  * Return:      status code
98  */
99 static efi_status_t copy_fdt(void **fdtp)
100 {
101         unsigned long fdt_ram_start = -1L, fdt_pages;
102         efi_status_t ret = 0;
103         void *fdt, *new_fdt;
104         u64 new_fdt_addr;
105         uint fdt_size;
106         int i;
107
108         for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
109                 u64 ram_start = gd->bd->bi_dram[i].start;
110                 u64 ram_size = gd->bd->bi_dram[i].size;
111
112                 if (!ram_size)
113                         continue;
114
115                 if (ram_start < fdt_ram_start)
116                         fdt_ram_start = ram_start;
117         }
118
119         /*
120          * Give us at least 12 KiB of breathing room in case the device tree
121          * needs to be expanded later.
122          */
123         fdt = *fdtp;
124         fdt_pages = efi_size_in_pages(fdt_totalsize(fdt) + 0x3000);
125         fdt_size = fdt_pages << EFI_PAGE_SHIFT;
126
127         /*
128          * Safe fdt location is at 127 MiB.
129          * On the sandbox convert from the sandbox address space.
130          */
131         new_fdt_addr = (uintptr_t)map_sysmem(fdt_ram_start + 0x7f00000 +
132                                              fdt_size, 0);
133         ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
134                                  EFI_ACPI_RECLAIM_MEMORY, fdt_pages,
135                                  &new_fdt_addr);
136         if (ret != EFI_SUCCESS) {
137                 /* If we can't put it there, put it somewhere */
138                 new_fdt_addr = (ulong)memalign(EFI_PAGE_SIZE, fdt_size);
139                 ret = efi_allocate_pages(EFI_ALLOCATE_MAX_ADDRESS,
140                                          EFI_ACPI_RECLAIM_MEMORY, fdt_pages,
141                                          &new_fdt_addr);
142                 if (ret != EFI_SUCCESS) {
143                         log_err("ERROR: Failed to reserve space for FDT\n");
144                         goto done;
145                 }
146         }
147         new_fdt = (void *)(uintptr_t)new_fdt_addr;
148         memcpy(new_fdt, fdt, fdt_totalsize(fdt));
149         fdt_set_totalsize(new_fdt, fdt_size);
150
151         *fdtp = (void *)(uintptr_t)new_fdt_addr;
152 done:
153         return ret;
154 }
155
156 static void efi_reserve_memory(u64 addr, u64 size)
157 {
158         /* Convert from sandbox address space. */
159         addr = (uintptr_t)map_sysmem(addr, 0);
160         if (efi_add_memory_map(addr, size,
161                                EFI_RESERVED_MEMORY_TYPE) != EFI_SUCCESS)
162                 log_err("Reserved memory mapping failed addr %llx size %llx\n",
163                         addr, size);
164 }
165
166 /**
167  * efi_carve_out_dt_rsv() - Carve out DT reserved memory ranges
168  *
169  * The mem_rsv entries of the FDT are added to the memory map. Any failures are
170  * ignored because this is not critical and we would rather continue to try to
171  * boot.
172  *
173  * @fdt: Pointer to device tree
174  */
175 static void efi_carve_out_dt_rsv(void *fdt)
176 {
177         int nr_rsv, i;
178         u64 addr, size;
179         int nodeoffset, subnode;
180
181         nr_rsv = fdt_num_mem_rsv(fdt);
182
183         /* Look for an existing entry and add it to the efi mem map. */
184         for (i = 0; i < nr_rsv; i++) {
185                 if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0)
186                         continue;
187                 efi_reserve_memory(addr, size);
188         }
189
190         /* process reserved-memory */
191         nodeoffset = fdt_subnode_offset(fdt, 0, "reserved-memory");
192         if (nodeoffset >= 0) {
193                 subnode = fdt_first_subnode(fdt, nodeoffset);
194                 while (subnode >= 0) {
195                         fdt_addr_t fdt_addr;
196                         fdt_size_t fdt_size;
197
198                         /* check if this subnode has a reg property */
199                         fdt_addr = fdtdec_get_addr_size_auto_parent(
200                                                 fdt, nodeoffset, subnode,
201                                                 "reg", 0, &fdt_size, false);
202                         /*
203                          * The /reserved-memory node may have children with
204                          * a size instead of a reg property.
205                          */
206                         if (fdt_addr != FDT_ADDR_T_NONE &&
207                             fdtdec_get_is_enabled(fdt, subnode))
208                                 efi_reserve_memory(fdt_addr, fdt_size);
209                         subnode = fdt_next_subnode(fdt, subnode);
210                 }
211         }
212 }
213
214 /**
215  * get_config_table() - get configuration table
216  *
217  * @guid:       GUID of the configuration table
218  * Return:      pointer to configuration table or NULL
219  */
220 static void *get_config_table(const efi_guid_t *guid)
221 {
222         size_t i;
223
224         for (i = 0; i < systab.nr_tables; i++) {
225                 if (!guidcmp(guid, &systab.tables[i].guid))
226                         return systab.tables[i].table;
227         }
228         return NULL;
229 }
230
231 #endif /* !CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE) */
232
233 /**
234  * efi_install_fdt() - install device tree
235  *
236  * If fdt is not EFI_FDT_USE_INTERNAL, the device tree located at that memory
237  * address will will be installed as configuration table, otherwise the device
238  * tree located at the address indicated by environment variable fdt_addr or as
239  * fallback fdtcontroladdr will be used.
240  *
241  * On architectures using ACPI tables device trees shall not be installed as
242  * configuration table.
243  *
244  * @fdt:        address of device tree or EFI_FDT_USE_INTERNAL to use the
245  *              the hardware device tree as indicated by environment variable
246  *              fdt_addr or as fallback the internal device tree as indicated by
247  *              the environment variable fdtcontroladdr
248  * Return:      status code
249  */
250 efi_status_t efi_install_fdt(void *fdt)
251 {
252         /*
253          * The EBBR spec requires that we have either an FDT or an ACPI table
254          * but not both.
255          */
256 #if CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE)
257         if (fdt) {
258                 log_err("ERROR: can't have ACPI table and device tree.\n");
259                 return EFI_LOAD_ERROR;
260         }
261 #else
262         bootm_headers_t img = { 0 };
263         efi_status_t ret;
264
265         if (fdt == EFI_FDT_USE_INTERNAL) {
266                 const char *fdt_opt;
267                 uintptr_t fdt_addr;
268
269                 /* Look for device tree that is already installed */
270                 if (get_config_table(&efi_guid_fdt))
271                         return EFI_SUCCESS;
272                 /* Check if there is a hardware device tree */
273                 fdt_opt = env_get("fdt_addr");
274                 /* Use our own device tree as fallback */
275                 if (!fdt_opt) {
276                         fdt_opt = env_get("fdtcontroladdr");
277                         if (!fdt_opt) {
278                                 log_err("ERROR: need device tree\n");
279                                 return EFI_NOT_FOUND;
280                         }
281                 }
282                 fdt_addr = simple_strtoul(fdt_opt, NULL, 16);
283                 if (!fdt_addr) {
284                         log_err("ERROR: invalid $fdt_addr or $fdtcontroladdr\n");
285                         return EFI_LOAD_ERROR;
286                 }
287                 fdt = map_sysmem(fdt_addr, 0);
288         }
289
290         /* Install device tree */
291         if (fdt_check_header(fdt)) {
292                 log_err("ERROR: invalid device tree\n");
293                 return EFI_LOAD_ERROR;
294         }
295
296         /* Prepare device tree for payload */
297         ret = copy_fdt(&fdt);
298         if (ret) {
299                 log_err("ERROR: out of memory\n");
300                 return EFI_OUT_OF_RESOURCES;
301         }
302
303         if (image_setup_libfdt(&img, fdt, 0, NULL)) {
304                 log_err("ERROR: failed to process device tree\n");
305                 return EFI_LOAD_ERROR;
306         }
307
308         /* Create memory reservations as indicated by the device tree */
309         efi_carve_out_dt_rsv(fdt);
310
311         /* Install device tree as UEFI table */
312         ret = efi_install_configuration_table(&efi_guid_fdt, fdt);
313         if (ret != EFI_SUCCESS) {
314                 log_err("ERROR: failed to install device tree\n");
315                 return ret;
316         }
317 #endif /* GENERATE_ACPI_TABLE */
318
319         return EFI_SUCCESS;
320 }
321
322 /**
323  * do_bootefi_exec() - execute EFI binary
324  *
325  * @handle:             handle of loaded image
326  * Return:              status code
327  *
328  * Load the EFI binary into a newly assigned memory unwinding the relocation
329  * information, install the loaded image protocol, and call the binary.
330  */
331 static efi_status_t do_bootefi_exec(efi_handle_t handle)
332 {
333         efi_status_t ret;
334         efi_uintn_t exit_data_size = 0;
335         u16 *exit_data = NULL;
336         u16 *load_options;
337
338         /* Transfer environment variable as load options */
339         ret = set_load_options(handle, "bootargs", &load_options);
340         if (ret != EFI_SUCCESS)
341                 return ret;
342
343         /* Call our payload! */
344         ret = EFI_CALL(efi_start_image(handle, &exit_data_size, &exit_data));
345         if (ret != EFI_SUCCESS) {
346                 log_err("## Application failed, r = %lu\n",
347                         ret & ~EFI_ERROR_MASK);
348                 if (exit_data) {
349                         log_err("## %ls\n", exit_data);
350                         efi_free_pool(exit_data);
351                 }
352         }
353
354         efi_restore_gd();
355
356         free(load_options);
357
358         return ret;
359 }
360
361 /**
362  * do_efibootmgr() - execute EFI boot manager
363  *
364  * Return:      status code
365  */
366 static int do_efibootmgr(void)
367 {
368         efi_handle_t handle;
369         efi_status_t ret;
370
371         ret = efi_bootmgr_load(&handle);
372         if (ret != EFI_SUCCESS) {
373                 log_notice("EFI boot manager: Cannot load any image\n");
374                 return CMD_RET_FAILURE;
375         }
376
377         ret = do_bootefi_exec(handle);
378
379         if (ret != EFI_SUCCESS)
380                 return CMD_RET_FAILURE;
381
382         return CMD_RET_SUCCESS;
383 }
384
385 /**
386  * do_bootefi_image() - execute EFI binary
387  *
388  * Set up memory image for the binary to be loaded, prepare device path, and
389  * then call do_bootefi_exec() to execute it.
390  *
391  * @image_opt:  string of image start address
392  * Return:      status code
393  */
394 static int do_bootefi_image(const char *image_opt)
395 {
396         void *image_buf;
397         unsigned long addr, size;
398         const char *size_str;
399         efi_status_t ret;
400
401 #ifdef CONFIG_CMD_BOOTEFI_HELLO
402         if (!strcmp(image_opt, "hello")) {
403                 char *saddr;
404
405                 saddr = env_get("loadaddr");
406                 size = __efi_helloworld_end - __efi_helloworld_begin;
407
408                 if (saddr)
409                         addr = simple_strtoul(saddr, NULL, 16);
410                 else
411                         addr = CONFIG_SYS_LOAD_ADDR;
412
413                 image_buf = map_sysmem(addr, size);
414                 memcpy(image_buf, __efi_helloworld_begin, size);
415
416                 efi_free_pool(bootefi_device_path);
417                 efi_free_pool(bootefi_image_path);
418                 bootefi_device_path = NULL;
419                 bootefi_image_path = NULL;
420         } else
421 #endif
422         {
423                 size_str = env_get("filesize");
424                 if (size_str)
425                         size = simple_strtoul(size_str, NULL, 16);
426                 else
427                         size = 0;
428
429                 addr = simple_strtoul(image_opt, NULL, 16);
430                 /* Check that a numeric value was passed */
431                 if (!addr && *image_opt != '0')
432                         return CMD_RET_USAGE;
433
434                 image_buf = map_sysmem(addr, size);
435         }
436         ret = efi_run_image(image_buf, size);
437
438         if (ret != EFI_SUCCESS)
439                 return CMD_RET_FAILURE;
440
441         return CMD_RET_SUCCESS;
442 }
443
444 /**
445  * efi_run_image() - run loaded UEFI image
446  *
447  * @source_buffer:      memory address of the UEFI image
448  * @source_size:        size of the UEFI image
449  * Return:              status code
450  */
451 efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size)
452 {
453         efi_handle_t mem_handle = NULL, handle;
454         struct efi_device_path *file_path = NULL;
455         efi_status_t ret;
456
457         if (!bootefi_device_path || !bootefi_image_path) {
458                 /*
459                  * Special case for efi payload not loaded from disk,
460                  * such as 'bootefi hello' or for example payload
461                  * loaded directly into memory via JTAG, etc:
462                  */
463                 file_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
464                                             (uintptr_t)source_buffer,
465                                             source_size);
466                 /*
467                  * Make sure that device for device_path exist
468                  * in load_image(). Otherwise, shell and grub will fail.
469                  */
470                 ret = efi_create_handle(&mem_handle);
471                 if (ret != EFI_SUCCESS)
472                         goto out;
473
474                 ret = efi_add_protocol(mem_handle, &efi_guid_device_path,
475                                        file_path);
476                 if (ret != EFI_SUCCESS)
477                         goto out;
478         } else {
479                 file_path = efi_dp_append(bootefi_device_path,
480                                           bootefi_image_path);
481         }
482
483         ret = EFI_CALL(efi_load_image(false, efi_root, file_path, source_buffer,
484                                       source_size, &handle));
485         if (ret != EFI_SUCCESS)
486                 goto out;
487
488         ret = do_bootefi_exec(handle);
489
490 out:
491         efi_delete_handle(mem_handle);
492         efi_free_pool(file_path);
493         return ret;
494 }
495
496 #ifdef CONFIG_CMD_BOOTEFI_SELFTEST
497 static efi_status_t bootefi_run_prepare(const char *load_options_path,
498                 struct efi_device_path *device_path,
499                 struct efi_device_path *image_path,
500                 struct efi_loaded_image_obj **image_objp,
501                 struct efi_loaded_image **loaded_image_infop)
502 {
503         efi_status_t ret;
504         u16 *load_options;
505
506         ret = efi_setup_loaded_image(device_path, image_path, image_objp,
507                                      loaded_image_infop);
508         if (ret != EFI_SUCCESS)
509                 return ret;
510
511         /* Transfer environment variable as load options */
512         return set_load_options((efi_handle_t)*image_objp, load_options_path,
513                                 &load_options);
514 }
515
516 /**
517  * bootefi_test_prepare() - prepare to run an EFI test
518  *
519  * Prepare to run a test as if it were provided by a loaded image.
520  *
521  * @image_objp:         pointer to be set to the loaded image handle
522  * @loaded_image_infop: pointer to be set to the loaded image protocol
523  * @path:               dummy file path used to construct the device path
524  *                      set in the loaded image protocol
525  * @load_options_path:  name of a U-Boot environment variable. Its value is
526  *                      set as load options in the loaded image protocol.
527  * Return:              status code
528  */
529 static efi_status_t bootefi_test_prepare
530                 (struct efi_loaded_image_obj **image_objp,
531                  struct efi_loaded_image **loaded_image_infop, const char *path,
532                  const char *load_options_path)
533 {
534         efi_status_t ret;
535
536         /* Construct a dummy device path */
537         bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE, 0, 0);
538         if (!bootefi_device_path)
539                 return EFI_OUT_OF_RESOURCES;
540
541         bootefi_image_path = efi_dp_from_file(NULL, 0, path);
542         if (!bootefi_image_path) {
543                 ret = EFI_OUT_OF_RESOURCES;
544                 goto failure;
545         }
546
547         ret = bootefi_run_prepare(load_options_path, bootefi_device_path,
548                                   bootefi_image_path, image_objp,
549                                   loaded_image_infop);
550         if (ret == EFI_SUCCESS)
551                 return ret;
552
553         efi_free_pool(bootefi_image_path);
554         bootefi_image_path = NULL;
555 failure:
556         efi_free_pool(bootefi_device_path);
557         bootefi_device_path = NULL;
558         return ret;
559 }
560
561 /**
562  * bootefi_run_finish() - finish up after running an EFI test
563  *
564  * @loaded_image_info: Pointer to a struct which holds the loaded image info
565  * @image_obj: Pointer to a struct which holds the loaded image object
566  */
567 static void bootefi_run_finish(struct efi_loaded_image_obj *image_obj,
568                                struct efi_loaded_image *loaded_image_info)
569 {
570         efi_restore_gd();
571         free(loaded_image_info->load_options);
572         efi_delete_handle(&image_obj->header);
573 }
574
575 /**
576  * do_efi_selftest() - execute EFI selftest
577  *
578  * Return:      status code
579  */
580 static int do_efi_selftest(void)
581 {
582         struct efi_loaded_image_obj *image_obj;
583         struct efi_loaded_image *loaded_image_info;
584         efi_status_t ret;
585
586         ret = bootefi_test_prepare(&image_obj, &loaded_image_info,
587                                    "\\selftest", "efi_selftest");
588         if (ret != EFI_SUCCESS)
589                 return CMD_RET_FAILURE;
590
591         /* Execute the test */
592         ret = EFI_CALL(efi_selftest(&image_obj->header, &systab));
593         bootefi_run_finish(image_obj, loaded_image_info);
594
595         return ret != EFI_SUCCESS;
596 }
597 #endif /* CONFIG_CMD_BOOTEFI_SELFTEST */
598
599 /**
600  * do_bootefi() - execute `bootefi` command
601  *
602  * @cmdtp:      table entry describing command
603  * @flag:       bitmap indicating how the command was invoked
604  * @argc:       number of arguments
605  * @argv:       command line arguments
606  * Return:      status code
607  */
608 static int do_bootefi(struct cmd_tbl *cmdtp, int flag, int argc,
609                       char *const argv[])
610 {
611         efi_status_t ret;
612         void *fdt;
613
614         if (argc < 2)
615                 return CMD_RET_USAGE;
616
617         /* Initialize EFI drivers */
618         ret = efi_init_obj_list();
619         if (ret != EFI_SUCCESS) {
620                 log_err("Error: Cannot initialize UEFI sub-system, r = %lu\n",
621                         ret & ~EFI_ERROR_MASK);
622                 return CMD_RET_FAILURE;
623         }
624
625         if (argc > 2) {
626                 uintptr_t fdt_addr;
627
628                 fdt_addr = simple_strtoul(argv[2], NULL, 16);
629                 fdt = map_sysmem(fdt_addr, 0);
630         } else {
631                 fdt = EFI_FDT_USE_INTERNAL;
632         }
633         ret = efi_install_fdt(fdt);
634         if (ret == EFI_INVALID_PARAMETER)
635                 return CMD_RET_USAGE;
636         else if (ret != EFI_SUCCESS)
637                 return CMD_RET_FAILURE;
638
639         if (!strcmp(argv[1], "bootmgr"))
640                 return do_efibootmgr();
641 #ifdef CONFIG_CMD_BOOTEFI_SELFTEST
642         else if (!strcmp(argv[1], "selftest"))
643                 return do_efi_selftest();
644 #endif
645
646         return do_bootefi_image(argv[1]);
647 }
648
649 #ifdef CONFIG_SYS_LONGHELP
650 static char bootefi_help_text[] =
651         "<image address> [fdt address]\n"
652         "  - boot EFI payload stored at address <image address>.\n"
653         "    If specified, the device tree located at <fdt address> gets\n"
654         "    exposed as EFI configuration table.\n"
655 #ifdef CONFIG_CMD_BOOTEFI_HELLO
656         "bootefi hello\n"
657         "  - boot a sample Hello World application stored within U-Boot\n"
658 #endif
659 #ifdef CONFIG_CMD_BOOTEFI_SELFTEST
660         "bootefi selftest [fdt address]\n"
661         "  - boot an EFI selftest application stored within U-Boot\n"
662         "    Use environment variable efi_selftest to select a single test.\n"
663         "    Use 'setenv efi_selftest list' to enumerate all tests.\n"
664 #endif
665         "bootefi bootmgr [fdt address]\n"
666         "  - load and boot EFI payload based on BootOrder/BootXXXX variables.\n"
667         "\n"
668         "    If specified, the device tree located at <fdt address> gets\n"
669         "    exposed as EFI configuration table.\n";
670 #endif
671
672 U_BOOT_CMD(
673         bootefi, 3, 0, do_bootefi,
674         "Boots an EFI payload from memory",
675         bootefi_help_text
676 );
677
678 /**
679  * efi_set_bootdev() - set boot device
680  *
681  * This function is called when a file is loaded, e.g. via the 'load' command.
682  * We use the path to this file to inform the UEFI binary about the boot device.
683  *
684  * @dev:        device, e.g. "MMC"
685  * @devnr:      number of the device, e.g. "1:2"
686  * @path:       path to file loaded
687  */
688 void efi_set_bootdev(const char *dev, const char *devnr, const char *path)
689 {
690         struct efi_device_path *device, *image;
691         efi_status_t ret;
692
693         /* efi_set_bootdev is typically called repeatedly, recover memory */
694         efi_free_pool(bootefi_device_path);
695         efi_free_pool(bootefi_image_path);
696
697         ret = efi_dp_from_name(dev, devnr, path, &device, &image);
698         if (ret == EFI_SUCCESS) {
699                 bootefi_device_path = device;
700                 if (image) {
701                         /* FIXME: image should not contain device */
702                         struct efi_device_path *image_tmp = image;
703
704                         efi_dp_split_file_path(image, &device, &image);
705                         efi_free_pool(image_tmp);
706                 }
707                 bootefi_image_path = image;
708         } else {
709                 bootefi_device_path = NULL;
710                 bootefi_image_path = NULL;
711         }
712 }