2009-09-07 03:13:30

by Tim Abbott

[permalink] [raw]
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 <[email protected]>
Cc: Hirokazu Takata <[email protected]>
---
arch/m32r/include/asm/page.h | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/arch/m32r/include/asm/page.h b/arch/m32r/include/asm/page.h
index 11777f7..725ede8 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 <linux/const.h>
+
/* 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__
--
1.6.3.3


2009-09-07 03:13:10

by Tim Abbott

[permalink] [raw]
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 <[email protected]>
Cc: Hirokazu Takata <[email protected]>
---
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 1a997fc..8397c24 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 07bb5bd..787ac92 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
--
1.6.3.3

2009-09-07 03:15:47

by Tim Abbott

[permalink] [raw]
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 <[email protected]>
Cc: Hirokazu Takata <[email protected]>
---
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 787ac92..b8ac0fe 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 612d35b..4038698 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
--
1.6.3.3

2009-09-07 03:15:42

by Tim Abbott

[permalink] [raw]
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 <[email protected]>
Cc: Hirokazu Takata <[email protected]>
---
arch/m32r/kernel/vmlinux.lds.S | 9 ---------
1 files changed, 0 insertions(+), 9 deletions(-)

diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S
index 4179adf..eb3e425 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);
--
1.6.3.3

2009-09-07 03:13:16

by Tim Abbott

[permalink] [raw]
Subject: [PATCH 5/6] m32r: Move the spi_stack_top and spu_stack_top into .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.

I'd like an explicit confirmation from Hirokazu Takata that this is
correct (in particular, that there isn't some hidden reason why there
two structures need to be at the start of the .data output section).

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 <[email protected]>
Cc: Hirokazu Takata <[email protected]>
---
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 0a71944..fc4d769 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 .data
ALIGN
.global spi_stack_top
.zero 1024
spi_stack_top:

- .section .spu
+ .section .data
ALIGN
.global spu_stack_top
.zero 1024
diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S
index eb3e425..1984b9f 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
}
--
1.6.3.3

2009-09-07 03:13:22

by Tim Abbott

[permalink] [raw]
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 <[email protected]>
Cc: Hirokazu Takata <[email protected]>
---
arch/m32r/kernel/vmlinux.lds.S | 67 +++++----------------------------------
1 files changed, 9 insertions(+), 58 deletions(-)

diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S
index 1984b9f..b15ed63 100644
--- a/arch/m32r/kernel/vmlinux.lds.S
+++ b/arch/m32r/kernel/vmlinux.lds.S
@@ -4,6 +4,7 @@
#include <asm-generic/vmlinux.lds.h>
#include <asm/addrspace.h>
#include <asm/page.h>
+#include <asm/thread_info.h>

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 = . ;

--
1.6.3.3

2009-09-07 05:53:04

by Hirokazu Takata

[permalink] [raw]
Subject: Re: [PATCH 2/6] m32r: Define THREAD_SIZE only once.

Hello,

From: Tim Abbott <[email protected]>
Subject: [PATCH 2/6] m32r: Define THREAD_SIZE only once.
Date: Sun, 06 Sep 2009 23:12:55 -0400
> 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 <[email protected]>
> Cc: Hirokazu Takata <[email protected]>
> ---
> 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 1a997fc..8397c24 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 07bb5bd..787ac92 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
> --
> 1.6.3.3
>

This patch causes build errors:

$ m32r-linux-gnu-gcc -Wp,-MD,arch/m32r/kernel/.entry.o.d -nostdinc -isystem /usr/lib/gcc/m32r-linux-gnu/4.1.2/include -Iinclude -Iinclude2 -I/project/m32r-linux/kernel/dev/linux-2.6_dev.git/include -I/project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/include -include include/linux/autoconf.h -D__KERNEL__ -D__ASSEMBLY__ -DNO_FPU -m32r2 -O2 -c -o arch/m32r/kernel/entry.o /project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/kernel/entry.S
/project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/kernel/entry.S: Assembler messages:
/project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/kernel/entry.S:124: Error: undefined symbol `PAGE_SIZE' in operation
/project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/kernel/entry.S:150: Error: undefined symbol `PAGE_SIZE' in operation
/project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/kernel/entry.S:159: Error: undefined symbol `PAGE_SIZE' in operation
/project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/kernel/entry.S:189: Error: undefined symbol `PAGE_SIZE' in operation
/project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/kernel/entry.S:268: Error: undefined symbol `PAGE_SIZE' in operation

It is because entry.s still has PAGE_SIZE symbol, after C preprocessing:

--- arch/m32r/kernel/entry.S ---
:
121 ENTRY(ret_from_fork)
122 pop r0
123 bl schedule_tail
124 GET_THREAD_INFO(r8)
125 bra syscall_exit
:
---

--- entry.s (preprocessed entry.S) ---
# 132 "/project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/include/asm/th
read_info.h"
.macro GET_THREAD_INFO reg
ldi \reg, #-(PAGE_SIZE << 1)
and \reg, sp
.endm

:

# 121 "/project/m32r-linux/kernel/dev/linux-2.6_dev.git/arch/m32r/kernel/ent ry.S"
ENTRY_M ret_from_fork
pop r0
bl schedule_tail
GET_THREAD_INFO r8
bra syscall_exit
---


The PAGE_SIZE symbol is defined in asm/page.h, So I think asm/page.h
should be included at the top of asm/thread-info.h.
Here is a additional patch:

--- a/arch/m32r/include/asm/thread_info.h
+++ b/arch/m32r/include/asm/thread_info.h
@@ -10,6 +10,7 @@

#ifdef __KERNEL__

+#include <asm/page.h>
#ifndef __ASSEMBLY__
#include <asm/processor.h>
#endif

Signed-off-by: Hirokazu Takata <[email protected]>


Please update your patch if possible.

Thank you.

-- Takata

2009-09-07 06:42:22

by Hirokazu Takata

[permalink] [raw]
Subject: Re: [PATCH 2/6] m32r: Define THREAD_SIZE only once.

From: Hirokazu Takata <[email protected]>
Subject: Re: [PATCH 2/6] m32r: Define THREAD_SIZE only once.
Date: Mon, 07 Sep 2009 14:52:27 +0900
>
> This patch causes build errors:
>

Sorry. It was my mistake.
I forgot to apply your "[PATCH 3/6]".

Tim, you are correct.

From: Tim Abbott <[email protected]>
Subject: [PATCH 2/6] m32r: Define THREAD_SIZE only once.
Date: Sun, 06 Sep 2009 23:12:55 -0400
> 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 <[email protected]>
> Cc: Hirokazu Takata <[email protected]>
> ---
> arch/m32r/include/asm/processor.h | 2 --
> arch/m32r/include/asm/thread_info.h | 6 ++----
> 2 files changed, 2 insertions(+), 6 deletions(-)
>

Acked-by: Hirokazu Takata <[email protected]>

-- Takata

2009-09-07 12:31:00

by Hirokazu Takata

[permalink] [raw]
Subject: Re: [PATCH 5/6] m32r: Move the spi_stack_top and spu_stack_top into .data section.

From: Tim Abbott <[email protected]>
Subject: [PATCH 5/6] m32r: Move the spi_stack_top and spu_stack_top into .data section.
Date: Sun, 06 Sep 2009 23:12:58 -0400
> 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.
>
> I'd like an explicit confirmation from Hirokazu Takata that this is
> correct (in particular, that there isn't some hidden reason why there
> two structures need to be at the start of the .data output section).

There is no apparent reason. We've placed them at the start of .data
section, because they are for initial stack region.

I think it would be better that we place them to .init.data section.
Any comment?

> 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 <[email protected]>
> Cc: Hirokazu Takata <[email protected]>
> ---
> 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 0a71944..fc4d769 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 .data
> ALIGN
> .global spi_stack_top
> .zero 1024
> spi_stack_top:
>
> - .section .spu
> + .section .data
> ALIGN
> .global spu_stack_top
> .zero 1024
> diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S
> index eb3e425..1984b9f 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
> }
> --
> 1.6.3.3
>

-- Takata

2009-09-07 14:36:20

by Tim Abbott

[permalink] [raw]
Subject: Re: [PATCH 5/6] m32r: Move the spi_stack_top and spu_stack_top into .data section.

On Mon, 7 Sep 2009, Hirokazu Takata wrote:

> From: Tim Abbott <[email protected]>
> Subject: [PATCH 5/6] m32r: Move the spi_stack_top and spu_stack_top into .data section.
> Date: Sun, 06 Sep 2009 23:12:58 -0400
> > 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.
> >
> > I'd like an explicit confirmation from Hirokazu Takata that this is
> > correct (in particular, that there isn't some hidden reason why there
> > two structures need to be at the start of the .data output section).
>
> There is no apparent reason. We've placed them at the start of .data
> section, because they are for initial stack region.
>
> I think it would be better that we place them to .init.data section.
> Any comment?

Assuming that they aren't used after the initial boot process, that's
probably the right choice.

-Tim Abbott