Messages in this thread | | | Subject | Re: [PATCH v2] powerpc: fix alignment bug whithin the init sections | From | Christophe Leroy <> | Date | Mon, 11 Jan 2021 08:06:16 +0100 |
| |
Le 02/01/2021 à 21:11, Ariel Marcovitch a écrit : > This is a bug that causes early crashes in builds with a > .exit.text section smaller than a page and a .init.text section that > ends in the beginning of a physical page (this is kinda random, which > might explain why this wasn't really encountered before). > > The init sections are ordered like this: > .init.text > .exit.text > .init.data > > Currently, these sections aren't page aligned. > > Because the init code might become read-only at runtime and because the > .init.text section can potentially reside on the same physical page as > .init.data, the beginning of .init.data might be mapped read-only along > with .init.text. > > Then when the kernel tries to modify a variable in .init.data (like > kthreadd_done, used in kernel_init()) the kernel panics. > > To avoid this, make _einittext page aligned and also align .exit.text > to make sure .init.data is always seperated from the text segments. > > Fixes: 060ef9d89d18 ("powerpc32: PAGE_EXEC required for inittext") > Signed-off-by: Ariel Marcovitch <ariel.marcovitch@gmail.com>
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
> --- > arch/powerpc/kernel/vmlinux.lds.S | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S > index 6db90cdf11da..b6c765d8e7ee 100644 > --- a/arch/powerpc/kernel/vmlinux.lds.S > +++ b/arch/powerpc/kernel/vmlinux.lds.S > @@ -187,6 +187,11 @@ SECTIONS > .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) { > _sinittext = .; > INIT_TEXT > + > + /* .init.text might be RO so we must > + * ensure this section ends in a page boundary. > + */ > + . = ALIGN(PAGE_SIZE); > _einittext = .; > #ifdef CONFIG_PPC64 > *(.tramp.ftrace.init); > @@ -200,6 +205,8 @@ SECTIONS > EXIT_TEXT > } > > + . = ALIGN(PAGE_SIZE); > + > .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { > INIT_DATA > } > > base-commit: 2c85ebc57b3e1817b6ce1a6b703928e113a90442 >
| |