diff options
author | Toomas Soome <tsoome@me.com> | 2021-09-12 21:17:50 +0300 |
---|---|---|
committer | Toomas Soome <tsoome@me.com> | 2021-09-13 17:52:42 +0300 |
commit | 5388916ef6c753f570909efa4a196dfdc68d6fb7 (patch) | |
tree | 428e8024bc30fcda71cf8aeb109bb0fe2802c83d /usr/src | |
parent | 84d1e6ed41d92181afa03ace477b6c49aa83bcb1 (diff) | |
download | illumos-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.version | 2 | ||||
-rw-r--r-- | usr/src/boot/sys/boot/common/multiboot2.c | 6 | ||||
-rw-r--r-- | usr/src/boot/sys/boot/efi/loader/copy.c | 10 | ||||
-rw-r--r-- | usr/src/boot/sys/boot/efi/loader/loader_efi.h | 2 |
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 *); |