This is an updated version of the patch series I sent on September 6
cleaning up the m68k architecture's linker scripts. The only change is
that it is rebased on top of Linus's current master.
This cross-architecture linker script cleanup project is in
preparation for adding support for building the kernel with
-ffunction-sections -fdata-sections, which is a prerequisite for
Ksplice.
Tim Abbott (2):
m68k: Make thread_info.h usable from assembly.
m68k: Cleanup linker scripts using new linker script macros.
arch/m68k/include/asm/thread_info_mm.h | 2 +
arch/m68k/kernel/vmlinux-std.lds | 53 ++++++-------------------------
arch/m68k/kernel/vmlinux-sun3.lds | 53 ++++++--------------------------
3 files changed, 23 insertions(+), 85 deletions(-)
Signed-off-by: Tim Abbott <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Cc: Roman Zippel <[email protected]>
Cc: [email protected]
Cc: Sam Ravnborg <[email protected]>
---
arch/m68k/include/asm/thread_info_mm.h | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/arch/m68k/include/asm/thread_info_mm.h b/arch/m68k/include/asm/thread_info_mm.h
index b6da388..5f36cf1 100644
--- a/arch/m68k/include/asm/thread_info_mm.h
+++ b/arch/m68k/include/asm/thread_info_mm.h
@@ -8,6 +8,7 @@
#include <asm/types.h>
#include <asm/page.h>
+#ifndef __ASSEMBLY__
struct thread_info {
struct task_struct *task; /* main task structure */
unsigned long flags;
@@ -16,6 +17,7 @@ struct thread_info {
__u32 cpu; /* should always be 0 on m68k */
struct restart_block restart_block;
};
+#endif /* __ASSEMBLY__ */
#define PREEMPT_ACTIVE 0x4000000
--
1.6.3.3
Signed-off-by: Tim Abbott <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Cc: Roman Zippel <[email protected]>
Cc: [email protected]
Cc: Sam Ravnborg <[email protected]>
---
arch/m68k/kernel/vmlinux-std.lds | 53 +++++++-----------------------------
arch/m68k/kernel/vmlinux-sun3.lds | 53 +++++++------------------------------
2 files changed, 21 insertions(+), 85 deletions(-)
diff --git a/arch/m68k/kernel/vmlinux-std.lds b/arch/m68k/kernel/vmlinux-std.lds
index 47eac19..5927487 100644
--- a/arch/m68k/kernel/vmlinux-std.lds
+++ b/arch/m68k/kernel/vmlinux-std.lds
@@ -2,6 +2,7 @@
#include <asm-generic/vmlinux.lds.h>
#include <asm/page.h>
+#include <asm/thread_info.h>
OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
OUTPUT_ARCH(m68k)
@@ -22,73 +23,41 @@ SECTIONS
_etext = .; /* End of text section */
- . = ALIGN(16); /* Exception table */
- __start___ex_table = .;
- __ex_table : { *(__ex_table) }
- __stop___ex_table = .;
+ EXCEPTION_TABLE(16)
RODATA
- .data : { /* Data */
- DATA_DATA
- CONSTRUCTORS
- }
+ RW_DATA_SECTION(16, PAGE_SIZE, THREAD_SIZE)
- . = ALIGN(16);
- .data.cacheline_aligned : { *(.data.cacheline_aligned) }
-
- .bss : { *(.bss) } /* BSS */
+ BSS_SECTION(0, 0, 0)
_edata = .; /* End of data section */
/* will be freed after init */
. = ALIGN(PAGE_SIZE); /* Init code and data */
__init_begin = .;
- .init.text : {
- _sinittext = .;
- INIT_TEXT
- _einittext = .;
- } :data
+ INIT_TEXT_SECTION(PAGE_SIZE) :data
+ INIT_DATA_SECTION(16)
.init.data : { INIT_DATA }
- . = ALIGN(16);
- __setup_start = .;
- .init.setup : { *(.init.setup) }
- __setup_end = .;
- __initcall_start = .;
+ .init.setup : { INIT_SETUP(16) }
.initcall.init : {
- INITCALLS
+ INIT_CALLS
}
- __initcall_end = .;
- __con_initcall_start = .;
- .con_initcall.init : { *(.con_initcall.init) }
- __con_initcall_end = .;
+ .con_initcall.init : { CON_INITCALL }
.m68k_fixup : {
__start_fixup = .;
*(.m68k_fixup)
__stop_fixup = .;
}
SECURITY_INIT
-#ifdef CONFIG_BLK_DEV_INITRD
- . = ALIGN(8192);
- __initramfs_start = .;
- .init.ramfs : { *(.init.ramfs) }
- __initramfs_end = .;
-#endif
+ .init.ramfs : { INIT_RAM_FS }
NOTES
. = ALIGN(8192);
__init_end = .;
- .data.init_task : { *(.data.init_task) } /* The initial task and kernel stack */
-
_end = . ;
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
+ STABS_DEBUG
.comment 0 : { *(.comment) }
/* Sections to be discarded */
diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds
index 03efaf0..607d214 100644
--- a/arch/m68k/kernel/vmlinux-sun3.lds
+++ b/arch/m68k/kernel/vmlinux-sun3.lds
@@ -2,6 +2,7 @@
#include <asm-generic/vmlinux.lds.h>
#include <asm/page.h>
+#include <asm/thread_info.h>
OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
OUTPUT_ARCH(m68k)
@@ -23,14 +24,8 @@ SECTIONS
_etext = .; /* End of text section */
- .data : { /* Data */
- DATA_DATA
- CONSTRUCTORS
- . = ALIGN(16); /* Exception table */
- __start___ex_table = .;
- *(__ex_table)
- __stop___ex_table = .;
- } :data
+ EXCEPTION_TABLE(16)
+ RW_DATA_SECTION(16, PAGE_SIZE, THREAD_SIZE) :data
/* End of data goes *here* so that freeing init code works properly. */
_edata = .;
NOTES
@@ -38,56 +33,28 @@ SECTIONS
/* will be freed after init */
. = ALIGN(PAGE_SIZE); /* Init code and data */
__init_begin = .;
- .init.text : {
- _sinittext = .;
- INIT_TEXT
- _einittext = .;
- }
+ INIT_TEXT_SECTION(PAGE_SIZE)
.init.data : { INIT_DATA }
- . = ALIGN(16);
- __setup_start = .;
- .init.setup : { *(.init.setup) }
- __setup_end = .;
- __initcall_start = .;
+ .init.setup : { INIT_SETUP(16) }
.initcall.init : {
- INITCALLS
+ INIT_CALLS
}
- __initcall_end = .;
- __con_initcall_start = .;
- .con_initcall.init : { *(.con_initcall.init) }
- __con_initcall_end = .;
+ .con_initcall.init : { CON_INITCALL }
.m68k_fixup : {
__start_fixup = .;
*(.m68k_fixup)
__stop_fixup = .;
}
SECURITY_INIT
-#ifdef CONFIG_BLK_DEV_INITRD
- . = ALIGN(PAGE_SIZE);
- __initramfs_start = .;
- .init.ramfs : { *(.init.ramfs) }
- __initramfs_end = .;
-#endif
+ .init.ramfs : { INIT_RAM_FS }
. = ALIGN(PAGE_SIZE);
__init_end = .;
- .data.init.task : { *(.data.init_task) }
-
- .bss : { *(.bss) } /* BSS */
+ BSS_SECTION(0, 0, 0)
_end = . ;
- .crap : {
- /* Stabs debugging sections. */
- *(.stab)
- *(.stabstr)
- *(.stab.excl)
- *(.stab.exclstr)
- *(.stab.index)
- *(.stab.indexstr)
- *(.comment)
- *(.note)
- }
+ STABS_DEBUG
/* Sections to be discarded */
DISCARDS
--
1.6.3.3
On Wed, Sep 16, 2009 at 18:44, Tim Abbott <[email protected]> wrote:
> Signed-off-by: Tim Abbott <[email protected]>
> Cc: Geert Uytterhoeven <[email protected]>
> Cc: Roman Zippel <[email protected]>
> Cc: [email protected]
> Cc: Sam Ravnborg <[email protected]>
> ---
> arch/m68k/include/asm/thread_info_mm.h | 2 ++
> 1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/arch/m68k/include/asm/thread_info_mm.h b/arch/m68k/include/asm/thread_info_mm.h
> index b6da388..5f36cf1 100644
> --- a/arch/m68k/include/asm/thread_info_mm.h
> +++ b/arch/m68k/include/asm/thread_info_mm.h
> @@ -8,6 +8,7 @@
> #include <asm/types.h>
> #include <asm/page.h>
>
> +#ifndef __ASSEMBLY__
> struct thread_info {
> struct task_struct *task; /* main task structure */
> unsigned long flags;
> @@ -16,6 +17,7 @@ struct thread_info {
> __u32 cpu; /* should always be 0 on m68k */
> struct restart_block restart_block;
> };
> +#endif /* __ASSEMBLY__ */
>
> #define PREEMPT_ACTIVE 0x4000000
This is not sufficient. <asm/thread_info_mm.h> pulls in <asm/current.h>,
which contains C only. So you also need:
--- a/arch/m68k/include/asm/thread_info_mm.h
+++ b/arch/m68k/include/asm/thread_info_mm.h
@@ -4,11 +4,12 @@
#ifndef ASM_OFFSETS_C
#include <asm/asm-offsets.h>
#endif
-#include <asm/current.h>
#include <asm/types.h>
#include <asm/page.h>
#ifndef __ASSEMBLY__
+#include <asm/current.h>
+
struct thread_info {
struct task_struct *task; /* main task structure */
unsigned long flags;
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
On Wed, Sep 16, 2009 at 18:44, Tim Abbott <[email protected]> wrote:
> Signed-off-by: Tim Abbott <[email protected]>
> Cc: Geert Uytterhoeven <[email protected]>
> Cc: Roman Zippel <[email protected]>
> Cc: [email protected]
> Cc: Sam Ravnborg <[email protected]>
This patch must do something wrong, as it now fails to boot on ARAnyM:
| CPU: Double bus fault detected !
| CPU: Halting
Haven't investigated why yet, though...
> ---
> arch/m68k/kernel/vmlinux-std.lds | 53 +++++++-----------------------------
> arch/m68k/kernel/vmlinux-sun3.lds | 53 +++++++------------------------------
> 2 files changed, 21 insertions(+), 85 deletions(-)
>
> diff --git a/arch/m68k/kernel/vmlinux-std.lds b/arch/m68k/kernel/vmlinux-std.lds
> index 47eac19..5927487 100644
> --- a/arch/m68k/kernel/vmlinux-std.lds
> +++ b/arch/m68k/kernel/vmlinux-std.lds
> @@ -2,6 +2,7 @@
>
> #include <asm-generic/vmlinux.lds.h>
> #include <asm/page.h>
> +#include <asm/thread_info.h>
>
> OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
> OUTPUT_ARCH(m68k)
> @@ -22,73 +23,41 @@ SECTIONS
>
> _etext = .; /* End of text section */
>
> - . = ALIGN(16); /* Exception table */
> - __start___ex_table = .;
> - __ex_table : { *(__ex_table) }
> - __stop___ex_table = .;
> + EXCEPTION_TABLE(16)
>
> RODATA
>
> - .data : { /* Data */
> - DATA_DATA
> - CONSTRUCTORS
> - }
> + RW_DATA_SECTION(16, PAGE_SIZE, THREAD_SIZE)
>
> - . = ALIGN(16);
> - .data.cacheline_aligned : { *(.data.cacheline_aligned) }
> -
> - .bss : { *(.bss) } /* BSS */
> + BSS_SECTION(0, 0, 0)
>
> _edata = .; /* End of data section */
>
> /* will be freed after init */
> . = ALIGN(PAGE_SIZE); /* Init code and data */
> __init_begin = .;
> - .init.text : {
> - _sinittext = .;
> - INIT_TEXT
> - _einittext = .;
> - } :data
> + INIT_TEXT_SECTION(PAGE_SIZE) :data
> + INIT_DATA_SECTION(16)
> .init.data : { INIT_DATA }
> - . = ALIGN(16);
> - __setup_start = .;
> - .init.setup : { *(.init.setup) }
> - __setup_end = .;
> - __initcall_start = .;
> + .init.setup : { INIT_SETUP(16) }
> .initcall.init : {
> - INITCALLS
> + INIT_CALLS
> }
> - __initcall_end = .;
> - __con_initcall_start = .;
> - .con_initcall.init : { *(.con_initcall.init) }
> - __con_initcall_end = .;
> + .con_initcall.init : { CON_INITCALL }
> .m68k_fixup : {
> __start_fixup = .;
> *(.m68k_fixup)
> __stop_fixup = .;
> }
> SECURITY_INIT
> -#ifdef CONFIG_BLK_DEV_INITRD
> - . = ALIGN(8192);
> - __initramfs_start = .;
> - .init.ramfs : { *(.init.ramfs) }
> - __initramfs_end = .;
> -#endif
> + .init.ramfs : { INIT_RAM_FS }
> NOTES
> . = ALIGN(8192);
> __init_end = .;
>
> - .data.init_task : { *(.data.init_task) } /* The initial task and kernel stack */
> -
> _end = . ;
>
> - /* Stabs debugging sections. */
> - .stab 0 : { *(.stab) }
> - .stabstr 0 : { *(.stabstr) }
> - .stab.excl 0 : { *(.stab.excl) }
> - .stab.exclstr 0 : { *(.stab.exclstr) }
> - .stab.index 0 : { *(.stab.index) }
> - .stab.indexstr 0 : { *(.stab.indexstr) }
> + STABS_DEBUG
> .comment 0 : { *(.comment) }
>
> /* Sections to be discarded */
> diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds
> index 03efaf0..607d214 100644
> --- a/arch/m68k/kernel/vmlinux-sun3.lds
> +++ b/arch/m68k/kernel/vmlinux-sun3.lds
> @@ -2,6 +2,7 @@
>
> #include <asm-generic/vmlinux.lds.h>
> #include <asm/page.h>
> +#include <asm/thread_info.h>
>
> OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
> OUTPUT_ARCH(m68k)
> @@ -23,14 +24,8 @@ SECTIONS
>
> _etext = .; /* End of text section */
>
> - .data : { /* Data */
> - DATA_DATA
> - CONSTRUCTORS
> - . = ALIGN(16); /* Exception table */
> - __start___ex_table = .;
> - *(__ex_table)
> - __stop___ex_table = .;
> - } :data
> + EXCEPTION_TABLE(16)
> + RW_DATA_SECTION(16, PAGE_SIZE, THREAD_SIZE) :data
> /* End of data goes *here* so that freeing init code works properly. */
> _edata = .;
> NOTES
> @@ -38,56 +33,28 @@ SECTIONS
> /* will be freed after init */
> . = ALIGN(PAGE_SIZE); /* Init code and data */
> __init_begin = .;
> - .init.text : {
> - _sinittext = .;
> - INIT_TEXT
> - _einittext = .;
> - }
> + INIT_TEXT_SECTION(PAGE_SIZE)
> .init.data : { INIT_DATA }
> - . = ALIGN(16);
> - __setup_start = .;
> - .init.setup : { *(.init.setup) }
> - __setup_end = .;
> - __initcall_start = .;
> + .init.setup : { INIT_SETUP(16) }
> .initcall.init : {
> - INITCALLS
> + INIT_CALLS
> }
> - __initcall_end = .;
> - __con_initcall_start = .;
> - .con_initcall.init : { *(.con_initcall.init) }
> - __con_initcall_end = .;
> + .con_initcall.init : { CON_INITCALL }
> .m68k_fixup : {
> __start_fixup = .;
> *(.m68k_fixup)
> __stop_fixup = .;
> }
> SECURITY_INIT
> -#ifdef CONFIG_BLK_DEV_INITRD
> - . = ALIGN(PAGE_SIZE);
> - __initramfs_start = .;
> - .init.ramfs : { *(.init.ramfs) }
> - __initramfs_end = .;
> -#endif
> + .init.ramfs : { INIT_RAM_FS }
> . = ALIGN(PAGE_SIZE);
> __init_end = .;
> - .data.init.task : { *(.data.init_task) }
> -
>
> - .bss : { *(.bss) } /* BSS */
> + BSS_SECTION(0, 0, 0)
>
> _end = . ;
>
> - .crap : {
> - /* Stabs debugging sections. */
> - *(.stab)
> - *(.stabstr)
> - *(.stab.excl)
> - *(.stab.exclstr)
> - *(.stab.index)
> - *(.stab.indexstr)
> - *(.comment)
> - *(.note)
> - }
> + STABS_DEBUG
>
> /* Sections to be discarded */
> DISCARDS
> --
> 1.6.3.3
>
>
--
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
On Sun, Sep 27, 2009 at 11:55:55AM +0200, Geert Uytterhoeven wrote:
> On Wed, Sep 16, 2009 at 18:44, Tim Abbott <[email protected]> wrote:
> > Signed-off-by: Tim Abbott <[email protected]>
> > Cc: Geert Uytterhoeven <[email protected]>
> > Cc: Roman Zippel <[email protected]>
> > Cc: [email protected]
> > Cc: Sam Ravnborg <[email protected]>
> > ---
> > ?arch/m68k/include/asm/thread_info_mm.h | ? ?2 ++
> > ?1 files changed, 2 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/m68k/include/asm/thread_info_mm.h b/arch/m68k/include/asm/thread_info_mm.h
> > index b6da388..5f36cf1 100644
> > --- a/arch/m68k/include/asm/thread_info_mm.h
> > +++ b/arch/m68k/include/asm/thread_info_mm.h
> > @@ -8,6 +8,7 @@
> > ?#include <asm/types.h>
> > ?#include <asm/page.h>
> >
> > +#ifndef __ASSEMBLY__
> > ?struct thread_info {
> > ? ? ? ?struct task_struct ? ? ?*task; ? ? ? ? ?/* main task structure */
> > ? ? ? ?unsigned long ? ? ? ? ? flags;
> > @@ -16,6 +17,7 @@ struct thread_info {
> > ? ? ? ?__u32 cpu; /* should always be 0 on m68k */
> > ? ? ? ?struct restart_block ? ?restart_block;
> > ?};
> > +#endif /* __ASSEMBLY__ */
> >
> > ?#define PREEMPT_ACTIVE ? ? ? ? 0x4000000
>
> This is not sufficient. <asm/thread_info_mm.h> pulls in <asm/current.h>,
> which contains C only. So you also need:
>
> --- a/arch/m68k/include/asm/thread_info_mm.h
> +++ b/arch/m68k/include/asm/thread_info_mm.h
> @@ -4,11 +4,12 @@
> #ifndef ASM_OFFSETS_C
> #include <asm/asm-offsets.h>
> #endif
> -#include <asm/current.h>
> #include <asm/types.h>
> #include <asm/page.h>
>
> #ifndef __ASSEMBLY__
> +#include <asm/current.h>
> +
> struct thread_info {
> struct task_struct *task; /* main task structure */
> unsigned long flags;
upstream m68k does not build for me so I could not test.
But I think the correct fix is to drop the include or current from thread_info.
No-one except m68k needs to include current.h in thread_info.h.
Sam
Geert Uytterhoeven <[email protected]> writes:
> On Wed, Sep 16, 2009 at 18:44, Tim Abbott <[email protected]> wrote:
>> Signed-off-by: Tim Abbott <[email protected]>
>> Cc: Geert Uytterhoeven <[email protected]>
>> Cc: Roman Zippel <[email protected]>
>> Cc: [email protected]
>> Cc: Sam Ravnborg <[email protected]>
>
> This patch must do something wrong, as it now fails to boot on ARAnyM:
>
> | CPU: Double bus fault detected !
> | CPU: Halting
>
> Haven't investigated why yet, though...
The problem is that _end no longer matches the end of the load segment.
Previously, the .data.init_task section was the last allocated item in
the linker script, now the last item is an align. This align does not
affect the memsize of the segment. The startup code expects the boot
info to be placed at _end, but the boot loader puts it at the end of the
load segment, which is the best it can do.
Andreas.
--
Andreas Schwab, [email protected]
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
On Sun, 27 Sep 2009, Andreas Schwab wrote:
> Geert Uytterhoeven <[email protected]> writes:
>
> > On Wed, Sep 16, 2009 at 18:44, Tim Abbott <[email protected]> wrote:
> >> Signed-off-by: Tim Abbott <[email protected]>
> >> Cc: Geert Uytterhoeven <[email protected]>
> >> Cc: Roman Zippel <[email protected]>
> >> Cc: [email protected]
> >> Cc: Sam Ravnborg <[email protected]>
> >
> > This patch must do something wrong, as it now fails to boot on ARAnyM:
> >
> > | CPU: Double bus fault detected !
> > | CPU: Halting
> >
> > Haven't investigated why yet, though...
>
> The problem is that _end no longer matches the end of the load segment.
> Previously, the .data.init_task section was the last allocated item in
> the linker script, now the last item is an align. This align does not
> affect the memsize of the segment. The startup code expects the boot
> info to be placed at _end, but the boot loader puts it at the end of the
> load segment, which is the best it can do.
Below is a new version of the second patch that attempts to address this
by putting the ALIGN inside a section, so that _end is at the end of the
load segment (I also did a bit more cleanup):
.init_end : {
/* This ALIGN be in a section so that _end is at the end of the
load segment. */
. = ALIGN(PAGE_SIZE);
__init_end = .;
}
_end = .;
-Tim Abbott
m68k: Cleanup linker scripts using new linker script macros.
Signed-off-by: Tim Abbott <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Cc: Roman Zippel <[email protected]>
Cc: [email protected]
Cc: Sam Ravnborg <[email protected]>
---
arch/m68k/kernel/vmlinux-std.lds | 61 ++++++++-----------------------------
arch/m68k/kernel/vmlinux-sun3.lds | 54 ++++----------------------------
2 files changed, 20 insertions(+), 95 deletions(-)
diff --git a/arch/m68k/kernel/vmlinux-std.lds b/arch/m68k/kernel/vmlinux-std.lds
index 47eac19..878be5f 100644
--- a/arch/m68k/kernel/vmlinux-std.lds
+++ b/arch/m68k/kernel/vmlinux-std.lds
@@ -2,6 +2,7 @@
#include <asm-generic/vmlinux.lds.h>
#include <asm/page.h>
+#include <asm/thread_info.h>
OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
OUTPUT_ARCH(m68k)
@@ -22,73 +23,37 @@ SECTIONS
_etext = .; /* End of text section */
- . = ALIGN(16); /* Exception table */
- __start___ex_table = .;
- __ex_table : { *(__ex_table) }
- __stop___ex_table = .;
+ EXCEPTION_TABLE(16)
RODATA
- .data : { /* Data */
- DATA_DATA
- CONSTRUCTORS
- }
+ RW_DATA_SECTION(16, PAGE_SIZE, THREAD_SIZE)
- . = ALIGN(16);
- .data.cacheline_aligned : { *(.data.cacheline_aligned) }
-
- .bss : { *(.bss) } /* BSS */
+ BSS_SECTION(0, 0, 0)
_edata = .; /* End of data section */
/* will be freed after init */
. = ALIGN(PAGE_SIZE); /* Init code and data */
__init_begin = .;
- .init.text : {
- _sinittext = .;
- INIT_TEXT
- _einittext = .;
- } :data
- .init.data : { INIT_DATA }
- . = ALIGN(16);
- __setup_start = .;
- .init.setup : { *(.init.setup) }
- __setup_end = .;
- __initcall_start = .;
- .initcall.init : {
- INITCALLS
- }
- __initcall_end = .;
- __con_initcall_start = .;
- .con_initcall.init : { *(.con_initcall.init) }
- __con_initcall_end = .;
+ INIT_TEXT_SECTION(PAGE_SIZE) :data
+ INIT_DATA_SECTION(16)
.m68k_fixup : {
__start_fixup = .;
*(.m68k_fixup)
__stop_fixup = .;
}
- SECURITY_INIT
-#ifdef CONFIG_BLK_DEV_INITRD
- . = ALIGN(8192);
- __initramfs_start = .;
- .init.ramfs : { *(.init.ramfs) }
- __initramfs_end = .;
-#endif
NOTES
- . = ALIGN(8192);
- __init_end = .;
-
- .data.init_task : { *(.data.init_task) } /* The initial task and kernel stack */
+ .init_end : {
+ /* This ALIGN be in a section so that _end is at the end of the
+ load segment. */
+ . = ALIGN(PAGE_SIZE);
+ __init_end = .;
+ }
_end = . ;
- /* Stabs debugging sections. */
- .stab 0 : { *(.stab) }
- .stabstr 0 : { *(.stabstr) }
- .stab.excl 0 : { *(.stab.excl) }
- .stab.exclstr 0 : { *(.stab.exclstr) }
- .stab.index 0 : { *(.stab.index) }
- .stab.indexstr 0 : { *(.stab.indexstr) }
+ STABS_DEBUG
.comment 0 : { *(.comment) }
/* Sections to be discarded */
diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds
index 03efaf0..1ad6b7a 100644
--- a/arch/m68k/kernel/vmlinux-sun3.lds
+++ b/arch/m68k/kernel/vmlinux-sun3.lds
@@ -2,6 +2,7 @@
#include <asm-generic/vmlinux.lds.h>
#include <asm/page.h>
+#include <asm/thread_info.h>
OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
OUTPUT_ARCH(m68k)
@@ -23,14 +24,8 @@ SECTIONS
_etext = .; /* End of text section */
- .data : { /* Data */
- DATA_DATA
- CONSTRUCTORS
- . = ALIGN(16); /* Exception table */
- __start___ex_table = .;
- *(__ex_table)
- __stop___ex_table = .;
- } :data
+ EXCEPTION_TABLE(16) :data
+ RW_DATA_SECTION(16, PAGE_SIZE, THREAD_SIZE) :data
/* End of data goes *here* so that freeing init code works properly. */
_edata = .;
NOTES
@@ -38,56 +33,21 @@ SECTIONS
/* will be freed after init */
. = ALIGN(PAGE_SIZE); /* Init code and data */
__init_begin = .;
- .init.text : {
- _sinittext = .;
- INIT_TEXT
- _einittext = .;
- }
- .init.data : { INIT_DATA }
- . = ALIGN(16);
- __setup_start = .;
- .init.setup : { *(.init.setup) }
- __setup_end = .;
- __initcall_start = .;
- .initcall.init : {
- INITCALLS
- }
- __initcall_end = .;
- __con_initcall_start = .;
- .con_initcall.init : { *(.con_initcall.init) }
- __con_initcall_end = .;
+ INIT_TEXT_SECTION(PAGE_SIZE)
+ INIT_DATA_SECTION(16)
.m68k_fixup : {
__start_fixup = .;
*(.m68k_fixup)
__stop_fixup = .;
}
- SECURITY_INIT
-#ifdef CONFIG_BLK_DEV_INITRD
- . = ALIGN(PAGE_SIZE);
- __initramfs_start = .;
- .init.ramfs : { *(.init.ramfs) }
- __initramfs_end = .;
-#endif
. = ALIGN(PAGE_SIZE);
__init_end = .;
- .data.init.task : { *(.data.init_task) }
-
- .bss : { *(.bss) } /* BSS */
+ BSS_SECTION(0, 0, 0)
_end = . ;
- .crap : {
- /* Stabs debugging sections. */
- *(.stab)
- *(.stabstr)
- *(.stab.excl)
- *(.stab.exclstr)
- *(.stab.index)
- *(.stab.indexstr)
- *(.comment)
- *(.note)
- }
+ STABS_DEBUG
/* Sections to be discarded */
DISCARDS
--
1.6.3.3
Tim Abbott <[email protected]> writes:
> Below is a new version of the second patch that attempts to address this
> by putting the ALIGN inside a section, so that _end is at the end of the
> load segment (I also did a bit more cleanup):
>
> .init_end : {
> /* This ALIGN be in a section so that _end is at the end of the
> load segment. */
> . = ALIGN(PAGE_SIZE);
> __init_end = .;
> }
>
> _end = .;
This works fine.
Andreas.
--
Andreas Schwab, [email protected]
GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84 5EC7 45C6 250E 6F00 984E
"And now for something completely different."
On Tue, Sep 29, 2009 at 07:12:56PM +0200, Andreas Schwab wrote:
> Tim Abbott <[email protected]> writes:
>
> > Below is a new version of the second patch that attempts to address this
> > by putting the ALIGN inside a section, so that _end is at the end of the
> > load segment (I also did a bit more cleanup):
> >
> > .init_end : {
> > /* This ALIGN be in a section so that _end is at the end of the
> > load segment. */
> > . = ALIGN(PAGE_SIZE);
> > __init_end = .;
> > }
> >
> > _end = .;
>
> This works fine.
Thanks for testing Andreas.
Geert - I assume you take the corrected version and push to Linus?
Sam
On Wed, Sep 30, 2009 at 08:53, Sam Ravnborg <[email protected]> wrote:
> On Tue, Sep 29, 2009 at 07:12:56PM +0200, Andreas Schwab wrote:
>> Tim Abbott <[email protected]> writes:
>>
>> > Below is a new version of the second patch that attempts to address this
>> > by putting the ALIGN inside a section, so that _end is at the end of the
>> > load segment (I also did a bit more cleanup):
>> >
>> > .init_end : {
>> > /* This ALIGN be in a section so that _end is at the end of the
>> > load segment. */
>> > . = ALIGN(PAGE_SIZE);
>> > __init_end = .;
>> > }
>> >
>> > _end = .;
>>
>> This works fine.
>
> Thanks for testing Andreas.
>
> Geert - I assume you take the corrected version and push to Linus?
I will (eventually), but it probably won't make it for -rc2. Same for
the other m68k patches I have still lying around.
I hope to have more m68k development time in a month or so...
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
On Sun, Sep 27, 2009 at 12:58, Sam Ravnborg <[email protected]> wrote:
> On Sun, Sep 27, 2009 at 11:55:55AM +0200, Geert Uytterhoeven wrote:
>> On Wed, Sep 16, 2009 at 18:44, Tim Abbott <[email protected]> wrote:
>> > Signed-off-by: Tim Abbott <[email protected]>
>> > Cc: Geert Uytterhoeven <[email protected]>
>> > Cc: Roman Zippel <[email protected]>
>> > Cc: [email protected]
>> > Cc: Sam Ravnborg <[email protected]>
>> > ---
>> > arch/m68k/include/asm/thread_info_mm.h | 2 ++
>> > 1 files changed, 2 insertions(+), 0 deletions(-)
>> >
>> > diff --git a/arch/m68k/include/asm/thread_info_mm.h b/arch/m68k/include/asm/thread_info_mm.h
>> > index b6da388..5f36cf1 100644
>> > --- a/arch/m68k/include/asm/thread_info_mm.h
>> > +++ b/arch/m68k/include/asm/thread_info_mm.h
>> > @@ -8,6 +8,7 @@
>> > #include <asm/types.h>
>> > #include <asm/page.h>
>> >
>> > +#ifndef __ASSEMBLY__
>> > struct thread_info {
>> > struct task_struct *task; /* main task structure */
>> > unsigned long flags;
>> > @@ -16,6 +17,7 @@ struct thread_info {
>> > __u32 cpu; /* should always be 0 on m68k */
>> > struct restart_block restart_block;
>> > };
>> > +#endif /* __ASSEMBLY__ */
>> >
>> > #define PREEMPT_ACTIVE 0x4000000
>>
>> This is not sufficient. <asm/thread_info_mm.h> pulls in <asm/current.h>,
>> which contains C only. So you also need:
>>
>> --- a/arch/m68k/include/asm/thread_info_mm.h
>> +++ b/arch/m68k/include/asm/thread_info_mm.h
>> @@ -4,11 +4,12 @@
>> #ifndef ASM_OFFSETS_C
>> #include <asm/asm-offsets.h>
>> #endif
>> -#include <asm/current.h>
>> #include <asm/types.h>
>> #include <asm/page.h>
>>
>> #ifndef __ASSEMBLY__
>> +#include <asm/current.h>
>> +
>> struct thread_info {
>> struct task_struct *task; /* main task structure */
>> unsigned long flags;
>
>
> upstream m68k does not build for me so I could not test.
> But I think the correct fix is to drop the include or current from thread_info.
> No-one except m68k needs to include current.h in thread_info.h.
Dropping it causes lots of undeclared errors, so I'm gonna apply Tim's
patch with my additional fix.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds