Skip to contentSkip to conversation

sh: use P1 instead of P2 for kexec

PATCH In review Magnus Damm 2 participants 2 messages Mar 18, 2009 SuperH

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 sh: use P1 instead of P2 for kexec

From: Magnus Damm <[email protected]>

Use P1 instead of P2 to enable cache when
moving data in the kexec assembly snippet.

---

Q: Maybe we need to flush data cache before jumping?

 arch/sh/kernel/machine_kexec.c   |    2 +-
 arch/sh/kernel/relocate_kernel.S |    6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)
arch/sh/kernel/machine_kexec.c +1 -1
@@ -100,7 +100,7 @@ void machine_kexec(struct kimage *image)
 #endif
 	/* now call it */
 	rnk = (relocate_new_kernel_t) reboot_code_buffer;
-	(*rnk)(page_list, reboot_code_buffer, P2SEGADDR(image->start));
+	(*rnk)(page_list, reboot_code_buffer, P1SEGADDR(image->start));
 }
 
 void arch_crash_save_vmcoreinfo(void)
arch/sh/kernel/relocate_kernel.S +3 -3
@@ -18,7 +18,7 @@ relocate_new_kernel:
 	/* r6 = start_address      */
 
 	mov.l	10f,r8	  /* PAGE_SIZE */
-	mov.l	11f,r9    /* P2SEG */
+	mov.l	11f,r9    /* P1SEG */
 
 	/*  stack setting */
 	add	r8,r5
@@ -29,7 +29,7 @@ relocate_new_kernel:
 0:
 	mov.l	@r4+,r0	  /* cmd = *ind++ */
 
-1:	/* addr = (cmd | P2SEG) & 0xfffffff0 */
+1:	/* addr = (cmd | P1SEG) & 0xfffffff0 */
 	mov	r0,r2
 	or	r9,r2
 	mov	#-16,r1
@@ -86,7 +86,7 @@ relocate_new_kernel:
 10:
 	.long	PAGE_SIZE
 11:
-	.long	P2SEG
+	.long	P1SEG
 
 relocate_new_kernel_end:
 
#1 lore raw
Quoted 10 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Use P1 instead of P2 to enable cache when
moving data in the kexec assembly snippet.

---

Q: Maybe we need to flush data cache before jumping?

We ought to just get rid of it completely. Almost every use of P1 and P2SEGADDR in the kernel is useless on newer parts and should be killed.

Quoted 7 lines
 arch/sh/kernel/machine_kexec.c   |    2 +-
 arch/sh/kernel/relocate_kernel.S |    6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

arch/sh/kernel/machine_kexec.c void machine_kexec(struct kimage *image) · line 105

Quoted 7 lines
arch/sh/kernel/machine_kexec.c +1 -1
@@ -100,7 +100,7 @@ void machine_kexec(struct kimage *image)
 #endif
 	/* now call it */
 	rnk = (relocate_new_kernel_t) reboot_code_buffer;
-	(*rnk)(page_list, reboot_code_buffer, P2SEGADDR(image->start));
+	(*rnk)(page_list, reboot_code_buffer, P1SEGADDR(image->start));
 }
 

This should just be plain old image->start.

Quoted 22 lines
arch/sh/kernel/machine_kexec.c +0 -0
 void arch_crash_save_vmcoreinfo(void)
arch/sh/kernel/relocate_kernel.S +2 -2
@@ -18,7 +18,7 @@ relocate_new_kernel:
 	/* r6 = start_address      */
 
 	mov.l	10f,r8	  /* PAGE_SIZE */
-	mov.l	11f,r9    /* P2SEG */
+	mov.l	11f,r9    /* P1SEG */
 
 	/*  stack setting */
 	add	r8,r5
@@ -29,7 +29,7 @@ relocate_new_kernel:
 0:
 	mov.l	@r4+,r0	  /* cmd = *ind++ */
 
-1:	/* addr = (cmd | P2SEG) & 0xfffffff0 */
+1:	/* addr = (cmd | P1SEG) & 0xfffffff0 */
 	mov	r0,r2
 	or	r9,r2
 	mov	#-16,r1

arch/sh/kernel/relocate_kernel.S relocate_new_kernel: · line 92

Quoted 8 lines
arch/sh/kernel/relocate_kernel.S +1 -1
@@ -86,7 +86,7 @@ relocate_new_kernel:
 10:
 	.long	PAGE_SIZE
 11:
-	.long	P2SEG
+	.long	P1SEG
 
 relocate_new_kernel_end:
 

All of this P1/P2 crap in the assembly code should die. MIPS solves this in a much cleaner fashion by looping over the page list and patching the pointer with phys_to_virt() calls to accomplish the same thing:

	/*
	 * The generic kexec code builds a page list with physical
	 * addresses. they are directly accessible through KSEG0 (or
	 * CKSEG0 or XPHYS if on 64bit system), hence the
	 * pys_to_virt() call.
	 */
	for (ptr = &image->head; (entry = *ptr) && !(entry &IND_DONE);
	     ptr = (entry & IND_INDIRECTION) ?
	       phys_to_virt(entry & PAGE_MASK) : ptr + 1) {
		if (*ptr & IND_SOURCE || *ptr & IND_INDIRECTION ||
		    *ptr & IND_DESTINATION)
			*ptr = (unsigned long) phys_to_virt(*ptr);
	}

With this in place, all P1 and P2 references should be killable in the assembly itself.