Jinglin Wen <jinglin....@shingroup.cn> writes: > According to the code logic, when the kernel is loaded to address 0, > no copying operation should be performed, but it is currently being > done. > > This patch fixes the issue where the kernel code was incorrectly > duplicated to address 0 when booting from address 0. > > Signed-off-by: Jinglin Wen <jinglin....@shingroup.cn> > --- > arch/powerpc/kernel/head_64.S | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-)
Thanks for the improved change log. The subject could probably still be clearer, maybe: Fix unnecessary copy to 0 when kernel is booted at address 0 Looks like this was introduced by: Fixes: b270bebd34e3 ("powerpc/64s: Run at the kernel virtual address earlier in boot") Cc: sta...@vger.kernel.org # v6.4+ Let me know if you think otherwise. Just out of interest, how are you hitting this bug? AFAIK none of our "normal" boot loaders will load the kernel at 0. > diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S > index 4690c219bfa4..6c73551bdc50 100644 > --- a/arch/powerpc/kernel/head_64.S > +++ b/arch/powerpc/kernel/head_64.S > @@ -647,7 +647,9 @@ __after_prom_start: > * Note: This process overwrites the OF exception vectors. > */ > LOAD_REG_IMMEDIATE(r3, PAGE_OFFSET) > - mr. r4,r26 /* In some cases the loader may */ > + tophys(r4,r26) > + cmplwi cr0,r4,0 /* runtime base addr is zero */ > + mr r4,r26 /* In some cases the loader may */ > beq 9f /* have already put us at zero */ That is a pretty minimal fix, but I think the code would be clearer if we just compared the source and destination addresses. Something like the diff below. Can you confirm that works for you. cheers diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 4690c219bfa4..6ad1435303f9 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S @@ -647,8 +647,9 @@ __after_prom_start: * Note: This process overwrites the OF exception vectors. */ LOAD_REG_IMMEDIATE(r3, PAGE_OFFSET) - mr. r4,r26 /* In some cases the loader may */ - beq 9f /* have already put us at zero */ + mr r4, r26 // Load the source address into r4 + cmpld cr0, r3, r4 // Check if source == dest + beq 9f // If so skip the copy li r6,0x100 /* Start offset, the first 0x100 */ /* bytes were copied earlier. */