diff options
author | Raptor Engineering Development Team <support@raptorengineering.com> | 2019-04-29 08:25:33 +0000 |
---|---|---|
committer | Raptor Engineering Development Team <support@raptorengineering.com> | 2019-04-29 08:25:42 +0000 |
commit | ef2bf42027bd0bce7691bbdf9d2e7e67ef68fa79 (patch) | |
tree | dd0e5f7dee29b1a15ecad95e20082f400d33451f | |
parent | c2b02f0bf1ed7d908fb7574e519cdd15736cebd3 (diff) | |
download | buildroot-ef2bf42027bd0bce7691bbdf9d2e7e67ef68fa79.tar.gz buildroot-ef2bf42027bd0bce7691bbdf9d2e7e67ef68fa79.zip |
Apply FreeBSD kernel patch from upstream kexec-lite repository
-rw-r--r-- | package/kexec-lite/0002-fix-freebsd.patch | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/package/kexec-lite/0002-fix-freebsd.patch b/package/kexec-lite/0002-fix-freebsd.patch new file mode 100644 index 0000000000..1f9274ab51 --- /dev/null +++ b/package/kexec-lite/0002-fix-freebsd.patch @@ -0,0 +1,53 @@ +From 666c8464fd8e0ab2bc6f80aed393c97445b9a479 Mon Sep 17 00:00:00 2001 +From: Brandon Bergren <git@bdragon.rtk0.net> +Date: Mon, 15 Oct 2018 13:47:13 -0500 +Subject: [PATCH] Fix loading FreeBSD kernels with multiple PT_LOAD sections. + +Fix calculation of ELFv2 entry point. +--- + kexec.c | 29 +++++++++++++++++++---------- + 1 file changed, 19 insertions(+), 10 deletions(-) + +diff --git a/kexec.c b/kexec.c +index 2445afb..892d682 100644 +--- a/kexec.c ++++ b/kexec.c +@@ -280,18 +280,27 @@ static void load_kernel(char *image) + + memsize = ALIGN_UP(memsize, PAGE_SIZE_64K); + +- add_kexec_segment("kernel", p, size, +- (void *)(dest + paddr - start), +- memsize); +- +- /* Parse function descriptor for ELFv1 kernels */ +- if ((ehdr.e_flags & 3) == 2) +- kernel_entry = ehdr.e_entry; ++ if ((phdr.p_flags & PF_X) == PF_X) { ++ ++ add_kexec_segment("kernel", p, size, ++ (void *)(dest + paddr - start), ++ memsize); ++ ++ /* Parse function descriptor for ELFv1 kernels */ ++ if ((ehdr.e_flags & 3) == 2) ++ kernel_entry = ehdr.e_entry - phdr.p_vaddr; ++ else { ++ kernel_entry = get_entry_addr(e, ehdr, ehdr.e_entry) - phdr.p_vaddr; ++ debug_printf("Kernel entry: 0x%lx\n", kernel_entry); ++ } ++ kernel_addr += kernel_entry; ++ } + else { +- kernel_entry = get_entry_addr(e, ehdr, ehdr.e_entry) - phdr.p_vaddr; +- debug_printf("Kernel entry: 0x%lx\n", kernel_entry); ++ /* Extra non-executable segment. */ ++ add_kexec_segment("data", p, size, ++ (void *)(dest + paddr - start), ++ memsize); + } +- kernel_addr += kernel_entry; + } + } + + |