Message ID | 20180928064841.14117-1-takahiro.akashi@linaro.org |
---|---|
Headers | show |
Series | arm64: kexec: add kexec_file_load() support | expand |
On 10/08/18 17:37, AKASHI, Takahiro wrote: > On Fri, Oct 05, 2018 at 08:23:57AM -0500, Rob Herring wrote: >> On Thu, Oct 4, 2018 at 10:07 PM AKASHI, Takahiro >> <takahiro.akashi@linaro.org> wrote: >>> >>> Rob, >>> >>> # I haven't replied to this comment yet. >>> >>> On Fri, Sep 28, 2018 at 08:44:42AM -0500, Rob Herring wrote: >>>> +David Gibson >>>> >>>> On Fri, Sep 28, 2018 at 1:48 AM AKASHI Takahiro >>>> <takahiro.akashi@linaro.org> wrote: >>>>> >>>>> These functions will be used later to handle kexec-specific properties >>>>> in arm64's kexec_file implementation. >>>>> >>>>> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> >>>>> Cc: Rob Herring <robh+dt@kernel.org> >>>>> Cc: Frank Rowand <frowand.list@gmail.com> >>>>> Cc: devicetree@vger.kernel.org >>>>> --- >>>>> drivers/of/fdt.c | 56 ++++++++++++++++++++++++++++++++++++++++++ >>>>> include/linux/of_fdt.h | 4 +++ >>>>> 2 files changed, 60 insertions(+) >>>>> >>>>> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c >>>>> index 800ad252cf9c..c65c31562ccb 100644 >>>>> --- a/drivers/of/fdt.c >>>>> +++ b/drivers/of/fdt.c >>>>> @@ -25,6 +25,7 @@ >>>>> #include <linux/debugfs.h> >>>>> #include <linux/serial_core.h> >>>>> #include <linux/sysfs.h> >>>>> +#include <linux/types.h> >>>>> >>>>> #include <asm/setup.h> /* for COMMAND_LINE_SIZE */ >>>>> #include <asm/page.h> >>>>> @@ -1323,3 +1324,58 @@ late_initcall(of_fdt_raw_init); >>>>> #endif >>>>> >>>>> #endif /* CONFIG_OF_EARLY_FLATTREE */ >>>>> + >>>>> +#define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) >>>>> +#define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) >>>>> + >>>>> +int fdt_prop_len(const char *prop_name, int len) >>>>> +{ >>>>> + return (strlen(prop_name) + 1) + >>>>> + sizeof(struct fdt_property) + >>>>> + FDT_TAGALIGN(len); >>>> >>>> Looks like you are using this to calculate how much space you need to >>>> allocate in addition to the current DTB for a couple of new or >>>> replaced properties. I'm not sure that this calculation is completely >>>> accurate. And it is strange there doesn't seem to be any libfdt >>>> function for this already. It would be simpler to just add some fixed >>>> additional amount. >>>> >>>> Maybe David G has comments on this? >>>> >>>>> +} >>>>> + >>>> >>>> The rest of this should go in drivers/of/fdt_address.c. Ultimately, it >>>> should go into libfdt, but I'm fine with having it in the kernel for >>>> now. >>> >>> I'd like to have this function in the kernel for now. >>> >>>>> +static void fill_property(void *buf, u64 val64, int cells) >>>>> +{ >>>>> + __be32 val32; >>>>> + >>>>> + while (cells) { >>>>> + val32 = cpu_to_fdt32((val64 >> (32 * (--cells))) & U32_MAX); >>>>> + memcpy(buf, &val32, sizeof(val32)); >>>>> + buf += sizeof(val32); >>>> >>>> This is kind of hard to read. I would copy u-boot's fdt_pack_reg function. >>> >>> Are you sure? >>> I originally implemented this function in a similar way that fdt_pack_reg() >>> was, but, you suggested, in your past comment[1], that we'd be better to >>> have of_read_number()-like implementation. >>> >>> [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2018-May/579118.html >> >> Yeah, you're right. Plus, I'm not sure the u-boot one would work for >> unaligned accesses with armv5 and earlier h/w. >> >> My only comment then is I think you can drop the U32_MAX masking. > > Okay, then I will leave this function, yet renaming it to > cpu64_to_fdt_cells() after Frank's comment. I have second guessed myself and do not like the name I suggested because what the function really does is either cpu32 to be32 or cpu64 to be64. I agree with Rob that readability is important here. Instead of having a fill_property() function, how about having inline code, something like (untested even for thinkos): prop = buf; if (addr_cells == 1) { *(__be32 *)prop = cpu32_to_be32(addr); prop += 4; } else { *(__be64 *)prop = cpu64_to_be64(addr); prop += 8; } if (size_cells == 1) *(__be32 *)prop = cpu32_to_be32(size); else *(__be64 *)prop = cpu64_to_be64(size); You might want to also give Rob a chance to bike shed on this suggestion. -Frank > > Thanks, > -Takahiro Akashi >> >> Rob >
On 10/04/18 22:06, AKASHI, Takahiro wrote: > Frank, > > # I haven't reply to your comments. > > On Fri, Sep 28, 2018 at 02:13:58PM -0700, Frank Rowand wrote: >> On 09/28/18 06:44, Rob Herring wrote: >>> +David Gibson >>> >>> On Fri, Sep 28, 2018 at 1:48 AM AKASHI Takahiro >>> <takahiro.akashi@linaro.org> wrote: >>>> >>>> These functions will be used later to handle kexec-specific properties >>>> in arm64's kexec_file implementation. >> >> As I requested in version 14: >> >> The intent of the helper functions is related to properties whose values are >> tuples of the same format as the "reg" property of the "/memory" nodes. For >> example, the "linux,usable-memory-range" and "linux,elfcoredhr" properties of >> the "/chosen" node. >> >> The patch header and the function names should be updated to reflect this intent. > > I agree regarding the patch header. > >> >>>> >>>> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> >>>> Cc: Rob Herring <robh+dt@kernel.org> >>>> Cc: Frank Rowand <frowand.list@gmail.com> >>>> Cc: devicetree@vger.kernel.org >>>> --- >> >> Missing list of changes since version 14. > > Sorry for the inconvenience, but a whole change list goes into > the cover letter, not individual patches. That works for me, but please add us to the distro list for the cover letter. >>>> drivers/of/fdt.c | 56 ++++++++++++++++++++++++++++++++++++++++++ >>>> include/linux/of_fdt.h | 4 +++ >>>> 2 files changed, 60 insertions(+) >>>> >>>> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c >>>> index 800ad252cf9c..c65c31562ccb 100644 >>>> --- a/drivers/of/fdt.c >>>> +++ b/drivers/of/fdt.c >>>> @@ -25,6 +25,7 @@ >>>> #include <linux/debugfs.h> >>>> #include <linux/serial_core.h> >>>> #include <linux/sysfs.h> >>>> +#include <linux/types.h> >>>> >>>> #include <asm/setup.h> /* for COMMAND_LINE_SIZE */ >>>> #include <asm/page.h> >>>> @@ -1323,3 +1324,58 @@ late_initcall(of_fdt_raw_init); >>>> #endif >>>> >>>> #endif /* CONFIG_OF_EARLY_FLATTREE */ >> >> In v14 I requested: >> >> Please add comment: >> >> /* helper functions for arm64 kexec */ > > Okay. > >> >>>> + >>>> +#define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) >>>> +#define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) >>>> + >>>> +int fdt_prop_len(const char *prop_name, int len) >> >> In v14, I requested: >> >> Please rename as fdt_len_added_prop() > > Anyhow, I will drop this function, preferring to new > fdt_[address|size]_cells(). > >> I'm not really happy with my suggested name, but do not have a >> better one yet. As Rob notes, maybe David G will have a helpful >> comment. >> >>>> +{ >>>> + return (strlen(prop_name) + 1) + >>>> + sizeof(struct fdt_property) + >>>> + FDT_TAGALIGN(len); >>> >>> Looks like you are using this to calculate how much space you need to >>> allocate in addition to the current DTB for a couple of new or >>> replaced properties. I'm not sure that this calculation is completely >>> accurate. And it is strange there doesn't seem to be any libfdt >>> function for this already. It would be simpler to just add some fixed >>> additional amount. >>> >>> Maybe David G has comments on this? > > I'm not quit sure why it's not that accurate, but as I said in a reply to > David's comment, I will take your suggestion. > >>>> +} >>>> + >>> >>> The rest of this should go in drivers/of/fdt_address.c. Ultimately, it >>> should go into libfdt, but I'm fine with having it in the kernel for >>> now. >>> >>>> +static void fill_property(void *buf, u64 val64, int cells) >> >> In v14 I requested: >> >> Please rename as cpu64_to_fdt_cells() > > I don't mind, but this function may be dropped if Rob sticks to > u-boot's fdt_pack_reg() over my fdt_setprop_reg(). I have another comment a couple of minutes ago in the longer thread about this function. >> >>>> +{ >>>> + __be32 val32; >>>> + >>>> + while (cells) { >>>> + val32 = cpu_to_fdt32((val64 >> (32 * (--cells))) & U32_MAX); >>>> + memcpy(buf, &val32, sizeof(val32)); >>>> + buf += sizeof(val32); >>> >>> This is kind of hard to read. I would copy u-boot's fdt_pack_reg function. >>> >>> BTW, for purposes of moving to libfdt, we'll need the authors' >>> (Masahiro Yamada and Hans de Goede) permission to dual license. >>> >>>> + } >>>> +} >>>> + >>>> +int fdt_setprop_reg(void *fdt, int nodeoffset, const char *name, >>>> + u64 addr, u64 size) >>>> +{ >>>> + int addr_cells, size_cells; >> >> unsigned > > fdt_[address|size]_cell() returns an int. I stand corrected. They take advantage of the fact that valid values are in the range 0..4 and return a negative value for error. >>>> + char buf[sizeof(__be32) * 2 * 2]; >>>> + /* assume dt_root_[addr|size]_cells <= 2 */ >>>> + void *prop; >>>> + size_t buf_size; >>>> + >>>> + addr_cells = fdt_address_cells(fdt, 0); >>>> + if (addr_cells < 0) >>>> + return addr_cells; >>>> + size_cells = fdt_size_cells(fdt, 0); >>>> + if (size_cells < 0) >>>> + return size_cells; >>>> + >>>> + /* if *_cells >= 2, cells can hold 64-bit values anyway */ >>>> + if ((addr_cells == 1) && (addr > U32_MAX)) >>>> + return -FDT_ERR_BADVALUE; >>>> + >>>> + if ((size_cells == 1) && (size > U32_MAX)) >>>> + return -FDT_ERR_BADVALUE; >> >> In v14 I requested: >> >> Should also check that base + size does not wrap around. > > Okay, I will start discussion, as you have suggested, in devicetree-spec ML. > > Thanks, > -Takahiro Akashi > >> >>>> + >>>> + buf_size = (addr_cells + size_cells) * sizeof(u32); >>>> + prop = buf; >>>> + >>>> + fill_property(prop, addr, addr_cells); >>>> + prop += addr_cells * sizeof(u32); >>>> + >>>> + fill_property(prop, size, size_cells); >>>> + >>>> + return fdt_setprop(fdt, nodeoffset, name, buf, buf_size); >>>> +} >>>> diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h >>>> index b9cd9ebdf9b9..842af6ea92ea 100644 >>>> --- a/include/linux/of_fdt.h >>>> +++ b/include/linux/of_fdt.h >>>> @@ -108,5 +108,9 @@ static inline void unflatten_device_tree(void) {} >>>> static inline void unflatten_and_copy_device_tree(void) {} >>>> #endif /* CONFIG_OF_EARLY_FLATTREE */ >>>> >>>> +int fdt_prop_len(const char *prop_name, int len); >>>> +int fdt_setprop_reg(void *fdt, int nodeoffset, const char *name, >>>> + u64 addr, u64 size); >>>> + >>>> #endif /* __ASSEMBLY__ */ >>>> #endif /* _LINUX_OF_FDT_H */ >>>> -- >>>> 2.19.0 >>>> >>> >> >
This is the fifteenth round of implementing kexec_file_load() support on arm64.[1] (See "Changes" below) Most of the code is based on kexec-tools. # Since v15, we need a few prerequisite patches; See "Changes." # You will find them in [1], too. This patch series enables us to * load the kernel by specifying its file descriptor, instead of user- filled buffer, at kexec_file_load() system call, and * optionally verify its signature at load time for trusted boot. Kernel virtual address randomization is also supported since v9. Contrary to kexec_load() system call, as we discussed a long time ago, users may not be allowed to provide a device tree to the 2nd kernel explicitly, hence enforcing a dt blob of the first kernel to be re-used internally. To use kexec_file_load() system call, instead of kexec_load(), at kexec command, '-s' option must be specified. See [2] for a necessary patch for kexec-tools. To analyze a generated crash dump file, use the latest master branch of crash utility[3]. I always try to submit patches to fix any inconsistencies introduced in the latest kernel. Regarding a kernel image verification, a signature must be presented along with the binary itself. A signature is basically a hash value calculated against the whole binary data and encrypted by a key which will be authenticated by one of the system's trusted certificates. Any attempt to read and load a to-be-kexec-ed kernel image through a system call will be checked and blocked if the binary's hash value doesn't match its associated signature. There are two methods available now: 1. implementing arch-specific verification hook of kexec_file_load() 2. utilizing IMA(Integrity Measurement Architecture)[4] appraisal framework Before my v7, I believed that my patch only supports (1) but am now confident that (2) comes free if IMA is enabled and properly configured. (1) Arch-specific verification hook If CONFIG_KEXEC_VERIFY_SIG is enabled, kexec_file_load() invokes an arch- defined (and hence file-format-specific) hook function to check for the validity of kernel binary. On x86, a signature is embedded into a PE file (Microsoft's format) header of binary. Since arm64's "Image" can also be seen as a PE file as far as CONFIG_EFI is enabled, we adopt this format for kernel signing. As in the case of UEFI applications, we can create a signed kernel image: $ sbsign --key ${KEY} --cert ${CERT} Image You may want to use certs/signing_key.pem, which is intended to be used for module signing (CONFIG_MODULE_SIG), as ${KEY} and ${CERT} for test purpose. (2) IMA appraisal-based IMA was first introduced in linux in order to meet TCG (Trusted Computing Group) requirement that all the sensitive files be *measured* before reading/executing them to detect any untrusted changes/modification. Then appraisal feature, which allows us to ensure the integrity of files and even prevent them from reading/executing, was added later. Meanwhile, kexec_file_load() has been merged since v3.17 and evolved to enable IMA-appraisal type verification by the commit b804defe4297 ("kexec: replace call to copy_file_from_fd() with kernel version"). In this scheme, a signature will be stored in a extended file attribute, "security.ima" while a decryption key is hold in a dedicated keyring, ".ima" or "_ima". All the necessary process of verification is confined in a secure API, kernel_read_file_from_fd(), called by kexec_file_load(). Please note that powerpc is one of the two architectures now supporting KEXEC_FILE, and that it wishes to extend IMA, where a signature may be appended to "vmlinux" file[5], like module signing, instead of using an extended file attribute. While IMA meant to be used with TPM (Trusted Platform Module) on secure platform, IMA is still usable without TPM. Here is an example procedure about how we can give it a try to run the feature using a self-signed root ca for demo/test purposes: 1) Generate needed keys and certificates, following "Generate trusted keys" section in README of ima-evm-utils[6]. 2) Build the kernel with the following kernel configurations, specifying "ima-local-ca.pem" for CONFIG_SYSTEM_TRUSTED_KEYS: CONFIG_EXT4_FS_SECURITY CONFIG_INTEGRITY_SIGNATURE CONFIG_INTEGRITY_ASYMMETRIC_KEYS CONFIG_INTEGRITY_TRUSTED_KEYRING CONFIG_IMA CONFIG_IMA_WRITE_POLICY CONFIG_IMA_READ_POLICY CONFIG_IMA_APPRAISE CONFIG_IMA_APPRAISE_BOOTPARAM CONFIG_SYSTEM_TRUSTED_KEYS Please note that CONFIG_KEXEC_VERIFY_SIG is not, actually should not be, enabled. 3) Sign(label) a kernel image binary to be kexec-ed on target filesystem: $ evmctl ima_sign --key /path/to/private_key.pem /your/Image 4) Add a command line parameter and boot the kernel: ima_appraise=enforce On live system, 5) Set a security policy: $ mount -t securityfs none /sys/kernel/security $ echo "appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig" \ > /sys/kernel/security/ima/policy 6) Add a key for ima: $ keyctl padd asymmetric my_ima_key %:.ima < /path/to/x509_ima.der (or evmctl import /path/to/x509_ima.der <ima_keyring_id>) 7) Then try kexec as normal. Concerns(or future works): * Support for physical address randomization * Signature verification of big endian kernel with CONFIG_KEXEC_VERIFY_SIG While big-endian kernel can support kernel signing, I'm not sure that Image can be recognized as in PE format because x86 standard only defines little-endian-based format. * Support for vminux loading [1] http://git.linaro.org/people/takahiro.akashi/linux-aarch64.git branch:arm64/kexec_file [2] http://git.linaro.org/people/takahiro.akashi/kexec-tools.git branch:arm64/kexec_file [3] http://github.com/crash-utility/crash.git [4] https://sourceforge.net/p/linux-ima/wiki/Home/ [5] http://lkml.iu.edu//hypermail/linux/kernel/1707.0/03669.html [6] https://sourceforge.net/p/linux-ima/ima-evm-utils/ci/master/tree/ Changes in v15 (Sep 28, 2018) * rework fdt helper functions, utilizing new fdt_address_cells() and fdt_size_cells() from libfdt after Frank's comment This change requires the following patches to be applied as well: [7] http://lkml.iu.edu//hypermail/linux/kernel/1809.1/04800.html [8] https://www.spinics.net/lists/devicetree/msg250653.html Changes in v14 (Sep 7, 2018) * rebased to v4.19-rc * define default KEXEC_BUF_MEM_UNKNOWN which indicates that, if kexec_buf.mem does match it, kexec_locate_mem_hole() should allocate free memory for arch Changes in v13 (July 31, 2018) * rebased to arm64/for-next/core * system call number changed to 294 (kexec-tools must be updated as well.) * rename arch_kexec_walk_mem() to kexec_walk_resources() * define string macros for dtb properties' names in setup_dtb() * use MEMBLOCK_NONE rather than 0 at for_each_mem_range[_reverse]() * rename dtb_buf to dtb in struct kexec_arch at right place * provide "kaslr-seed" only if random number generator is available Changes in v12 (July 24, 2018) (mostly addressing James' comments) * unify all the variants of arch_kexec_walk_mem(), including s390's, into common code, leaving arch_kexec_walk_mem() static (i.e. no longer replaceable) * always initialize kbuf.mem to zero to align with a change above * set kbuf.buf_min/buf_max consistently between kexec and kdump * try to consistently use "unsigned long" for physical (kexec-time) address, and "void *" for virtual (runtime) address in load_other_segments() with a couple of variables renamed for readability * fix a 'sparse' warning against arch_kimage_file_post_load_cleanup() * fix a calculation of string length of "ARM64_MAGIC" * set kernel image alignment to MIN_KIMG_ALIGN rather than SZ_2M * set elf header alignment to SZ_64K rather than SZ_4K Changes in v11 (July 11, 2018) * split v10's patch#3, a refactoring stuff, into two parts, "just move" and modify * remove selecting BUILD_BIN2C from KEXEC_FILE config * modify setup_dtb() * to correct a return value on failure of fdt_xyz() call, * to always remove existing bootargs and initrd-start/end properties, if any, when copying current system's dtb into new dtb * to use fdt_setprop_string() for bootargs (I'm now sure that kimage->cmdline_buf is a null-terminated string.) * revise a warning comment in case of KEXEC_VERIFY_SIG but !(EFI && SIGNED_PE_FILE_VERIFICATION) Changes in v10 (June 23, 2018) * rebased to v4.18-rc * change syscall number of kexec_file_load from 292 to 293 * factor out memblock-based arch_kexec_walk_mem() from powerpc and merge it into generic one * move generic fdt helper functions from arm64 dir to drivers/of (dt_root_[addr|size]_cells are no longer __initdata.) * modify fill_property() to use 'while' loop * modify fdt_setprop_reg() to allocate a buffer on stack * modify setup_dtb() to use fdt_setprop_u64() * pass kernel_load_addr/size directly as arguments, instead of via kimage_arch.kern_segment, at load_other_segments() * refuse loading an image which cannot be supported in image loader, adding cpu-feature(MMFR0) helper functions * modify prepare_elf_headers() to use kmalloc() instead of vmalloc() * always pass arch.dtb_mem as the fourth argument to cpu_soft_restart() in machine_kexec() while dtb_mem will be zero in kexec case Changes in v9 (April 25, 2018) * rebased to v4.17-rc * remove preparatory patches on generic/x86/ppc code They have now been merged in v4.17-rc1. * allocate memory based on memblock list instead of system resources This will prevent reserved regions, particularly UEFI/ACPI data, from being corrupted. * correct dt property names, linux,initrd-*, in newly-created dtb "linux," was missing. * remove alignment requirement for initrd loading * add kaslr (kernel virtual address randomization) support * misc code clean-up * revise commit messages Changes in v8 (Feb 22, 2018) * introduce ARCH_HAS_KEXEC_PURGATORY so that arm64 will be able to skip purgatory * remove "ifdef CONFIG_X86_64" stuffs from a re-factored function, prepare_elf64_headers(), making its interface more generic (The original patch was split into two for easier reviews.) * modify cpu_soft_restart() so as to let the 2nd kernel jump into its entry code directly without requiring purgatory in case of kexec_file_load * remove CONFIG_KEXEC_FILE_IMAGE_FMT and introduce CONFIG_KEXEC_IMAGE_VERIFY_SIG, much similar to x86 but quite redundant for now. * In addition, update/modify dependencies of KEXEC_IMAGE_VERIFY_SIG Changes in v7 (Dec 4, 2017) * rebased to v4.15-rc2 * re-organize the patch set to separate KEXEC_FILE_VERIFY_SIG-related code from the others * revamp factored-out code in kernel/kexec_file.c due to the changes in original x86 code * redefine walk_sys_ram_res_rev() prototype due to change of callback type in the counterpart, walk_sys_ram_res() * make KEXEC_FILE_IMAGE_FMT default on if KEXEC_FILE selected Changes in v6 (Oct 24, 2017) * fix a for-loop bug in _kexec_kernel_image_probe() per Julien Changes in v5 (Oct 10, 2017) * fix kbuild errors around patch #3 per Julien's comments, * fix a bug in walk_system_ram_res_rev() with some cleanup * modify fdt_setprop_range() to use vmalloc() * modify fill_property() to use memset() Changes in v4 (Oct 2, 2017) * reinstate x86's arch_kexec_kernel_image_load() * rename weak arch_kexec_kernel_xxx() to _kexec_kernel_xxx() for better re-use * constify kexec_file_loaders[] Changes in v3 (Sep 15, 2017) * fix kbuild test error * factor out arch_kexec_kernel_*() & arch_kimage_file_post_load_cleanup() * remove CONFIG_CRASH_CORE guard from kexec_file.c * add vmapped kernel region to vmcore for gdb backtracing (see prepare_elf64_headers()) * merge asm/kexec_file.h into asm/kexec.h * and some cleanups Changes in v2 (Sep 8, 2017) * move core-header-related functions from crash_core.c to kexec_file.c * drop hash-check code from purgatory * modify purgatory asm to remove arch_kexec_apply_relocations_add() * drop older kernel support * drop vmlinux support (at least, for this series) Patch #1 to #10 are essential part for KEXEC_FILE support (additionally allowing for IMA-based verification): Patch #1 to #6 are all preparatory patches on generic side. Patch #7 to #11 are to enable kexec_file_load on arm64. Patch #12 to #13 are for KEXEC_VERIFY_SIG (arch-specific verification) support AKASHI Takahiro (16): asm-generic: add kexec_file_load system call to unistd.h kexec_file: make kexec_image_post_load_cleanup_default() global s390, kexec_file: drop arch_kexec_mem_walk() powerpc, kexec_file: factor out memblock-based arch_kexec_walk_mem() kexec_file: kexec_walk_memblock() only walks a dedicated region at kdump of/fdt: add helper functions for handling properties arm64: add image head flag definitions arm64: cpufeature: add MMFR0 helper functions arm64: enable KEXEC_FILE config arm64: kexec_file: load initrd and device-tree arm64: kexec_file: allow for loading Image-format kernel arm64: kexec_file: add crash dump support arm64: kexec_file: invoke the kernel without purgatory include: pe.h: remove message[] from mz header definition arm64: kexec_file: add kernel signature verification support arm64: kexec_file: add kaslr support arch/arm64/Kconfig | 33 ++ arch/arm64/include/asm/boot.h | 15 + arch/arm64/include/asm/cpufeature.h | 48 +++ arch/arm64/include/asm/kexec.h | 49 +++ arch/arm64/kernel/Makefile | 3 +- arch/arm64/kernel/cpu-reset.S | 8 +- arch/arm64/kernel/head.S | 2 +- arch/arm64/kernel/kexec_image.c | 123 +++++++ arch/arm64/kernel/machine_kexec.c | 12 +- arch/arm64/kernel/machine_kexec_file.c | 353 ++++++++++++++++++++ arch/arm64/kernel/relocate_kernel.S | 3 +- arch/powerpc/kernel/machine_kexec_file_64.c | 54 --- arch/s390/kernel/machine_kexec_file.c | 10 - drivers/of/fdt.c | 56 ++++ include/linux/kexec.h | 11 +- include/linux/of_fdt.h | 4 + include/linux/pe.h | 2 +- include/uapi/asm-generic/unistd.h | 4 +- kernel/kexec_file.c | 69 +++- 19 files changed, 778 insertions(+), 81 deletions(-) create mode 100644 arch/arm64/kernel/kexec_image.c create mode 100644 arch/arm64/kernel/machine_kexec_file.c -- 2.19.0