summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaptor Engineering Development Team <support@raptorengineering.com>2019-04-29 08:25:33 +0000
committerRaptor Engineering Development Team <support@raptorengineering.com>2019-04-29 08:25:42 +0000
commitef2bf42027bd0bce7691bbdf9d2e7e67ef68fa79 (patch)
treedd0e5f7dee29b1a15ecad95e20082f400d33451f
parentc2b02f0bf1ed7d908fb7574e519cdd15736cebd3 (diff)
downloadbuildroot-ef2bf42027bd0bce7691bbdf9d2e7e67ef68fa79.tar.gz
buildroot-ef2bf42027bd0bce7691bbdf9d2e7e67ef68fa79.zip
Apply FreeBSD kernel patch from upstream kexec-lite repository
-rw-r--r--package/kexec-lite/0002-fix-freebsd.patch53
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;
+ }
+ }
+
+
OpenPOWER on IntegriCloud