[U-Boot] [PATCH 1/5] arm: include: Import unified.h from Linux kernel

Simon Glass
2016-04-09T18:34:47Z

Hi Marek,

On 20 March 2016 at 10:15, Marek Vasut <marex@denx.de> wrote:
> Import unified.h from Linux kernel 4.4.6 , commit
> 0d1912303e54ed1b2a371be0bba51c384dd57326 . This header file contains
> macros used in libgcc functions in Linux kernel on ARM and will be
> needed for the libgcc sync.
>
> Since unified.h defines the W(instr) macro, we must drop this from
> the macro from memcpy.S , otherwise this triggers a warning about
> symbol redefinition. In order to keep the changes to unified.h to
> the minimum, tweak arch/arm/lib/Makefile such that it defines new
> CONFIG_THUMB2_KERNEL macro, which is already checked by unified.h,
> only if Thumb build is enabled, but the target does not support
> Thumb2 . This way we can remove ad-hoc -DMEMSET_NO_THUMB_BUILD and
> -DMEMCPY_NO_THUMB_BUILD and we do not change the logic.
>
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Albert Aribaud <albert.u.boot@aribaud.net>
> Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
> Cc: Simon Glass <sjg@chromium.org>
> Cc: Tom Rini <trini@konsulko.com>
> ---
> arch/arm/include/asm/assembler.h | 1 +
> arch/arm/include/asm/unified.h | 140 +++++++++++++++++++++++++++++++++++++++
> arch/arm/lib/Makefile | 6 +-
> arch/arm/lib/memcpy.S | 6 --
> 4 files changed, 144 insertions(+), 9 deletions(-)
> create mode 100644 arch/arm/include/asm/unified.h

Reviewed-by: Simon Glass <sjg@chromium.org>

Can we use SPDX?

>
> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
> index 11b80fb..ae1e42f 100644
> --- a/arch/arm/include/asm/assembler.h
> +++ b/arch/arm/include/asm/assembler.h
> @@ -15,6 +15,7 @@
> */
>
> #include <config.h>
> +#include <asm/unified.h>
>
> /*
> * Endian independent macros for shifting bytes within registers.
> diff --git a/arch/arm/include/asm/unified.h b/arch/arm/include/asm/unified.h
> new file mode 100644
> index 0000000..a91ae49
> --- /dev/null
> +++ b/arch/arm/include/asm/unified.h
> @@ -0,0 +1,140 @@
> +/*
> + * include/asm-arm/unified.h - Unified Assembler Syntax helper macros
> + *
> + * Copyright (C) 2008 ARM Limited
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + */
> +
> +#ifndef __ASM_UNIFIED_H
> +#define __ASM_UNIFIED_H
> +
> +#if defined(__ASSEMBLY__) && defined(CONFIG_ARM_ASM_UNIFIED)
> + .syntax unified
> +#endif
> +
> +#ifdef CONFIG_CPU_V7M
> +#define AR_CLASS(x...)
> +#define M_CLASS(x...) x
> +#else
> +#define AR_CLASS(x...) x
> +#define M_CLASS(x...)
> +#endif
> +
> +#ifdef CONFIG_THUMB2_KERNEL
> +
> +#if __GNUC__ < 4
> +#error Thumb-2 kernel requires gcc >= 4
> +#endif
> +
> +/* The CPSR bit describing the instruction set (Thumb) */
> +#define PSR_ISETSTATE PSR_T_BIT
> +
> +#define ARM(x...)
> +#define THUMB(x...) x
> +#ifdef __ASSEMBLY__
> +#define W(instr) instr.w
> +#else
> +#define WASM(instr) #instr ".w"
> +#endif
> +
> +#else /* !CONFIG_THUMB2_KERNEL */
> +
> +/* The CPSR bit describing the instruction set (ARM) */
> +#define PSR_ISETSTATE 0
> +
> +#define ARM(x...) x
> +#define THUMB(x...)
> +#ifdef __ASSEMBLY__
> +#define W(instr) instr
> +#else
> +#define WASM(instr) #instr
> +#endif
> +
> +#endif /* CONFIG_THUMB2_KERNEL */
> +
> +#ifndef CONFIG_ARM_ASM_UNIFIED
> +
> +/*
> + * If the unified assembly syntax isn't used (in ARM mode), these
> + * macros expand to an empty string
> + */
> +#ifdef __ASSEMBLY__
> + .macro it, cond
> + .endm
> + .macro itt, cond
> + .endm
> + .macro ite, cond
> + .endm
> + .macro ittt, cond
> + .endm
> + .macro itte, cond
> + .endm
> + .macro itet, cond
> + .endm
> + .macro itee, cond
> + .endm
> + .macro itttt, cond
> + .endm
> + .macro ittte, cond
> + .endm
> + .macro ittet, cond
> + .endm
> + .macro ittee, cond
> + .endm
> + .macro itett, cond
> + .endm
> + .macro itete, cond
> + .endm
> + .macro iteet, cond
> + .endm
> + .macro iteee, cond
> + .endm
> +#else /* !__ASSEMBLY__ */
> +__asm__(
> +" .macro it, cond\n"
> +" .endm\n"
> +" .macro itt, cond\n"
> +" .endm\n"
> +" .macro ite, cond\n"
> +" .endm\n"
> +" .macro ittt, cond\n"
> +" .endm\n"
> +" .macro itte, cond\n"
> +" .endm\n"
> +" .macro itet, cond\n"
> +" .endm\n"
> +" .macro itee, cond\n"
> +" .endm\n"
> +" .macro itttt, cond\n"
> +" .endm\n"
> +" .macro ittte, cond\n"
> +" .endm\n"
> +" .macro ittet, cond\n"
> +" .endm\n"
> +" .macro ittee, cond\n"
> +" .endm\n"
> +" .macro itett, cond\n"
> +" .endm\n"
> +" .macro itete, cond\n"
> +" .endm\n"
> +" .macro iteet, cond\n"
> +" .endm\n"
> +" .macro iteee, cond\n"
> +" .endm\n");
> +#endif /* __ASSEMBLY__ */
> +
> +#endif /* CONFIG_ARM_ASM_UNIFIED */
> +
> +#endif /* !__ASM_UNIFIED_H */
> diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
> index 7a0fb58..a930744 100644
> --- a/arch/arm/lib/Makefile
> +++ b/arch/arm/lib/Makefile
> @@ -80,8 +80,8 @@ CFLAGS_cache-cp15.o := -marm
>
> AFLAGS_REMOVE_memset.o := -mthumb -mthumb-interwork
> AFLAGS_REMOVE_memcpy.o := -mthumb -mthumb-interwork
> -AFLAGS_memset.o := -DMEMSET_NO_THUMB_BUILD
> -AFLAGS_memcpy.o := -DMEMCPY_NO_THUMB_BUILD
> -
> +else
> +AFLAGS_memset.o := -DCONFIG_THUMB2_KERNEL
> +AFLAGS_memcpy.o := -DCONFIG_THUMB2_KERNEL
> endif
> endif
> diff --git a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S
> index 7d9fc0f..00602e9 100644
> --- a/arch/arm/lib/memcpy.S
> +++ b/arch/arm/lib/memcpy.S
> @@ -13,12 +13,6 @@
> #include <linux/linkage.h>
> #include <asm/assembler.h>
>
> -#if defined(CONFIG_SYS_THUMB_BUILD) && !defined(MEMCPY_NO_THUMB_BUILD)
> -#define W(instr) instr.w
> -#else
> -#define W(instr) instr
> -#endif
> -
> #define LDR1W_SHIFT 0
> #define STR1W_SHIFT 0
>
> --
> 2.7.0
>

Regards,
Simon