Re: [PATCH v2 2/6] powerpc: kexec_file: Add buffer hand-over support for the next kernel
From: Thiago Jung Bauermann <hidden>
Date: 2016-08-22 22:21:19
Also in:
kexec, linuxppc-dev
Am Montag, 22 August 2016, 15:22:00 schrieb Dave Young:
On 08/22/16 at 12:38am, Thiago Jung Bauermann wrote:quoted
Am Montag, 22 August 2016, 11:21:35 schrieb Dave Young:quoted
On 08/13/16 at 12:18am, Thiago Jung Bauermann wrote:quoted
diff --git a/arch/powerpc/kernel/machine_kexec_64.cb/arch/powerpc/kernel/machine_kexec_64.c index a484a6346146..190c652e49b7 100644--- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c@@ -490,6 +490,60 @@ int arch_kimage_file_post_load_cleanup(structkimage *image)> return image->fops->cleanup(image->image_loader_data); } +bool kexec_can_hand_over_buffer(void) +{ + return true; +} + +int arch_kexec_add_handover_buffer(struct kimage *image, + unsigned long load_addr, unsigned
long
quoted
size)quoted
quoted
+{ + image->arch.handover_buffer_addr = load_addr; + image->arch.handover_buffer_size = size; + + return 0; +} + +int kexec_get_handover_buffer(void **addr, unsigned long *size) +{ + int ret; + u64 start_addr, end_addr; + + ret = of_property_read_u64(of_chosen, + "linux,kexec-handover-buffer-
start",
quoted
quoted
quoted
+ &start_addr); + if (ret == -EINVAL) + return -ENOENT; + else if (ret) + return -EINVAL; + + ret = of_property_read_u64(of_chosen, "linux,kexec-handover-buffer-end", +&end_addr);quoted
quoted
+ if (ret == -EINVAL) + return -ENOENT; + else if (ret) + return -EINVAL; + + *addr = __va(start_addr); + /* -end is the first address after the buffer. */ + *size = end_addr - start_addr; + + return 0; +}This depends on dtb, so if IMA want to extend it to arches like x86 in the future you will have to think about other way to pass it. How about think about a general way now?The only general way I can think of is by adding a kernel command line parameter which the first kernel would pass to the second kernel, but IMHO that is ugly, because such parameter wouldn't be useful to a user, and it would also be something that, from the perspective of the user, would magically appear in the kernel command line of the second kernel...Sorry I just brought up the question, actually I have no idea either. Maybe we have to do this with arch specific ways..
Actually, I don't think it's possible to avoid arch-specific code because the first kernel has to put the buffer memory region in a reserved memory map, and that is arch-specific. On powerpc, this is done by adding it to the device tree memory reservation map. On x86, I believe this would be done added to the e820 map. -- []'s Thiago Jung Bauermann IBM Linux Technology Center