[U-Boot] [PATCH] powerpc: Minimal private libgcc to build on Debian
Moffett, Kyle D
Kyle.D.Moffett at boeing.com
Wed Dec 7 22:34:47 CET 2011
Ping?
Is this patch acceptable for merging?
Cheers,
Kyle Moffett
On Oct 18, 2011, at 17:16, Moffett, Kyle D wrote:
> Standard Debian powerpc and powerpcspe systems only include hard-float
> libgcc in their native compilers, which causes scary build warnings when
> building U-Boot.
>
> While U-Boot does not use floating point at all, it is perfectly legal
> for a hard-float libgcc to use features of the floating point unit to
> implement 64-bit divides and shifts. Since U-Boot does not set up the
> floating point unit or initialize the registers, that could cause
> crashes or other misbehavior.
>
> In particular, on e500 systems with SPE extensions, a "hard-float"
> libgcc might use the top half of the "extended" 64-bit registers for
> various 64-bit shifts and other operations, which is probably unsafe.
>
> To avoid a dependency on "nof" (IE: soft-float) libgcc provided by the
> system toolchain, U-Boot should be able to provide its own copies of the
> necessary routines just like the Linux kernel does. In particular, this
> resolves build failures on native Debian PowerPC systems which no longer
> provide any soft-float libraries in the system toolchain.
>
> This patch provides an implementation of USE_PRIVATE_LIBGCC=yes from the
> Linux Kernel that matches what the ARM architecture implements in
> assembly files in arch/arm/lib/*.S
>
> Specifically, the routines are: _ashldi3(), _ashrdi3(), and _lshrdi3().
> They were borrowed from arch/powerpc/kernel/misc_32.S as of v2.6.38-rc5,
> commit 85e2efbb1db9a18d218006706d6e4fbeb0216213, and are GPLv2+.
>
> The Makefile framework was copied from the U-Boot ARM port.
>
> Signed-off-by: Kyle Moffett <Kyle.D.Moffett at boeing.com>
> Cc: Wolfgang Denk <wd at denx.de>
> Cc: Kim Phillips <kim.phillips at freescale.com>
> Cc: Andy Fleming <afleming at gmail.com>
> Cc: Kumar Gala <kumar.gala at freescale.com>
> Cc: Stefan Roese <sr at denx.de>
>
> ---
>
> I believe I have addressed all of the previous questions regarding
> this patch with an updated commit message. Can this be merged?
>
> Cheers,
> Kyle Moffett
>
> --
> Curious about my work on the Debian powerpcspe port?
> I'm keeping a blog here: http://pureperl.blogspot.com/
> ---
> arch/powerpc/lib/Makefile | 23 ++++++++++++++++++++-
> arch/powerpc/lib/_ashldi3.S | 45 +++++++++++++++++++++++++++++++++++++++++
> arch/powerpc/lib/_ashrdi3.S | 47 +++++++++++++++++++++++++++++++++++++++++++
> arch/powerpc/lib/_lshrdi3.S | 45 +++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 159 insertions(+), 1 deletions(-)
> create mode 100644 arch/powerpc/lib/_ashldi3.S
> create mode 100644 arch/powerpc/lib/_ashrdi3.S
> create mode 100644 arch/powerpc/lib/_lshrdi3.S
>
> diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile
> index 724d8ee..cdd62a2 100644
> --- a/arch/powerpc/lib/Makefile
> +++ b/arch/powerpc/lib/Makefile
> @@ -23,6 +23,19 @@
>
> include $(TOPDIR)/config.mk
>
> +## Build a couple of necessary functions into a private libgcc
> +LIBGCC = $(obj)libgcc.o
> +GLSOBJS += _ashldi3.o
> +GLSOBJS += _ashrdi3.o
> +GLSOBJS += _lshrdi3.o
> +LGOBJS := $(addprefix $(obj),$(GLSOBJS)) \
> + $(addprefix $(obj),$(GLCOBJS))
> +
> +## But only build it if the user asked for it
> +ifdef USE_PRIVATE_LIBGCC
> +TARGETS += $(LIBGCC)
> +endif
> +
> LIB = $(obj)lib$(ARCH).o
>
> SOBJS-y += ppccache.o
> @@ -53,9 +66,14 @@ endif
>
> COBJS += $(sort $(COBJS-y))
>
> -SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
> +SRCS := $(GLSOBJS:.o=.S) $(GLCOBJS:.o=.c) \
> + $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
> OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
>
> +TARGETS += $(LIB)
> +
> +all: $(TARGETS)
> +
> $(LIB): $(obj).depend $(OBJS)
> @if ! $(CROSS_COMPILE)readelf -S $(OBJS) | grep -q '\.fixup.*PROGBITS';\
> then \
> @@ -65,6 +83,9 @@ $(LIB): $(obj).depend $(OBJS)
> fi;
> $(call cmd_link_o_target, $(OBJS))
>
> +$(LIBGCC): $(obj).depend $(LGOBJS)
> + $(call cmd_link_o_target, $(LGOBJS))
> +
> #########################################################################
>
> # defines $(obj).depend target
> diff --git a/arch/powerpc/lib/_ashldi3.S b/arch/powerpc/lib/_ashldi3.S
> new file mode 100644
> index 0000000..e452f56
> --- /dev/null
> +++ b/arch/powerpc/lib/_ashldi3.S
> @@ -0,0 +1,45 @@
> +/*
> + * This code was copied from arch/powerpc/kernel/misc_32.S in the Linux
> + * kernel sources (commit 85e2efbb1db9a18d218006706d6e4fbeb0216213, also
> + * known as 2.6.38-rc5). The source file copyrights are as follows:
> + *
> + * (C) Copyright 1995-1996 Gary Thomas (gdt at linuxppc.org)
> + *
> + * Largely rewritten by Cort Dougan (cort at cs.nmt.edu)
> + * and Paul Mackerras.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + */
> +
> +#include <ppc_asm.tmpl>
> +#include <ppc_defs.h>
> +#include <config.h>
> +
> +/*
> + * Extended precision shifts.
> + *
> + * Updated to be valid for shift counts from 0 to 63 inclusive.
> + * -- Gabriel
> + *
> + * R3/R4 has 64 bit value
> + * R5 has shift count
> + * result in R3/R4
> + *
> + * ashrdi3: arithmetic right shift (sign propagation)
> + * lshrdi3: logical right shift
> + * ashldi3: left shift
> + */
> + .globl __ashldi3
> +__ashldi3:
> + subfic r6,r5,32
> + slw r3,r3,r5 # MSW = count > 31 ? 0 : MSW << count
> + addi r7,r5,32 # could be xori, or addi with -32
> + srw r6,r4,r6 # t1 = count > 31 ? 0 : LSW >> (32-count)
> + slw r7,r4,r7 # t2 = count < 32 ? 0 : LSW << (count-32)
> + or r3,r3,r6 # MSW |= t1
> + slw r4,r4,r5 # LSW = LSW << count
> + or r3,r3,r7 # MSW |= t2
> + blr
> diff --git a/arch/powerpc/lib/_ashrdi3.S b/arch/powerpc/lib/_ashrdi3.S
> new file mode 100644
> index 0000000..f28ab49
> --- /dev/null
> +++ b/arch/powerpc/lib/_ashrdi3.S
> @@ -0,0 +1,47 @@
> +/*
> + * This code was copied from arch/powerpc/kernel/misc_32.S in the Linux
> + * kernel sources (commit 85e2efbb1db9a18d218006706d6e4fbeb0216213, also
> + * known as 2.6.38-rc5). The source file copyrights are as follows:
> + *
> + * (C) Copyright 1995-1996 Gary Thomas (gdt at linuxppc.org)
> + *
> + * Largely rewritten by Cort Dougan (cort at cs.nmt.edu)
> + * and Paul Mackerras.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + */
> +
> +#include <ppc_asm.tmpl>
> +#include <ppc_defs.h>
> +#include <config.h>
> +
> +/*
> + * Extended precision shifts.
> + *
> + * Updated to be valid for shift counts from 0 to 63 inclusive.
> + * -- Gabriel
> + *
> + * R3/R4 has 64 bit value
> + * R5 has shift count
> + * result in R3/R4
> + *
> + * ashrdi3: arithmetic right shift (sign propagation)
> + * lshrdi3: logical right shift
> + * ashldi3: left shift
> + */
> + .globl __ashrdi3
> +__ashrdi3:
> + subfic r6,r5,32
> + srw r4,r4,r5 # LSW = count > 31 ? 0 : LSW >> count
> + addi r7,r5,32 # could be xori, or addi with -32
> + slw r6,r3,r6 # t1 = count > 31 ? 0 : MSW << (32-count)
> + rlwinm r8,r7,0,32 # t3 = (count < 32) ? 32 : 0
> + sraw r7,r3,r7 # t2 = MSW >> (count-32)
> + or r4,r4,r6 # LSW |= t1
> + slw r7,r7,r8 # t2 = (count < 32) ? 0 : t2
> + sraw r3,r3,r5 # MSW = MSW >> count
> + or r4,r4,r7 # LSW |= t2
> + blr
> diff --git a/arch/powerpc/lib/_lshrdi3.S b/arch/powerpc/lib/_lshrdi3.S
> new file mode 100644
> index 0000000..c1bbe7b
> --- /dev/null
> +++ b/arch/powerpc/lib/_lshrdi3.S
> @@ -0,0 +1,45 @@
> +/*
> + * This code was copied from arch/powerpc/kernel/misc_32.S in the Linux
> + * kernel sources (commit 85e2efbb1db9a18d218006706d6e4fbeb0216213, also
> + * known as 2.6.38-rc5). The source file copyrights are as follows:
> + *
> + * (C) Copyright 1995-1996 Gary Thomas (gdt at linuxppc.org)
> + *
> + * Largely rewritten by Cort Dougan (cort at cs.nmt.edu)
> + * and Paul Mackerras.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + */
> +
> +#include <ppc_asm.tmpl>
> +#include <ppc_defs.h>
> +#include <config.h>
> +
> +/*
> + * Extended precision shifts.
> + *
> + * Updated to be valid for shift counts from 0 to 63 inclusive.
> + * -- Gabriel
> + *
> + * R3/R4 has 64 bit value
> + * R5 has shift count
> + * result in R3/R4
> + *
> + * ashrdi3: arithmetic right shift (sign propagation)
> + * lshrdi3: logical right shift
> + * ashldi3: left shift
> + */
> + .globl __lshrdi3
> +__lshrdi3:
> + subfic r6,r5,32
> + srw r4,r4,r5 # LSW = count > 31 ? 0 : LSW >> count
> + addi r7,r5,32 # could be xori, or addi with -32
> + slw r6,r3,r6 # t1 = count > 31 ? 0 : MSW << (32-count)
> + srw r7,r3,r7 # t2 = count < 32 ? 0 : MSW >> (count-32)
> + or r4,r4,r6 # LSW |= t1
> + srw r3,r3,r5 # MSW = MSW >> count
> + or r4,r4,r7 # LSW |= t2
> + blr
> --
> 1.7.2.5
>
More information about the U-Boot
mailing list