From 8b1c9befbfbd443bd95e77db01c70f1741aa2511 Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Fri, 18 Sep 2009 16:32:44 -0400 Subject: [PATCH 1/6] m32r: make PAGE_SIZE available to assembly. page.h includes ifndef __ASSEMBLY__ guards, but PAGE_SIZE is defined using "1UL", which the assembler does not support. Use the _AC macro from const.h to make it available to assembly (and linker scripts). Signed-off-by: Tim Abbott Signed-off-by: Hirokazu Takata --- arch/m32r/include/asm/page.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/m32r/include/asm/page.h b/arch/m32r/include/asm/page.h index 11777f7a5628..725ede8f2889 100644 --- a/arch/m32r/include/asm/page.h +++ b/arch/m32r/include/asm/page.h @@ -1,9 +1,11 @@ #ifndef _ASM_M32R_PAGE_H #define _ASM_M32R_PAGE_H +#include + /* PAGE_SHIFT determines the page size */ #define PAGE_SHIFT 12 -#define PAGE_SIZE (1UL << PAGE_SHIFT) +#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) #ifndef __ASSEMBLY__ From a7efb879ab5b07726873ace8305373bdf68be8a8 Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Fri, 18 Sep 2009 16:32:45 -0400 Subject: [PATCH 2/6] m32r: Define THREAD_SIZE only once. Previously, m32r's asm/thread_info.h defined THREAD_SIZE differently for assembly and C code; now that PAGE_SIZE is usable from assembly, these can be combined. Also, m32r's asm/processor.h redefines THREAD_SIZE to the same value; remove this redundant definition. Signed-off-by: Tim Abbott Signed-off-by: Hirokazu Takata --- arch/m32r/include/asm/processor.h | 2 -- arch/m32r/include/asm/thread_info.h | 6 ++---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/arch/m32r/include/asm/processor.h b/arch/m32r/include/asm/processor.h index 1a997fc148a2..8397c249989b 100644 --- a/arch/m32r/include/asm/processor.h +++ b/arch/m32r/include/asm/processor.h @@ -140,8 +140,6 @@ unsigned long get_wchan(struct task_struct *p); #define KSTK_EIP(tsk) ((tsk)->thread.lr) #define KSTK_ESP(tsk) ((tsk)->thread.sp) -#define THREAD_SIZE (2*PAGE_SIZE) - #define cpu_relax() barrier() #endif /* _ASM_M32R_PROCESSOR_H */ diff --git a/arch/m32r/include/asm/thread_info.h b/arch/m32r/include/asm/thread_info.h index 71578151a403..4d6616936c36 100644 --- a/arch/m32r/include/asm/thread_info.h +++ b/arch/m32r/include/asm/thread_info.h @@ -55,6 +55,8 @@ struct thread_info { #define PREEMPT_ACTIVE 0x10000000 +#define THREAD_SIZE (PAGE_SIZE << 1) + /* * macros/functions for gaining access to the thread information structure */ @@ -76,8 +78,6 @@ struct thread_info { #define init_thread_info (init_thread_union.thread_info) #define init_stack (init_thread_union.stack) -#define THREAD_SIZE (2*PAGE_SIZE) - /* how to get the thread information struct from C */ static inline struct thread_info *current_thread_info(void) { @@ -127,8 +127,6 @@ static inline unsigned int get_thread_fault_code(void) #else /* !__ASSEMBLY__ */ -#define THREAD_SIZE 8192 - /* how to get the thread information struct from ASM */ #define GET_THREAD_INFO(reg) GET_THREAD_INFO reg .macro GET_THREAD_INFO reg From 00b01b246bc2e28763cbd85f0dc949d6c0d38c13 Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Fri, 18 Sep 2009 16:32:46 -0400 Subject: [PATCH 3/6] m32r: Move GET_THREAD_INFO definition out of asm/thread_info.h. Previously, asm/thread_info.h was not usable from linker scripts because it contains a piece of .macro code. Since that code was only used in the m32r entry.S, the right fix is probably to move the macro there. Signed-off-by: Tim Abbott Signed-off-by: Hirokazu Takata --- arch/m32r/include/asm/thread_info.h | 9 --------- arch/m32r/kernel/entry.S | 7 +++++++ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/arch/m32r/include/asm/thread_info.h b/arch/m32r/include/asm/thread_info.h index 4d6616936c36..ed240b6e8e77 100644 --- a/arch/m32r/include/asm/thread_info.h +++ b/arch/m32r/include/asm/thread_info.h @@ -125,15 +125,6 @@ static inline unsigned int get_thread_fault_code(void) return ti->flags >> TI_FLAG_FAULT_CODE_SHIFT; } -#else /* !__ASSEMBLY__ */ - -/* how to get the thread information struct from ASM */ -#define GET_THREAD_INFO(reg) GET_THREAD_INFO reg - .macro GET_THREAD_INFO reg - ldi \reg, #-THREAD_SIZE - and \reg, sp - .endm - #endif /* diff --git a/arch/m32r/kernel/entry.S b/arch/m32r/kernel/entry.S index 612d35b082a6..403869833b98 100644 --- a/arch/m32r/kernel/entry.S +++ b/arch/m32r/kernel/entry.S @@ -118,6 +118,13 @@ #define resume_kernel restore_all #endif +/* how to get the thread information struct from ASM */ +#define GET_THREAD_INFO(reg) GET_THREAD_INFO reg + .macro GET_THREAD_INFO reg + ldi \reg, #-THREAD_SIZE + and \reg, sp + .endm + ENTRY(ret_from_fork) pop r0 bl schedule_tail From 2a67d26284c31e676bcf3891ad8cee75e87fbada Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Fri, 18 Sep 2009 16:32:47 -0400 Subject: [PATCH 4/6] m32r: Remove unused .altinstructions and .exit.* code from linker script. It appears that m32r copied the .altinstructions definition from x86 when the architecture was first merged into Linux. m32r doesn't put anything in .altinstructions, so this is just dead code. The following block affecting .exit.text/.exit.data, which has a comment also copied from x86, should also be deleted; the linker script later discards the .exit.text and .exit.data sections. Signed-off-by: Tim Abbott Signed-off-by: Hirokazu Takata --- arch/m32r/kernel/vmlinux.lds.S | 9 --------- 1 file changed, 9 deletions(-) diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S index de5e21cca6a5..a8aa4a858ddd 100644 --- a/arch/m32r/kernel/vmlinux.lds.S +++ b/arch/m32r/kernel/vmlinux.lds.S @@ -91,15 +91,6 @@ SECTIONS .con_initcall.init : { *(.con_initcall.init) } __con_initcall_end = .; SECURITY_INIT - . = ALIGN(4); - __alt_instructions = .; - .altinstructions : { *(.altinstructions) } - __alt_instructions_end = .; - .altinstr_replacement : { *(.altinstr_replacement) } - /* .exit.text is discard at runtime, not link time, to deal with references - from .altinstructions and .eh_frame */ - .exit.text : { EXIT_TEXT } - .exit.data : { EXIT_DATA } #ifdef CONFIG_BLK_DEV_INITRD . = ALIGN(4096); From 743486dff1d03eb4a67bd75402699629f70cd5b4 Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Fri, 18 Sep 2009 16:32:48 -0400 Subject: [PATCH 5/6] m32r: Move the spi_stack_top and spu_stack_top into .init.data section. Since these get squashed into the .data output section by the m32r linker script, it seems likely that they don't need their own input sections. At Hirokazu Takata's suggestion, we place these structures in .init.data rather than just placing them in .data (since they are only used at init time). This patch is preparation for cleaning up the m32r architecture to use the new macros in vmlinux.lds.h; if these sections are indeed not needed, then we can use the RW_DATA_SECTION macro for m32r and save a bunch of redundant code. Signed-off-by: Tim Abbott Signed-off-by: Hirokazu Takata --- arch/m32r/kernel/head.S | 4 ++-- arch/m32r/kernel/vmlinux.lds.S | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/arch/m32r/kernel/head.S b/arch/m32r/kernel/head.S index 0a7194439eb1..a46652dd83e6 100644 --- a/arch/m32r/kernel/head.S +++ b/arch/m32r/kernel/head.S @@ -268,13 +268,13 @@ ENTRY(empty_zero_page) /*------------------------------------------------------------------------ * Stack area */ - .section .spi + .section .init.data, "aw" ALIGN .global spi_stack_top .zero 1024 spi_stack_top: - .section .spu + .section .init.data, "aw" ALIGN .global spu_stack_top .zero 1024 diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S index a8aa4a858ddd..aadb24eacf08 100644 --- a/arch/m32r/kernel/vmlinux.lds.S +++ b/arch/m32r/kernel/vmlinux.lds.S @@ -49,8 +49,6 @@ SECTIONS /* writeable */ .data : { /* Data */ - *(.spu) - *(.spi) DATA_DATA CONSTRUCTORS } From 85233c43f7fece10a3ea8ed34f0d546b8dd3a435 Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Fri, 18 Sep 2009 16:32:49 -0400 Subject: [PATCH 6/6] m32r: Cleanup linker script using new linker script macros. This patch is largely a straightforward conversion. One thing to note is that the new macros use fewer separate output sections than the old code; this should have no functional impact but is relevant for people objdumping vmlinux files. Also note that it moves the .data.init_task output sections inside _edata. Signed-off-by: Tim Abbott Signed-off-by: Hirokazu Takata --- arch/m32r/kernel/vmlinux.lds.S | 67 +++++----------------------------- 1 file changed, 9 insertions(+), 58 deletions(-) diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S index aadb24eacf08..8ceb6181d805 100644 --- a/arch/m32r/kernel/vmlinux.lds.S +++ b/arch/m32r/kernel/vmlinux.lds.S @@ -4,6 +4,7 @@ #include #include #include +#include OUTPUT_ARCH(m32r) #if defined(__LITTLE_ENDIAN__) @@ -40,72 +41,22 @@ SECTIONS #endif _etext = .; /* End of text section */ - . = ALIGN(16); /* Exception table */ - __start___ex_table = .; - __ex_table : { *(__ex_table) } - __stop___ex_table = .; - + EXCEPTION_TABLE(16) RODATA - - /* writeable */ - .data : { /* Data */ - DATA_DATA - CONSTRUCTORS - } - - . = ALIGN(4096); - __nosave_begin = .; - .data_nosave : { *(.data.nosave) } - . = ALIGN(4096); - __nosave_end = .; - - . = ALIGN(32); - .data.cacheline_aligned : { *(.data.cacheline_aligned) } - + RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE) _edata = .; /* End of data section */ - . = ALIGN(8192); /* init_task */ - .data.init_task : { *(.data.init_task) } - /* will be freed after init */ - . = ALIGN(4096); /* Init code and data */ + . = 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 = .; - SECURITY_INIT - -#ifdef CONFIG_BLK_DEV_INITRD - . = ALIGN(4096); - __initramfs_start = .; - .init.ramfs : { *(.init.ramfs) } - __initramfs_end = .; -#endif - - PERCPU(4096) - . = ALIGN(4096); + INIT_TEXT_SECTION(PAGE_SIZE) + INIT_DATA_SECTION(16) + PERCPU(PAGE_SIZE) + . = ALIGN(PAGE_SIZE); __init_end = .; /* freed after init ends here */ - __bss_start = .; /* BSS */ - .bss : { *(.bss) } - . = ALIGN(4); - __bss_stop = .; + BSS_SECTION(0, 0, 4) _end = . ;