Merge tag 'signed-efi-2018.11' of git://github.com/agraf/u-boot
authorTom Rini <trini@konsulko.com>
Wed, 17 Oct 2018 11:20:52 +0000 (07:20 -0400)
committerTom Rini <trini@konsulko.com>
Wed, 17 Oct 2018 11:20:52 +0000 (07:20 -0400)
Patch queue for efi - 2018-10-17

A few bug fixes for the 2018.11 release:

  - Fix block seeking on 32bit
  - Fix execution with DEBUG set
  - Fix a few Coverity found bugs
  - Fix warnings

Heinrich Schuchardt (13):
      efi_loader: fix relocation on x86_64
      efi_loader: correct signature of GetPosition, SetPosition
      efi_loader: execute efi_save_gd() first
      efi_loader: efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, ...)
      efi_loader: error handling in read_console()
      efi_loader: return type efi_console_register()
      efi_loader: superfluous statement in is_dir()
      efi_loader: memory leak in efi_set_variable()
      efi_loader: remove lcd.h from efi_net.c
      arm: do not include efi_loader.h twice
      efi_loader: fix typo in efi_boottime.c
      efi_selftest: creating new handle in controller test
      efi_loader: efi_dp_get_next_instance() superfluous statement

Tom Rini (2):
      efi_loader: Fix warning in efi_load_image()
      fs: fat: Fix warning in normalize_longname()

15 files changed:
arch/arm/lib/interrupts.c
cmd/bootefi.c
fs/fat/fat_write.c
include/efi_api.h
include/efi_loader.h
lib/charset.c
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_console.c
lib/efi_loader/efi_device_path.c
lib/efi_loader/efi_file.c
lib/efi_loader/efi_net.c
lib/efi_loader/efi_runtime.c
lib/efi_loader/efi_variable.c
lib/efi_selftest/efi_selftest_block_device.c
lib/efi_selftest/efi_selftest_controllers.c

index 930b25c..ee775ce 100644 (file)
@@ -22,7 +22,6 @@
 #include <efi_loader.h>
 #include <asm/proc-armv/ptrace.h>
 #include <asm/u-boot-arm.h>
