Messages in this thread Patch in this message | | | Date | Wed, 5 Jun 2019 23:08:00 +0300 | From | Aaro Koskinen <> | Subject | Re: [PATCH v3] powerpc: fix kexec failure on book3s/32 |
| |
Hi,
On Mon, Jun 03, 2019 at 08:20:28AM +0000, Christophe Leroy wrote: > In the old days, _PAGE_EXEC didn't exist on 6xx aka book3s/32. > Therefore, allthough __mapin_ram_chunk() was already mapping kernel > text with PAGE_KERNEL_TEXT and the rest with PAGE_KERNEL, the entire > memory was executable. Part of the memory (first 512kbytes) was > mapped with BATs instead of page table, but it was also entirely > mapped as executable. > > In commit 385e89d5b20f ("powerpc/mm: add exec protection on > powerpc 603"), we started adding exec protection to some 6xx, namely > the 603, for pages mapped via pagetables. > > Then, in commit 63b2bc619565 ("powerpc/mm/32s: Use BATs for > STRICT_KERNEL_RWX"), the exec protection was extended to BAT mapped > memory, so that really only the kernel text could be executed. > > The problem here is that kexec is based on copying some code into > upper part of memory then executing it from there in order to install > a fresh new kernel at its definitive location. > > However, the code is position independant and first part of it is > just there to deactivate the MMU and jump to the second part. So it > is possible to run this first part inplace instead of running the > copy. Once the MMU is off, there is no protection anymore and the > second part of the code will just run as before. > > Reported-by: Aaro Koskinen <aaro.koskinen@iki.fi> > Fixes: 63b2bc619565 ("powerpc/mm/32s: Use BATs for STRICT_KERNEL_RWX") > Cc: stable@vger.kernel.org > Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> > --- > Aaro, can you test this patch ? Thanks.
Tested-by: Aaro Koskinen <aaro.koskinen@iki.fi>
A.
> arch/powerpc/include/asm/kexec.h | 3 +++ > arch/powerpc/kernel/machine_kexec_32.c | 4 +++- > 2 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h > index 4a585cba1787..c68476818753 100644 > --- a/arch/powerpc/include/asm/kexec.h > +++ b/arch/powerpc/include/asm/kexec.h > @@ -94,6 +94,9 @@ static inline bool kdump_in_progress(void) > return crashing_cpu >= 0; > } > > +void relocate_new_kernel(unsigned long indirection_page, unsigned long reboot_code_buffer, > + unsigned long start_address) __noreturn; > + > #ifdef CONFIG_KEXEC_FILE > extern const struct kexec_file_ops kexec_elf64_ops; > > diff --git a/arch/powerpc/kernel/machine_kexec_32.c b/arch/powerpc/kernel/machine_kexec_32.c > index affe5dcce7f4..2b160d68db49 100644 > --- a/arch/powerpc/kernel/machine_kexec_32.c > +++ b/arch/powerpc/kernel/machine_kexec_32.c > @@ -30,7 +30,6 @@ typedef void (*relocate_new_kernel_t)( > */ > void default_machine_kexec(struct kimage *image) > { > - extern const unsigned char relocate_new_kernel[]; > extern const unsigned int relocate_new_kernel_size; > unsigned long page_list; > unsigned long reboot_code_buffer, reboot_code_buffer_phys; > @@ -58,6 +57,9 @@ void default_machine_kexec(struct kimage *image) > reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); > printk(KERN_INFO "Bye!\n"); > > + if (!IS_ENABLED(CONFIG_FSL_BOOKE) && !IS_ENABLED(CONFIG_44x)) > + relocate_new_kernel(page_list, reboot_code_buffer_phys, image->start); > + > /* now call it */ > rnk = (relocate_new_kernel_t) reboot_code_buffer; > (*rnk)(page_list, reboot_code_buffer_phys, image->start); > -- > 2.13.3 >
| |