From: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com> To: linuxppc-dev@lists.ozlabs.org Cc: kexec@lists.infradead.org, x86@kernel.org, linux-kernel@vger.kernel.org, Eric Biederman <ebiederm@xmission.com>, Dave Young <dyoung@redhat.com>, Michael Ellerman <mpe@ellerman.id.au>, Mimi Zohar <zohar@linux.vnet.ibm.com>, Eric Richter <erichte@linux.vnet.ibm.com>, Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com> Subject: [PATCH 1/6] kexec_file: Add buffer hand-over support for the next kernel Date: Mon, 20 Jun 2016 22:44:31 -0300 [thread overview] Message-ID: <1466473476-10104-2-git-send-email-bauerman@linux.vnet.ibm.com> (raw) In-Reply-To: <1466473476-10104-1-git-send-email-bauerman@linux.vnet.ibm.com> The buffer hand-over mechanism allows the currently running kernel to pass data to kernel that will be kexec'd via a kexec segment. The second kernel can check whether the previous kernel sent data and retrieve it. This is the architecture-independent part of the feature. Signed-off-by: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com> --- include/linux/kexec.h | 40 ++++++++++++++++++++++++++ kernel/kexec_file.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/include/linux/kexec.h b/include/linux/kexec.h index a08cd986b5a1..72db95c623b3 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -325,6 +325,46 @@ int __weak arch_kexec_walk_mem(unsigned int image_type, unsigned long start, void arch_kexec_protect_crashkres(void); void arch_kexec_unprotect_crashkres(void); +#ifdef CONFIG_KEXEC_FILE +bool __weak kexec_can_hand_over_buffer(void); +int __weak arch_kexec_add_handover_buffer(struct kimage *image, + unsigned long load_addr, + unsigned long size); +int kexec_add_handover_buffer(struct kimage *image, void *buffer, + unsigned long bufsz, unsigned long memsz, + unsigned long buf_align, unsigned long buf_min, + unsigned long buf_max, bool top_down, + unsigned long *load_addr); +int __weak kexec_get_handover_buffer(void **addr, unsigned long *size); +int __weak kexec_free_handover_buffer(void); +#else +static inline bool kexec_can_hand_over_buffer(void) +{ + return false; +} + +static inline int kexec_add_handover_buffer(struct kimage *image, void *buffer, + unsigned long bufsz, + unsigned long memsz, + unsigned long buf_align, + unsigned long buf_min, + unsigned long buf_max, + bool top_down, bool checksum, + unsigned long *load_addr) +{ + return -ENOTSUPP; +} + +static inline int kexec_get_handover_buffer(void **addr, unsigned long *size) +{ + return -ENOTSUPP; +} + +static inline int kexec_free_handover_buffer(void) +{ + return -ENOTSUPP; +} +#endif /* CONFIG_KEXEC_FILE */ #else /* !CONFIG_KEXEC_CORE */ struct pt_regs; struct task_struct; diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 3e494261d32a..d6ba702654f5 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -113,6 +113,85 @@ void kimage_file_post_load_cleanup(struct kimage *image) image->image_loader_data = NULL; } +/** + * kexec_can_hand_over_buffer - can we pass data to the kexec'd kernel? + */ +bool __weak kexec_can_hand_over_buffer(void) +{ + return false; +} + +/** + * arch_kexec_add_handover_buffer - do arch-specific steps to handover buffer + * + * Architectures should use this function to pass on the handover buffer + * information to the next kernel. + * + * Return: 0 on success, negative errno on error. + */ +int __weak arch_kexec_add_handover_buffer(struct kimage *image, + unsigned long load_addr, + unsigned long size) +{ + return -ENOTSUPP; +} + +/** + * kexec_add_handover_buffer - add buffer to be used by the next kernel + * @image: kexec image to add buffer to. + * @buffer: Contents of the handover buffer. + * @bufsz: @buffer size. + * @memsz: Handover buffer size in memory. + * @buf_align: Buffer alignment restriction. + * @buf_min: Minimum address where buffer can be placed. + * @buf_max: Maximum address where buffer can be placed. + * @top_down: Find the highest available memory position for the buffer? + * @load_addr: On successful return, set to the physical memory address of the + * buffer in the next kernel. + * + * This function assumes that kexec_mutex is held. + * + * Return: 0 on success, negative errno on error. + */ +int kexec_add_handover_buffer(struct kimage *image, void *buffer, + unsigned long bufsz, unsigned long memsz, + unsigned long buf_align, unsigned long buf_min, + unsigned long buf_max, bool top_down, + unsigned long *load_addr) +{ + int ret; + + if (!kexec_can_hand_over_buffer()) + return -ENOTSUPP; + + ret = kexec_add_buffer(image, buffer, bufsz, memsz, buf_align, buf_min, + buf_max, top_down, load_addr); + if (ret) + return ret; + + return arch_kexec_add_handover_buffer(image, *load_addr, memsz); +} + +/** + * kexec_get_handover_buffer - get the handover buffer from the previous kernel + * @addr: On successful return, set to point to the buffer contents. + * @size: On successful return, set to the buffer size. + * + * Return: 0 on success, negative errno on error. + */ +int __weak kexec_get_handover_buffer(void **addr, unsigned long *size) +{ + return -ENOTSUPP; +} + +/** + * kexec_free_handover_buffer - free memory used by the handover buffer + */ +int __weak kexec_free_handover_buffer(void) +{ + return -ENOTSUPP; +} + /* * In file mode list of segments is prepared by kernel. Copy relevant * data from user space, do error checking, prepare segment list -- 1.9.1
WARNING: multiple messages have this Message-ID (diff)
From: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com> To: linuxppc-dev@lists.ozlabs.org Cc: Michael Ellerman <mpe@ellerman.id.au>, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, Eric Biederman <ebiederm@xmission.com>, Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>, Mimi Zohar <zohar@linux.vnet.ibm.com>, Dave Young <dyoung@redhat.com>, Eric Richter <erichte@linux.vnet.ibm.com> Subject: [PATCH 1/6] kexec_file: Add buffer hand-over support for the next kernel Date: Mon, 20 Jun 2016 22:44:31 -0300 [thread overview] Message-ID: <1466473476-10104-2-git-send-email-bauerman@linux.vnet.ibm.com> (raw) In-Reply-To: <1466473476-10104-1-git-send-email-bauerman@linux.vnet.ibm.com> The buffer hand-over mechanism allows the currently running kernel to pass data to kernel that will be kexec'd via a kexec segment. The second kernel can check whether the previous kernel sent data and retrieve it. This is the architecture-independent part of the feature. Signed-off-by: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com> --- include/linux/kexec.h | 40 ++++++++++++++++++++++++++ kernel/kexec_file.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/include/linux/kexec.h b/include/linux/kexec.h index a08cd986b5a1..72db95c623b3 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h @@ -325,6 +325,46 @@ int __weak arch_kexec_walk_mem(unsigned int image_type, unsigned long start, void arch_kexec_protect_crashkres(void); void arch_kexec_unprotect_crashkres(void); +#ifdef CONFIG_KEXEC_FILE +bool __weak kexec_can_hand_over_buffer(void); +int __weak arch_kexec_add_handover_buffer(struct kimage *image, + unsigned long load_addr, + unsigned long size); +int kexec_add_handover_buffer(struct kimage *image, void *buffer, + unsigned long bufsz, unsigned long memsz, + unsigned long buf_align, unsigned long buf_min, + unsigned long buf_max, bool top_down, + unsigned long *load_addr); +int __weak kexec_get_handover_buffer(void **addr, unsigned long *size); +int __weak kexec_free_handover_buffer(void); +#else +static inline bool kexec_can_hand_over_buffer(void) +{ + return false; +} + +static inline int kexec_add_handover_buffer(struct kimage *image, void *buffer, + unsigned long bufsz, + unsigned long memsz, + unsigned long buf_align, + unsigned long buf_min, + unsigned long buf_max, + bool top_down, bool checksum, + unsigned long *load_addr) +{ + return -ENOTSUPP; +} + +static inline int kexec_get_handover_buffer(void **addr, unsigned long *size) +{ + return -ENOTSUPP; +} + +static inline int kexec_free_handover_buffer(void) +{ + return -ENOTSUPP; +} +#endif /* CONFIG_KEXEC_FILE */ #else /* !CONFIG_KEXEC_CORE */ struct pt_regs; struct task_struct; diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 3e494261d32a..d6ba702654f5 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -113,6 +113,85 @@ void kimage_file_post_load_cleanup(struct kimage *image) image->image_loader_data = NULL; } +/** + * kexec_can_hand_over_buffer - can we pass data to the kexec'd kernel? + */ +bool __weak kexec_can_hand_over_buffer(void) +{ + return false; +} + +/** + * arch_kexec_add_handover_buffer - do arch-specific steps to handover buffer + * + * Architectures should use this function to pass on the handover buffer + * information to the next kernel. + * + * Return: 0 on success, negative errno on error. + */ +int __weak arch_kexec_add_handover_buffer(struct kimage *image, + unsigned long load_addr, + unsigned long size) +{ + return -ENOTSUPP; +} + +/** + * kexec_add_handover_buffer - add buffer to be used by the next kernel + * @image: kexec image to add buffer to. + * @buffer: Contents of the handover buffer. + * @bufsz: @buffer size. + * @memsz: Handover buffer size in memory. + * @buf_align: Buffer alignment restriction. + * @buf_min: Minimum address where buffer can be placed. + * @buf_max: Maximum address where buffer can be placed. + * @top_down: Find the highest available memory position for the buffer? + * @load_addr: On successful return, set to the physical memory address of the + * buffer in the next kernel. + * + * This function assumes that kexec_mutex is held. + * + * Return: 0 on success, negative errno on error. + */ +int kexec_add_handover_buffer(struct kimage *image, void *buffer, + unsigned long bufsz, unsigned long memsz, + unsigned long buf_align, unsigned long buf_min, + unsigned long buf_max, bool top_down, + unsigned long *load_addr) +{ + int ret; + + if (!kexec_can_hand_over_buffer()) + return -ENOTSUPP; + + ret = kexec_add_buffer(image, buffer, bufsz, memsz, buf_align, buf_min, + buf_max, top_down, load_addr); + if (ret) + return ret; + + return arch_kexec_add_handover_buffer(image, *load_addr, memsz); +} + +/** + * kexec_get_handover_buffer - get the handover buffer from the previous kernel + * @addr: On successful return, set to point to the buffer contents. + * @size: On successful return, set to the buffer size. + * + * Return: 0 on success, negative errno on error. + */ +int __weak kexec_get_handover_buffer(void **addr, unsigned long *size) +{ + return -ENOTSUPP; +} + +/** + * kexec_free_handover_buffer - free memory used by the handover buffer + */ +int __weak kexec_free_handover_buffer(void) +{ + return -ENOTSUPP; +} + /* * In file mode list of segments is prepared by kernel. Copy relevant * data from user space, do error checking, prepare segment list -- 1.9.1 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2016-06-21 6:58 UTC|newest] Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-06-21 1:44 [PATCH 0/6] kexec_file: Add buffer hand-over for the next kernel Thiago Jung Bauermann 2016-06-21 1:44 ` Thiago Jung Bauermann 2016-06-21 1:44 ` Thiago Jung Bauermann [this message] 2016-06-21 1:44 ` [PATCH 1/6] kexec_file: Add buffer hand-over support " Thiago Jung Bauermann 2016-06-21 1:44 ` [PATCH 2/6] powerpc: " Thiago Jung Bauermann 2016-06-21 1:44 ` Thiago Jung Bauermann 2016-06-21 1:44 ` [PATCH 3/6] kexec_file: Allow skipping checksum calculation for some segments Thiago Jung Bauermann 2016-06-21 1:44 ` Thiago Jung Bauermann 2016-06-21 1:44 ` [PATCH 4/6] kexec_file: Add mechanism to update kexec segments Thiago Jung Bauermann 2016-06-21 1:44 ` Thiago Jung Bauermann 2016-06-21 1:44 ` [PATCH 5/6] kexec: Share logic to copy segment page contents Thiago Jung Bauermann 2016-06-21 1:44 ` Thiago Jung Bauermann 2016-06-21 1:44 ` [PATCH 6/6] IMA: Demonstration code for kexec buffer passing Thiago Jung Bauermann 2016-06-21 1:44 ` Thiago Jung Bauermann 2016-06-22 1:20 ` [PATCH 0/6] kexec_file: Add buffer hand-over for the next kernel Dave Young 2016-06-22 1:20 ` Dave Young 2016-06-22 13:19 ` Mimi Zohar 2016-06-22 13:19 ` Mimi Zohar 2016-06-22 16:34 ` Thiago Jung Bauermann 2016-06-22 16:34 ` Thiago Jung Bauermann
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1466473476-10104-2-git-send-email-bauerman@linux.vnet.ibm.com \ --to=bauerman@linux.vnet.ibm.com \ --cc=dyoung@redhat.com \ --cc=ebiederm@xmission.com \ --cc=erichte@linux.vnet.ibm.com \ --cc=kexec@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=mpe@ellerman.id.au \ --cc=x86@kernel.org \ --cc=zohar@linux.vnet.ibm.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.