-#include <efi_loader.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
index 82d755c..4d68d80 100644 (file)
@@ -40,6 +40,13 @@ efi_status_t efi_init_obj_list(void)
 {
        efi_status_t ret = EFI_SUCCESS;
 
+       /*
+        * On the ARM architecture gd is mapped to a fixed register (r9 or x18).
+        * As this register may be overwritten by an EFI payload we save it here
+        * and restore it on every callback entered.
+        */
+       efi_save_gd();
+
        /* Initialize once only */
        if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
                return efi_obj_list_initialized;
@@ -374,12 +381,6 @@ static efi_status_t do_bootefi_exec(void *efi,
        if (ret != EFI_SUCCESS)
                goto exit;
 
-       /*
-        * gd lives in a fixed register which may get clobbered while we execute
-        * the payload. So save it here and restore it on every callback entry
-        */
-       efi_save_gd();
-
        /* Transfer environment variable bootargs as load options */
        set_load_options(loaded_image_info, "bootargs");
        /* Load the EFI payload */
@@ -460,12 +461,6 @@ static int do_bootefi_bootmgr_exec(void)
        void *addr;
        efi_status_t r;
 
-       /*
-        * gd lives in a fixed register which may get clobbered while we execute
-        * the payload. So save it here and restore it on every callback entry
-        */
-       efi_save_gd();
-
        addr = efi_bootmgr_load(&device_path, &file_path);
        if (!addr)
                return 1;
@@ -547,11 +542,6 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (r != EFI_SUCCESS)
                        return CMD_RET_FAILURE;
 
-               /*
-                * gd lives in a fixed register which may get clobbered while we
-                * execute the payload. So save it here and restore it on every
-                * callback entry
-                */
                efi_save_gd();
                /* Transfer environment variable efi_selftest as load options */
                set_load_options(loaded_image_info, "efi_selftest");
index 9fcf3bc..3272412 100644 (file)
@@ -1012,7 +1012,7 @@ again:
 static int normalize_longname(char *l_filename, const char *filename)
 {
        const char *p, legal[] = "!#$%&\'()-.@^`_{}~";
-       char c;
+       unsigned char c;
        int name_len;
 
        /* Check that the filename is valid */
index bea19a5..e850b95 100644 (file)
@@ -914,9 +914,9 @@ struct efi_file_handle {
        efi_status_t (EFIAPI *write)(struct efi_file_handle *file,
                        efi_uintn_t *buffer_size, void *buffer);
        efi_status_t (EFIAPI *getpos)(struct efi_file_handle *file,
-                       efi_uintn_t *pos);
+                                     u64 *pos);
        efi_status_t (EFIAPI *setpos)(struct efi_file_handle *file,
-                       efi_uintn_t pos);
+                                     u64 pos);
        efi_status_t (EFIAPI *getinfo)(struct efi_file_handle *file,
                        const efi_guid_t *info_type, efi_uintn_t *buffer_size,
                        void *buffer);
index 34e44c6..1417c35 100644 (file)
@@ -236,7 +236,7 @@ efi_status_t efi_root_node_register(void);
 /* Called by bootefi to initialize runtime */
 efi_status_t efi_initialize_system_table(void);
 /* Called by bootefi to make console interface available */
-int efi_console_register(void);
+efi_status_t efi_console_register(void);
 /* Called by bootefi to make all disk storage accessible as EFI objects */
 efi_status_t efi_disk_register(void);
 /* Create handles and protocols for the partitions of a block device */
index 0cede9b..10557b9 100644 (file)
@@ -97,12 +97,17 @@ static u8 read_string(void *data)
 /**
  * read_console() - read byte from console
  *
- * @src                - not used, needed to match interface
- * Return:     - byte read
+ * @data       - not used, needed to match interface
+ * Return:     - byte read or 0 on error
  */
 static u8 read_console(void *data)
 {
-       return getc();
+       int ch;
+
+       ch = getc();
+       if (ch < 0)
+               ch = 0;
+       return ch;
 }
 
 int console_read_unicode(s32 *code)
index 97eb19c..da978d2 100644 (file)
@@ -1599,7 +1599,7 @@ static efi_status_t EFIAPI efi_load_image(bool boot_policy,
                                          efi_uintn_t source_size,
                                          efi_handle_t *image_handle)
 {
-       struct efi_loaded_image *info;
+       struct efi_loaded_image *info = NULL;
        struct efi_loaded_image_obj **image_obj =
                (struct efi_loaded_image_obj **)image_handle;
        efi_status_t ret;
@@ -2023,7 +2023,7 @@ static efi_status_t EFIAPI efi_open_protocol_information(
 
        /* Copy entries */
        buffer_size = count * sizeof(struct efi_open_protocol_info_entry);
-       r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
+       r = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, buffer_size,
                              (void **)entry_buffer);
        if (r != EFI_SUCCESS)
                goto out;
@@ -2080,7 +2080,7 @@ static efi_status_t EFIAPI efi_protocols_per_handle(
                size_t j = 0;
 
                buffer_size = sizeof(efi_guid_t *) * *protocol_buffer_count;
-               r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
+               r = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, buffer_size,
                                      (void **)protocol_buffer);
                if (r != EFI_SUCCESS)
                        return EFI_EXIT(r);
@@ -2133,7 +2133,7 @@ static efi_status_t EFIAPI efi_locate_handle_buffer(
                              *buffer);
        if (r != EFI_BUFFER_TOO_SMALL)
                goto out;
-       r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
+       r = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, buffer_size,
                              (void **)buffer);
        if (r != EFI_SUCCESS)
                goto out;
@@ -2506,7 +2506,7 @@ static efi_status_t efi_protocol_open(
                        if (item->info.attributes & EFI_OPEN_PROTOCOL_BY_DRIVER)
                                opened_by_driver = true;
                }
-               /* Only one controller can be conncected */
+               /* Only one controller can be connected */
                if (opened_by_driver)
                        return EFI_ACCESS_DENIED;
        }
index 7ecdbb1..0225222 100644 (file)
@@ -1045,8 +1045,10 @@ static void EFIAPI efi_key_notify(struct efi_event *event, void *context)
  * efi_console_register() - install the console protocols
  *
  * This function is called from do_bootefi_exec().
+ *
+ * Return:     status code
  */
-int efi_console_register(void)
+efi_status_t efi_console_register(void)
 {
        efi_status_t r;
        struct efi_object *efi_console_output_obj;
index 5a61a1c..46a24f7 100644 (file)
@@ -382,7 +382,6 @@ struct efi_device_path *efi_dp_get_next_instance(struct efi_device_path **dp,
                *size = 0;
        if (!dp || !*dp)
                return NULL;
-       p = *dp;
        sz = efi_dp_instance_size(*dp);
        p = dp_alloc(sz + sizeof(END));
        if (!p)
index 0753a36..beb4fba 100644 (file)
@@ -52,11 +52,18 @@ static int set_blk_dev(struct file_handle *fh)
        return fs_set_blk_dev_with_part(fh->fs->desc, fh->fs->part);
 }
 
+/**
+ * is_dir() - check if file handle points to directory
+ *
+ * We assume that set_blk_dev(fh) has been called already.
+ *
+ * @fh:                file handle
+ * Return:     true if file handle points to a directory
+ */
 static int is_dir(struct file_handle *fh)
 {
        struct fs_dir_stream *dirs;
 
-       set_blk_dev(fh);
        dirs = fs_opendir(fh->path);
        if (!dirs)
                return 0;
@@ -436,28 +443,51 @@ error:
        return EFI_EXIT(ret);
 }
 
+/**
+ * efi_file_getpos() - get current position in file
+ *
+ * This function implements the GetPosition service of the EFI file protocol.
+ * See the UEFI spec for details.
+ *
+ * @file:      file handle
+ * @pos:       pointer to file position
+ * Return:     status code
+ */
 static efi_status_t EFIAPI efi_file_getpos(struct efi_file_handle *file,
-                                          efi_uintn_t *pos)
+                                          u64 *pos)
 {
+       efi_status_t ret = EFI_SUCCESS;
        struct file_handle *fh = to_fh(file);
 
        EFI_ENTRY("%p, %p", file, pos);
 
-       if (fh->offset <= SIZE_MAX) {
-               *pos = fh->offset;
-               return EFI_EXIT(EFI_SUCCESS);
-       } else {
-               return EFI_EXIT(EFI_DEVICE_ERROR);
+       if (fh->isdir) {
+               ret = EFI_UNSUPPORTED;
+               goto out;
        }
+
+       *pos = fh->offset;
+out:
+       return EFI_EXIT(ret);
 }
 
+/**
+ * efi_file_setpos() - set current position in file
+ *
+ * This function implements the SetPosition service of the EFI file protocol.
+ * See the UEFI spec for details.
+ *
+ * @file:      file handle
+ * @pos:       new file position
+ * Return:     status code
+ */
 static efi_status_t EFIAPI efi_file_setpos(struct efi_file_handle *file,
-               efi_uintn_t pos)
+                                          u64 pos)
 {
        struct file_handle *fh = to_fh(file);
        efi_status_t ret = EFI_SUCCESS;
 
-       EFI_ENTRY("%p, %zu", file, pos);
+       EFI_ENTRY("%p, %llu", file, pos);
 
        if (fh->isdir) {
                if (pos != 0) {
index 034d0d2..4e8b2d5 100644 (file)
@@ -7,7 +7,6 @@
 
 #include <common.h>
 #include <efi_loader.h>
-#include <lcd.h>
 #include <malloc.h>
 
 static const efi_guid_t efi_net_guid = EFI_SIMPLE_NETWORK_GUID;
index c5fbd91..f059dc9 100644 (file)
@@ -41,9 +41,13 @@ static efi_status_t __efi_runtime EFIAPI efi_invalid_parameter(void);
 #elif defined(__arm__)
 #define R_RELATIVE     R_ARM_RELATIVE
 #define R_MASK         0xffULL
-#elif defined(__x86_64__) || defined(__i386__)
+#elif defined(__i386__)
 #define R_RELATIVE     R_386_RELATIVE
 #define R_MASK         0xffULL
+#elif defined(__x86_64__)
+#define R_RELATIVE     R_X86_64_RELATIVE
+#define R_MASK         0xffffffffULL
+#define IS_RELA                1
 #elif defined(__riscv)
 #define R_RELATIVE     R_RISCV_RELATIVE
 #define R_MASK         0xffULL
@@ -358,7 +362,8 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
 
                p = (void*)((ulong)rel->offset - base) + gd->relocaddr;
 
-               debug("%s: rel->info=%#lx *p=%#lx rel->offset=%p\n", __func__, rel->info, *p, rel->offset);
+               debug("%s: rel->info=%#lx *p=%#lx rel->offset=%p\n", __func__,
+                     rel->info, *p, rel->offset);
 
                switch (rel->info & R_MASK) {
                case R_RELATIVE:
@@ -377,6 +382,9 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
                }
 #endif
                default:
+                       if (!efi_runtime_tobedetached(p))
+                               printf("%s: Unknown relocation type %llx\n",
+                                      __func__, rel->info & R_MASK);
                        continue;
                }
 
@@ -385,8 +393,8 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
                    newaddr > (map->virtual_start +
                              (map->num_pages << EFI_PAGE_SHIFT)))) {
                        if (!efi_runtime_tobedetached(p))
-                               printf("U-Boot EFI: Relocation at %p is out of "
-                                      "range (%lx)\n", p, newaddr);
+                               printf("%s: Relocation at %p is out of "
+                                      "range (%lx)\n", __func__, p, newaddr);
                        continue;
                }
 
index a1313fa..19d9cb8 100644 (file)
@@ -294,8 +294,10 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, efi_guid_t *vendor,
        }
 
        val = malloc(2 * data_size + strlen("{ro,run,boot}(blob)") + 1);
