summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorToomas Soome <tsoome@me.com>2021-09-12 21:17:50 +0300
committerToomas Soome <tsoome@me.com>2021-09-13 17:52:42 +0300
commit5388916ef6c753f570909efa4a196dfdc68d6fb7 (patch)
tree428e8024bc30fcda71cf8aeb109bb0fe2802c83d /usr/src
parent84d1e6ed41d92181afa03ace477b6c49aa83bcb1 (diff)
downloadillumos-gate-5388916ef6c753f570909efa4a196dfdc68d6fb7.tar.gz
14060 loader.efi: multiboot2_exec() should fall back to use module load address
Reviewed by: Robert Mustacchi <rm@fingolfin.org> Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/boot/Makefile.version2
-rw-r--r--usr/src/boot/sys/boot/common/multiboot2.c6
-rw-r--r--usr/src/boot/sys/boot/efi/loader/copy.c10
-rw-r--r--usr/src/boot/sys/boot/efi/loader/loader_efi.h2
4 files changed, 15 insertions, 5 deletions
diff --git a/usr/src/boot/Makefile.version b/usr/src/boot/Makefile.version
index 5d1cb29b2c..4ebe562cec 100644
--- a/usr/src/boot/Makefile.version
+++ b/usr/src/boot/Makefile.version
@@ -34,4 +34,4 @@ LOADER_VERSION = 1.1
# Use date like formatting here, YYYY.MM.DD.XX, without leading zeroes.
# The version is processed from left to right, the version number can only
# be increased.
-BOOT_VERSION = $(LOADER_VERSION)-2021.09.11.1
+BOOT_VERSION = $(LOADER_VERSION)-2021.09.12.1
diff --git a/usr/src/boot/sys/boot/common/multiboot2.c b/usr/src/boot/sys/boot/common/multiboot2.c
index 2d775f15aa..55af7d0456 100644
--- a/usr/src/boot/sys/boot/common/multiboot2.c
+++ b/usr/src/boot/sys/boot/common/multiboot2.c
@@ -1287,7 +1287,8 @@ multiboot2_exec(struct preloaded_file *fp)
* fix the mb_mod_start and mb_mod_end.
*/
mp->mb_mod_start = efi_physaddr(module, tmp, map,
- map_size / desc_size, desc_size, mp->mb_mod_end);
+ map_size / desc_size, desc_size, mfp->f_addr,
+ mp->mb_mod_end);
if (mp->mb_mod_start == 0)
panic("Could not find memory for module");
@@ -1303,7 +1304,8 @@ multiboot2_exec(struct preloaded_file *fp)
chunk = &relocator->rel_chunklist[i++];
chunk->chunk_vaddr = (EFI_VIRTUAL_ADDRESS)(uintptr_t)mbi;
chunk->chunk_paddr = efi_physaddr(module, tmp, map,
- map_size / desc_size, desc_size, mbi->mbi_total_size);
+ map_size / desc_size, desc_size, (uintptr_t)mbi,
+ mbi->mbi_total_size);
chunk->chunk_size = mbi->mbi_total_size;
STAILQ_INSERT_TAIL(head, chunk, chunk_next);
diff --git a/usr/src/boot/sys/boot/efi/loader/copy.c b/usr/src/boot/sys/boot/efi/loader/copy.c
index 77a0703136..491c6787c6 100644
--- a/usr/src/boot/sys/boot/efi/loader/copy.c
+++ b/usr/src/boot/sys/boot/efi/loader/copy.c
@@ -110,7 +110,8 @@ memmap_find(EFI_MEMORY_DESCRIPTOR *map, size_t count, UINTN dsize,
*/
vm_offset_t
efi_physaddr(multiboot_tag_module_t *module, vm_offset_t addr,
- EFI_MEMORY_DESCRIPTOR *map, size_t count, UINTN dsize, size_t size)
+ EFI_MEMORY_DESCRIPTOR *map, size_t count, UINTN dsize, vm_offset_t laddr,
+ size_t size)
{
multiboot_tag_module_t *mp;
vm_offset_t off;
@@ -140,6 +141,13 @@ efi_physaddr(multiboot_tag_module_t *module, vm_offset_t addr,
roundup((uintptr_t)mp + mp->mb_size, MULTIBOOT_TAG_ALIGN);
} while (off == 0);
+ /*
+ * memmap_find failed to get us address, try to use load
+ * address.
+ */
+ if (off == 0 || off >= UINT32_MAX)
+ off = addr_verify(module, laddr, size);
+
return (off);
}
diff --git a/usr/src/boot/sys/boot/efi/loader/loader_efi.h b/usr/src/boot/sys/boot/efi/loader/loader_efi.h
index 764e4fb1a4..77ef65e87a 100644
--- a/usr/src/boot/sys/boot/efi/loader/loader_efi.h
+++ b/usr/src/boot/sys/boot/efi/loader/loader_efi.h
@@ -62,7 +62,7 @@ vm_offset_t efi_loadaddr(u_int, void *, vm_offset_t);
void efi_free_loadaddr(vm_offset_t, size_t);
void * efi_translate(vm_offset_t);
vm_offset_t efi_physaddr(multiboot_tag_module_t *, vm_offset_t,
- EFI_MEMORY_DESCRIPTOR *, size_t, UINTN, size_t);
+ EFI_MEMORY_DESCRIPTOR *, size_t, UINTN, vm_offset_t, size_t);
void bi_isadir(void);
multiboot2_info_header_t *efi_copy_finish(struct relocator *);