CRIS v10: vmlinux.lds.S Fix kernel oops on boot and use common defines
PATCH 1/1 CRIS v10: vmlinux.lds.S Fix kernel oops on boot and use common defines
- Move alignment to page size of init data outside ifdef for BLK_DEV_INITRD. The reservation up to page size of memory after init data was previously not done if BLK_DEV_INITRD was undefined.
This caused a kernel oops when init memory pages were freed after startup, data placed in the same page as the last init memory would also be freed and reused, with disastrous results.
- Use macros for initcalls and .text sections.
- Replace hardcoded page size constant with PAGE_SIZE define.
- Change include/asm-cris/page.h to use the _AC macro to instead of testing __ASSEMBLY__.
---
NOTE: This patch supercedes arch-cris-arch-v10-vmlinuxldss-fix-boot-problem.patch by Yuusei KUWANA <[email protected]> in the -mm tree.
That patch only restricts which sections are counted as init memory, and does not solve the underlying problem (that memory that is not part of init data can be freed)
arch/cris/arch-v10/vmlinux.lds.S | 33 +++++++++++++++------------------ include/asm-cris/page.h | 7 ++----- 2 files changed, 17 insertions(+), 23 deletions(-)
arch/cris/arch-v10/vmlinux.lds.S +15 -18
@@ -9,7 +9,8 @@ */ #include <asm-generic/vmlinux.lds.h> - +#include <asm/page.h> + jiffies = jiffies_64; SECTIONS {
@@ -23,7 +24,7 @@ SECTIONS _stext = .; __stext = .; .text : { - *(.text) + TEXT_TEXT SCHED_TEXT LOCK_TEXT *(.fixup)
@@ -49,10 +50,10 @@ SECTIONS __edata = . ; /* End of data section */ _edata = . ; - . = ALIGN(8192); /* init_task and stack, must be aligned */ + . = ALIGN(PAGE_SIZE); /* init_task and stack, must be aligned */ .data.init_task : { *(.data.init_task) } - . = ALIGN(8192); /* Init code and data */ + . = ALIGN(PAGE_SIZE); /* Init code and data */ __init_begin = .; .init.text : { _sinittext = .;
@@ -66,13 +67,7 @@ SECTIONS __setup_end = .; .initcall.init : { __initcall_start = .; - *(.initcall1.init); - *(.initcall2.init); - *(.initcall3.init); - *(.initcall4.init); - *(.initcall5.init); - *(.initcall6.init); - *(.initcall7.init); + INITCALLS __initcall_end = .; }
@@ -88,16 +83,18 @@ SECTIONS __initramfs_start = .; *(.init.ramfs) __initramfs_end = .; - /* We fill to the next page, so we can discard all init - pages without needing to consider what payload might be - appended to the kernel image. */ - FILL (0); - . = ALIGN (8192); } #endif - __vmlinux_end = .; /* last address of the physical file */ - __init_end = .; + + /* + * We fill to the next page, so we can discard all init + * pages without needing to consider what payload might be + * appended to the kernel image. + */ + . = ALIGN(PAGE_SIZE); + + __init_end = .; __data_end = . ; /* Move to _edata ? */ __bss_start = .; /* BSS */
include/asm-cris/page.h +2 -5
@@ -4,14 +4,11 @@#ifdef __KERNEL__#include <asm/arch/page.h> +#include <linux/const.h> /* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 13 -#ifndef __ASSEMBLY__ -#define PAGE_SIZE (1UL << PAGE_SHIFT) -#else -#define PAGE_SIZE (1 << PAGE_SHIFT) -#endif +#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT)#define PAGE_MASK (~(PAGE_SIZE-1))#define clear_page (page) memset((void *)(page), 0, PAGE_SIZE)
Signature · 6 lines
1.5.3.6.970.gd25430
/^JN - Jesper Nilsson
--
Jesper Nilsson -- [email protected]Quoted 7 lines · Jesper Nilsson
- Move alignment to page size of init data outside ifdef for
BLK_DEV_INITRD. The reservation up to page size of memory after init data was previously not done ifBLK_DEV_INITRDwas undefined.
This caused a kernel oops when init memory pages were freed after startup, data placed in the same page as the last init memory would also be freed and reused, with disastrous results.
Quoted 6 lines
- Use macros for initcalls and .text sections.
- Replace hardcoded page size constant with
PAGE_SIZEdefine.- Change
include/asm-cris/page.hto use the_ACmacro to instead of testing__ASSEMBLY__.
Looks good.
What about applying the same fixes/changes to v32?
It would btw. be nice to move the vmlinux.lds.S files to arch/cris/kernel/.
Se how x86 handle build for two different bit sizes.
If this is done then cris is less awkward compared to the other archs.
Sam
Quoted 8 lines · Sam Ravnborg
Quoted 7 lines · Jesper Nilsson
- Move alignment to page size of init data outside ifdef for
BLK_DEV_INITRD. The reservation up to page size of memory after init data was previously not done ifBLK_DEV_INITRDwas undefined.
This caused a kernel oops when init memory pages were freed after startup, data placed in the same page as the last init memory would also be freed and reused, with disastrous results.
Quoted 8 lines
Quoted 6 lines
- Use macros for initcalls and .text sections.
- Replace hardcoded page size constant with
PAGE_SIZEdefine.- Change
include/asm-cris/page.hto use the_ACmacro to instead of testing__ASSEMBLY__.Looks good.
Thanks.
Quoted 1 line
What about applying the same fixes/changes to v32?
In the works.
Quoted 6 lines
It would btw. be nice to move the
vmlinux.lds.Sfiles toarch/cris/kernel/.
Se how x86 handle build for two different bit sizes.If this is done then cris is less awkward compared to the other archs.
That's a really good idea. I'll add that to my todo-list.
Quoted 1 line
Sam
/^JN - Jesper Nilsson
--
Jesper Nilsson -- [email protected]
Quoted 4 lines
Quoted 1 line
What about applying the same fixes/changes to v32?
In the works.
Quoted 8 lines
Quoted 6 lines
It would btw. be nice to move the
vmlinux.lds.Sfiles toarch/cris/kernel/.
Se how x86 handle build for two different bit sizes.If this is done then cris is less awkward compared to the other archs.
That's a really good idea. I'll add that to my todo-list.
Thanks Jesper.
It is good to see cris getting some love and care in the public!
Sam
Quoted 6 lines · On Tue, 15 Jan 2008 14:36:24 +0100 Jesper Nilsson <[email protected]>…
- Move alignment to page size of init data outside ifdef for
BLK_DEV_INITRD. The reservation up to page size of memory after init data was previously not done ifBLK_DEV_INITRDwas undefined.
This caused a kernel oops when init memory pages were freed after startup, data placed in the same page as the last init memory would also be freed and reused, with disastrous results.
So this is a 2.6.24 thing?
Quoted 6 lines
- Use macros for initcalls and .text sections.
- Replace hardcoded page size constant with
PAGE_SIZEdefine.- Change
include/asm-cris/page.hto use the_ACmacro to instead of testing__ASSEMBLY__.
Even though those are not.
Quoted 10 lines · Andrew Morton
Quoted 6 lines · On Tue, 15 Jan 2008 14:36:24 +0100 Jesper Nilsson <[email protected]>…
- Move alignment to page size of init data outside ifdef for
BLK_DEV_INITRD. The reservation up to page size of memory after init data was previously not done ifBLK_DEV_INITRDwas undefined.
This caused a kernel oops when init memory pages were freed after startup, data placed in the same page as the last init memory would also be freed and reused, with disastrous results.So this is a 2.6.24 thing?
The cris architecture does not compile in Linus' tree since 2 or 3 years, so there shouldn't be any hurry for any cris specific patches.
Quoted 8 lines
Quoted 6 lines
- Use macros for initcalls and .text sections.
- Replace hardcoded page size constant with
PAGE_SIZEdefine.- Change
include/asm-cris/page.hto use the_ACmacro to instead of testing__ASSEMBLY__.Even though those are not.
cu
Adrian
Signature · 4 lines
"Is there not promise of rain?" Ling Tan asked suddenly out
of the darkness. There had been need of rain for many days.
"Only a promise," Lao Er said.
Pearl S. Buck - Dragon Seed