-       if (!val)
-               return EFI_EXIT(EFI_OUT_OF_RESOURCES);
+       if (!val) {
+               ret = EFI_OUT_OF_RESOURCES;
+               goto out;
+       }
 
        s = val;
 
index 1cd1304..d4e4fac 100644 (file)
@@ -308,6 +308,7 @@ static int execute(void)
        } system_info;
        efi_uintn_t buf_size;
        char buf[16] __aligned(ARCH_DMA_MINALIGN);
+       u64 pos;
 
        /* Connect controller to virtual disk */
        ret = boottime->connect_controller(disk_handle, NULL, NULL, 1);
@@ -392,21 +393,36 @@ static int execute(void)
                efi_st_error("Failed to open file\n");
                return EFI_ST_FAILURE;
        }
+       ret = file->setpos(file, 1);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("SetPosition failed\n");
+               return EFI_ST_FAILURE;
+       }
        buf_size = sizeof(buf) - 1;
        ret = file->read(file, &buf_size, buf);
        if (ret != EFI_SUCCESS) {
                efi_st_error("Failed to read file\n");
                return EFI_ST_FAILURE;
        }
-       if (buf_size != 13) {
+       if (buf_size != 12) {
                efi_st_error("Wrong number of bytes read: %u\n",
                             (unsigned int)buf_size);
                return EFI_ST_FAILURE;
        }
-       if (efi_st_memcmp(buf, "Hello world!", 12)) {
+       if (efi_st_memcmp(buf, "ello world!", 11)) {
                efi_st_error("Unexpected file content\n");
                return EFI_ST_FAILURE;
        }
+       ret = file->getpos(file, &pos);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("GetPosition failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (pos != 13) {
+               efi_st_error("GetPosition returned %u, expected 13\n",
+                            (unsigned int)pos);
+               return EFI_ST_FAILURE;
+       }
        ret = file->close(file);
        if (ret != EFI_SUCCESS) {
                efi_st_error("Failed to close file\n");
@@ -434,6 +450,16 @@ static int execute(void)
                efi_st_error("Failed to close file\n");
                return EFI_ST_FAILURE;
        }
+       ret = file->getpos(file, &pos);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("GetPosition failed\n");
+               return EFI_ST_FAILURE;
+       }
+       if (pos != 7) {
+               efi_st_error("GetPosition returned %u, expected 7\n",
+                            (unsigned int)pos);
+               return EFI_ST_FAILURE;
+       }
 
        /* Verify file */
        boottime->set_mem(buf, sizeof(buf), 0);
index ceefa03..d08c377 100644 (file)
@@ -134,6 +134,8 @@ static efi_status_t EFIAPI start(
 
        /* Create child controllers */
        for (i = 0; i < NUMBER_OF_CHILD_CONTROLLERS; ++i) {
+               /* Creating a new handle for the child controller */
+               handle_child_controller[i] = 0;
                ret = boottime->install_protocol_interface(
                        &handle_child_controller[i], &guid_child_controller,
                        EFI_NATIVE_INTERFACE, NULL);