sh: use P1 instead of P2 for kexec
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:
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.Signed-off-by Magnus Damm <[email protected]>---
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
-0void 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.