On Thu, 2010-09-30 at 19:52 +0400, Maxim Uvarov wrote: > crt.S patch had fixes for gcc -Os (optimaze for size), same as > kernel has. Without this fixes powerpc gcc 4.4 generates forever > loop functions for kexec. > > This happends because crtsavres code was spit up to individual files > (http://gcc.gnu.org/ml/gcc-patches/2008-03/msg01294.html) and > kexec purgatory code has following options: > --no-undefined -nostartfiles -nostdlib -nodefaultlibs > So in that case crtasaveregs function are not defined and final object > file has been linked without them. This does not happen with applications > built without -nostdlib, because gcc will add it's standard functions. > Signed-off-by: Maxim Uvarov <muvarov at gmail.com> Acked-by: Matthew McClintock <msm at freescale.com> In lieu of http://lists.infradead.org/pipermail/kexec/2010-October/004600.html -M > --- > > purgatory/arch/ppc/misc.S | 229 +++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 229 insertions(+), 0 deletions(-) > > diff --git a/purgatory/arch/ppc/misc.S b/purgatory/arch/ppc/misc.S > index b0a5486..bc6a18d 100644 > --- a/purgatory/arch/ppc/misc.S > +++ b/purgatory/arch/ppc/misc.S > @@ -16,6 +16,235 @@ > > #include "ppc_asm.h" > > +/* This is from linux-2.6/arch/powerpc/lib/crtsavres.S: > + * > + * Special support for eabi and SVR4 > + * > + * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc. > + * Copyright 2008 Freescale Semiconductor, Inc. > + * Written By Michael Meissner > + * > + * Based on gcc/config/rs6000/crtsavres.asm from gcc > + * > + * This file 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, or (at your option) any > + * later version. > + * > + * In addition to the permissions in the GNU General Public License, the > + * Free Software Foundation gives you unlimited permission to link the > + * compiled version of this file with other programs, and to distribute > + * those programs without any restriction coming from the use of this > + * file. (The General Public License restrictions do apply in other > + * respects; for example, they cover modification of the file, and > + * distribution when not linked into another program.) > + * > + * This file 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; see the file COPYING. If not, write to > + * the Free Software Foundation, 51 Franklin Street, Fifth Floor, > + * Boston, MA 02110-1301, USA. > + * > + * As a special exception, if you link this library with files > + * compiled with GCC to produce an executable, this does not cause > + * the resulting executable to be covered by the GNU General Public License. > + * This exception does not however invalidate any other reasons why > + * the executable file might be covered by the GNU General Public License. > + */ > +#include "config.h" > + > +#define _GLOBAL(name) \ > + .type name, at function; \ > + .globl name; \ > +name: > + > +/* Routines for saving integer registers, called by the compiler. */ > +/* Called with r11 pointing to the stack header word of the caller of the */ > +/* function, just beyond the end of the integer save area. */ > + > +_GLOBAL(_savegpr_14) > +_GLOBAL(_save32gpr_14) > + stw 14,-72(11) /* save gp registers */ > +_GLOBAL(_savegpr_15) > +_GLOBAL(_save32gpr_15) > + stw 15,-68(11) > +_GLOBAL(_savegpr_16) > +_GLOBAL(_save32gpr_16) > + stw 16,-64(11) > +_GLOBAL(_savegpr_17) > +_GLOBAL(_save32gpr_17) > + stw 17,-60(11) > +_GLOBAL(_savegpr_18) > +_GLOBAL(_save32gpr_18) > + stw 18,-56(11) > +_GLOBAL(_savegpr_19) > +_GLOBAL(_save32gpr_19) > + stw 19,-52(11) > +_GLOBAL(_savegpr_20) > +_GLOBAL(_save32gpr_20) > + stw 20,-48(11) > +_GLOBAL(_savegpr_21) > +_GLOBAL(_save32gpr_21) > + stw 21,-44(11) > +_GLOBAL(_savegpr_22) > +_GLOBAL(_save32gpr_22) > + stw 22,-40(11) > +_GLOBAL(_savegpr_23) > +_GLOBAL(_save32gpr_23) > + stw 23,-36(11) > +_GLOBAL(_savegpr_24) > +_GLOBAL(_save32gpr_24) > + stw 24,-32(11) > +_GLOBAL(_savegpr_25) > +_GLOBAL(_save32gpr_25) > + stw 25,-28(11) > +_GLOBAL(_savegpr_26) > +_GLOBAL(_save32gpr_26) > + stw 26,-24(11) > +_GLOBAL(_savegpr_27) > +_GLOBAL(_save32gpr_27) > + stw 27,-20(11) > +_GLOBAL(_savegpr_28) > +_GLOBAL(_save32gpr_28) > + stw 28,-16(11) > +_GLOBAL(_savegpr_29) > +_GLOBAL(_save32gpr_29) > + stw 29,-12(11) > +_GLOBAL(_savegpr_30) > +_GLOBAL(_save32gpr_30) > + stw 30,-8(11) > +_GLOBAL(_savegpr_31) > +_GLOBAL(_save32gpr_31) > + stw 31,-4(11) > + blr > + > +/* Routines for restoring integer registers, called by the compiler. */ > +/* Called with r11 pointing to the stack header word of the caller of the */ > +/* function, just beyond the end of the integer restore area. */ > + > +_GLOBAL(_restgpr_14) > +_GLOBAL(_rest32gpr_14) > + lwz 14,-72(11) /* restore gp registers */ > +_GLOBAL(_restgpr_15) > +_GLOBAL(_rest32gpr_15) > + lwz 15,-68(11) > +_GLOBAL(_restgpr_16) > +_GLOBAL(_rest32gpr_16) > + lwz 16,-64(11) > +_GLOBAL(_restgpr_17) > +_GLOBAL(_rest32gpr_17) > + lwz 17,-60(11) > +_GLOBAL(_restgpr_18) > +_GLOBAL(_rest32gpr_18) > + lwz 18,-56(11) > +_GLOBAL(_restgpr_19) > +_GLOBAL(_rest32gpr_19) > + lwz 19,-52(11) > +_GLOBAL(_restgpr_20) > +_GLOBAL(_rest32gpr_20) > + lwz 20,-48(11) > +_GLOBAL(_restgpr_21) > +_GLOBAL(_rest32gpr_21) > + lwz 21,-44(11) > +_GLOBAL(_restgpr_22) > +_GLOBAL(_rest32gpr_22) > + lwz 22,-40(11) > +_GLOBAL(_restgpr_23) > +_GLOBAL(_rest32gpr_23) > + lwz 23,-36(11) > +_GLOBAL(_restgpr_24) > +_GLOBAL(_rest32gpr_24) > + lwz 24,-32(11) > +_GLOBAL(_restgpr_25) > +_GLOBAL(_rest32gpr_25) > + lwz 25,-28(11) > +_GLOBAL(_restgpr_26) > +_GLOBAL(_rest32gpr_26) > + lwz 26,-24(11) > +_GLOBAL(_restgpr_27) > +_GLOBAL(_rest32gpr_27) > + lwz 27,-20(11) > +_GLOBAL(_restgpr_28) > +_GLOBAL(_rest32gpr_28) > + lwz 28,-16(11) > +_GLOBAL(_restgpr_29) > +_GLOBAL(_rest32gpr_29) > + lwz 29,-12(11) > +_GLOBAL(_restgpr_30) > +_GLOBAL(_rest32gpr_30) > + lwz 30,-8(11) > +_GLOBAL(_restgpr_31) > +_GLOBAL(_rest32gpr_31) > + lwz 31,-4(11) > + blr > + > +/* Routines for restoring integer registers, called by the compiler. */ > +/* Called with r11 pointing to the stack header word of the caller of the */ > +/* function, just beyond the end of the integer restore area. */ > + > +_GLOBAL(_restgpr_14_x) > +_GLOBAL(_rest32gpr_14_x) > + lwz 14,-72(11) /* restore gp registers */ > +_GLOBAL(_restgpr_15_x) > +_GLOBAL(_rest32gpr_15_x) > + lwz 15,-68(11) > +_GLOBAL(_restgpr_16_x) > +_GLOBAL(_rest32gpr_16_x) > + lwz 16,-64(11) > +_GLOBAL(_restgpr_17_x) > +_GLOBAL(_rest32gpr_17_x) > + lwz 17,-60(11) > +_GLOBAL(_restgpr_18_x) > +_GLOBAL(_rest32gpr_18_x) > + lwz 18,-56(11) > +_GLOBAL(_restgpr_19_x) > +_GLOBAL(_rest32gpr_19_x) > + lwz 19,-52(11) > +_GLOBAL(_restgpr_20_x) > +_GLOBAL(_rest32gpr_20_x) > + lwz 20,-48(11) > +_GLOBAL(_restgpr_21_x) > +_GLOBAL(_rest32gpr_21_x) > + lwz 21,-44(11) > +_GLOBAL(_restgpr_22_x) > +_GLOBAL(_rest32gpr_22_x) > + lwz 22,-40(11) > +_GLOBAL(_restgpr_23_x) > +_GLOBAL(_rest32gpr_23_x) > + lwz 23,-36(11) > +_GLOBAL(_restgpr_24_x) > +_GLOBAL(_rest32gpr_24_x) > + lwz 24,-32(11) > +_GLOBAL(_restgpr_25_x) > +_GLOBAL(_rest32gpr_25_x) > + lwz 25,-28(11) > +_GLOBAL(_restgpr_26_x) > +_GLOBAL(_rest32gpr_26_x) > + lwz 26,-24(11) > +_GLOBAL(_restgpr_27_x) > +_GLOBAL(_rest32gpr_27_x) > + lwz 27,-20(11) > +_GLOBAL(_restgpr_28_x) > +_GLOBAL(_rest32gpr_28_x) > + lwz 28,-16(11) > +_GLOBAL(_restgpr_29_x) > +_GLOBAL(_rest32gpr_29_x) > + lwz 29,-12(11) > +_GLOBAL(_restgpr_30_x) > +_GLOBAL(_rest32gpr_30_x) > + lwz 30,-8(11) > +_GLOBAL(_restgpr_31_x) > +_GLOBAL(_rest32gpr_31_x) > + lwz 0,4(11) > + lwz 31,-4(11) > + mtlr 0 > + mr 1,11 > + blr > + > .text > > /* > > > Best regards, > Maxim Uvarov. > > >