svn commit: r344718 - in head/stand/efi/loader/arch: arm i386
Rebecca Cran
bcran at FreeBSD.org
Sat Mar 2 04:02:12 UTC 2019
Author: bcran
Date: Sat Mar 2 04:02:11 2019
New Revision: 344718
URL: https://svnweb.freebsd.org/changeset/base/344718
Log:
EFI: don't call printf after ExitBootServices, since it uses Boot Services
ExitBootServices terminates all boot services including console access.
Attempting to call printf afterwards can result in a crash, depending on the
implementation.
Move any printf statements to before we call bi_load, and remove any that
depend on calling bi_load first.
Reviewed by: imp, tsoome
Differential Revision: https://reviews.freebsd.org/D19374
Modified:
head/stand/efi/loader/arch/arm/exec.c
head/stand/efi/loader/arch/i386/elf32_freebsd.c
Modified: head/stand/efi/loader/arch/arm/exec.c
==============================================================================
--- head/stand/efi/loader/arch/arm/exec.c Sat Mar 2 03:17:23 2019 (r344717)
+++ head/stand/efi/loader/arch/arm/exec.c Sat Mar 2 04:02:11 2019 (r344718)
@@ -74,16 +74,19 @@ __elfN(arm_exec)(struct preloaded_file *fp)
e = (Elf_Ehdr *)&fmp->md_data;
efi_time_fini();
+
+ entry = efi_translate(e->e_entry);
+
+ printf("Kernel entry at 0x%x...\n", (unsigned)entry);
+ printf("Kernel args: %s\n", fp->f_args);
+
if ((error = bi_load(fp->f_args, &modulep, &kernend)) != 0) {
efi_time_init();
return (error);
}
- entry = efi_translate(e->e_entry);
- printf("Kernel entry at 0x%x...\n", (unsigned)entry);
- printf("Kernel args: %s\n", fp->f_args);
- printf("modulep: %#x\n", modulep);
- printf("relocation_offset %llx\n", __elfN(relocation_offset));
+ /* At this point we've called ExitBootServices, so we can't call
+ * printf or any other function that uses Boot Services */
dev_cleanup();
Modified: head/stand/efi/loader/arch/i386/elf32_freebsd.c
==============================================================================
--- head/stand/efi/loader/arch/i386/elf32_freebsd.c Sat Mar 2 03:17:23 2019 (r344717)
+++ head/stand/efi/loader/arch/i386/elf32_freebsd.c Sat Mar 2 04:02:11 2019 (r344718)
@@ -75,14 +75,19 @@ elf32_exec(struct preloaded_file *fp)
ehdr = (Elf_Ehdr *)&(md->md_data);
efi_time_fini();
+
+ entry = ehdr->e_entry & 0xffffff;
+
+ printf("Start @ 0x%x ...\n", entry);
+
err = bi_load(fp->f_args, &modulep, &kernend);
if (err != 0) {
efi_time_init();
return(err);
}
- entry = ehdr->e_entry & 0xffffff;
- printf("Start @ 0x%x ...\n", entry);
+ /* At this point we've called ExitBootServices, so we can't call
+ * printf or any other function that uses Boot Services */
dev_cleanup();
__exec((void *)entry, boothowto, bootdev, 0, 0, 0, bootinfop, modulep, kernend);
More information about the svn-src-head
mailing list