[PATCH 6/6] ARM: support kernel modules in BE8 mode

Nicolas Pitre nico at fluxnic.net
Mon Nov 21 14:29:06 EST 2011


On Tue, 15 Nov 2011, Junxiao Bi wrote:

> From: Stanley.Miao <stanley.miao at windriver.com>
> 
> In BE8 mode, data must be manipulated in big endian format while
> text must be little endian. Therefore, when relocating the text
> section of module in BE8 mode, we must convert the location offset
> of the text to big endian from the native little endian. After
> the relocation is complete, the location offset value is re-written
> as little endian.
> 
> Since only BE8 mode has such special requirement while other big endian
> mode not, cpu_to_le32 and le32_to_cpu can not be used to relocate the
> text. We introduce write_instr* and read_instr* to do it.
> 
> Signed-off-by: Stanley.Miao <stanley.miao at windriver.com>
> Signed-off-by: Junxiao Bi <junxiao.bi at windriver.com>
> ---
>  arch/arm/Makefile         |    1 +
>  arch/arm/include/asm/io.h |   12 ++++++++++
>  arch/arm/kernel/module.c  |   51 +++++++++++++++++++++++----------------------
>  3 files changed, 39 insertions(+), 25 deletions(-)
> 
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index dfcf3b0..c858184 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -13,6 +13,7 @@
>  LDFLAGS_vmlinux	:=-p --no-undefined -X
>  ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
>  LDFLAGS_vmlinux	+= --be8
> +LDFLAGS_MODULE	+= --be8
>  endif
>  
>  OBJCOPYFLAGS	:=-O binary -R .comment -S
> diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h
> index 065d100..4b6c7de 100644
> --- a/arch/arm/include/asm/io.h
> +++ b/arch/arm/include/asm/io.h
> @@ -210,6 +210,18 @@ extern void _memset_io(volatile void __iomem *, int, size_t);
>   * Again, this are defined to perform little endian accesses.  See the
>   * IO port primitives for more information.
>   */
> +#ifdef CONFIG_CPU_ENDIAN_BE8
> +#define read_instr32(c)		__swab32(*(u32 *)(c))
> +#define read_instr16(c)		__swab16(*(u16 *)(c))
> +#define write_instr32(v, a)	(*(u32 *)(a) = __swab32((__force __u32)(v)))
> +#define write_instr16(v, a)	(*(u16 *)(a) = __swab16((__force __u16)(v)))
> +#else
> +#define read_instr32(c)		(*(u32 *)(c))
> +#define read_instr16(c)		(*(u16 *)(c))
> +#define write_instr32(v, a)	(*(u32 *)(a) = (v))
> +#define write_instr16(v, a)	(*(u16 *)(a) = (v))
> +#endif

NAK.  This has nothing to do with IO.

If only module.c requires this, please move those definitions there.


Nicolas



More information about the linux-arm-kernel mailing list