From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Tue, 3 Jan 2012 21:48:05 -0800 Subject: [U-Boot] [PATCH 13/17] x86: Move do_go_exec() out of board.c In-Reply-To: <1325477374-6417-14-git-send-email-graeme.russ@gmail.com> References: <1325477374-6417-1-git-send-email-graeme.russ@gmail.com> <1325477374-6417-14-git-send-email-graeme.russ@gmail.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ wrote: > > Signed-off-by: Graeme Russ Acked-by: Simon Glass > --- > ?arch/x86/lib/Makefile ? | ? ?1 + > ?arch/x86/lib/board.c ? ?| ? 27 ------------------- > ?arch/x86/lib/cmd_boot.c | ? 64 +++++++++++++++++++++++++++++++++++++++++++++++ > ?3 files changed, 65 insertions(+), 27 deletions(-) > ?create mode 100644 arch/x86/lib/cmd_boot.c > > diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile > index d584aa4..7820895 100644 > --- a/arch/x86/lib/Makefile > +++ b/arch/x86/lib/Makefile > @@ -32,6 +32,7 @@ SOBJS-$(CONFIG_SYS_X86_REALMODE) ? ? ?+= realmode_switch.o > ?COBJS-$(CONFIG_SYS_PC_BIOS) ? ?+= bios_setup.o > ?COBJS-y ? ? ? ?+= board.o > ?COBJS-y ? ? ? ?+= bootm.o > +COBJS-y ? ? ? ?+= cmd_boot.o > ?COBJS-y ? ? ? ?+= gcc.o > ?COBJS-y ? ? ? ?+= interrupts.o > ?COBJS-$(CONFIG_SYS_PCAT_INTERRUPTS) += pcat_interrupts.o > diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c > index 52e27e1..533adf1 100644 > --- a/arch/x86/lib/board.c > +++ b/arch/x86/lib/board.c > @@ -487,33 +487,6 @@ void hang(void) > ? ? ? ? ? ? ? ?; > ?} > > -unsigned long do_go_exec(ulong (*entry)(int, char * const []), > - ? ? ? ? ? ? ? ? ? ? ? ?int argc, char * const argv[]) > -{ > - ? ? ? unsigned long ret = 0; > - ? ? ? char **argv_tmp; > - > - ? ? ? /* > - ? ? ? ?* x86 does not use a dedicated register to pass the pointer to > - ? ? ? ?* the global_data, so it is instead passed as argv[-1]. By using > - ? ? ? ?* argv[-1], the called 'Application' can use the contents of > - ? ? ? ?* argv natively. However, to safely use argv[-1] a new copy of > - ? ? ? ?* argv is needed with the extra element > - ? ? ? ?*/ > - ? ? ? argv_tmp = malloc(sizeof(char *) * (argc + 1)); > - > - ? ? ? if (argv_tmp) { > - ? ? ? ? ? ? ? argv_tmp[0] = (char *)gd; > - > - ? ? ? ? ? ? ? memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc)); > - > - ? ? ? ? ? ? ? ret = (entry) (argc, &argv_tmp[1]); > - ? ? ? ? ? ? ? free(argv_tmp); > - ? ? ? } > - > - ? ? ? return ret; > -} > - > ?void setup_pcat_compatibility(void) > ? ? ? ?__attribute__((weak, alias("__setup_pcat_compatibility"))); > > diff --git a/arch/x86/lib/cmd_boot.c b/arch/x86/lib/cmd_boot.c > new file mode 100644 > index 0000000..a81a9a3 > --- /dev/null > +++ b/arch/x86/lib/cmd_boot.c > @@ -0,0 +1,64 @@ > +/* > + * (C) Copyright 2008-2011 > + * Graeme Russ, > + * > + * (C) Copyright 2002 > + * Daniel Engstr?m, Omicron Ceti AB, > + * > + * (C) Copyright 2002 > + * Wolfgang Denk, DENX Software Engineering, > + * > + * (C) Copyright 2002 > + * Sysgo Real-Time Solutions, GmbH > + * Marius Groeger > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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. > + * > + * 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 > + */ > + > +#include > +#include > +#include > +#include > + > +unsigned long do_go_exec(ulong (*entry)(int, char * const []), > + ? ? ? ? ? ? ? ? ? ? ? ?int argc, char * const argv[]) > +{ > + ? ? ? unsigned long ret = 0; > + ? ? ? char **argv_tmp; > + > + ? ? ? /* > + ? ? ? ?* x86 does not use a dedicated register to pass the pointer to > + ? ? ? ?* the global_data, so it is instead passed as argv[-1]. By using > + ? ? ? ?* argv[-1], the called 'Application' can use the contents of > + ? ? ? ?* argv natively. However, to safely use argv[-1] a new copy of > + ? ? ? ?* argv is needed with the extra element > + ? ? ? ?*/ > + ? ? ? argv_tmp = malloc(sizeof(char *) * (argc + 1)); > + > + ? ? ? if (argv_tmp) { > + ? ? ? ? ? ? ? argv_tmp[0] = (char *)gd; > + > + ? ? ? ? ? ? ? memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc)); > + > + ? ? ? ? ? ? ? ret = (entry) (argc, &argv_tmp[1]); > + ? ? ? ? ? ? ? free(argv_tmp); > + ? ? ? } > + > + ? ? ? return ret; > +} > -- > 1.7.5.2.317.g391b14 > > _______________________________________________ > U-Boot mailing list > U-Boot at lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot