x86: Move do_go_exec() out of board.c
-- Changes for v2: - None
This commit is contained in:
parent
b843f31193
commit
d13640b7c4
@ -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
|
||||
|
@ -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")));
|
||||
|
||||
|
64
arch/x86/lib/cmd_boot.c
Normal file
64
arch/x86/lib/cmd_boot.c
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* (C) Copyright 2008-2011
|
||||
* Graeme Russ, <graeme.russ@gmail.com>
|
||||
*
|
||||
* (C) Copyright 2002
|
||||
* Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
|
||||
*
|
||||
* (C) Copyright 2002
|
||||
* Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
|
||||
*
|
||||
* (C) Copyright 2002
|
||||
* Sysgo Real-Time Solutions, GmbH <www.elinos.com>
|
||||
* Marius Groeger <mgroeger@sysgo.de>
|
||||
*
|
||||
* 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 <common.h>
|
||||
#include <command.h>
|
||||
#include <malloc.h>
|
||||
#include <asm/u-boot-x86.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user