Thread (22 messages) 22 messages, 3 authors, 2016-08-22

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.c
b/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(struct
kimage *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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help