barebox/common/startup.c
Sascha Hauer 641dfaa3a8 startup: use regular debug statements in initcall debugging
Now that we don't need malloc for the console anymore it's
safe to call printf anytime, so switch the initcall debugging
to regular debug() statements..

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
2012-01-26 14:12:04 +01:00

177 lines
4.3 KiB
C

/*
* (C) Copyright 2002-2006
* 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
*/
/**
* @file
* @brief Main entry into the C part of barebox
*/
#include <common.h>
#include <init.h>
#include <command.h>
#include <malloc.h>
#include <memory.h>
#include <debug_ll.h>
#include <fs.h>
#include <linux/stat.h>
#include <environment.h>
#include <asm-generic/memory_layout.h>
#include <asm/sections.h>
extern initcall_t __barebox_initcalls_start[], __barebox_early_initcalls_end[],
__barebox_initcalls_end[];
static void display_meminfo(void)
{
ulong mstart = mem_malloc_start();
ulong mend = mem_malloc_end();
ulong msize = mend - mstart + 1;
debug("barebox code: 0x%p -> 0x%p\n", _stext, _etext);
debug("bss segment: 0x%p -> 0x%p\n", __bss_start, __bss_stop);
printf("Malloc space: 0x%08lx -> 0x%08lx (size %s)\n",
mstart, mend, size_human_readable(msize));
#ifdef CONFIG_ARM
printf("Stack space : 0x%08x -> 0x%08x (size %s)\n",
STACK_BASE, STACK_BASE + STACK_SIZE,
size_human_readable(STACK_SIZE));
#endif
}
#ifdef CONFIG_DEFAULT_ENVIRONMENT
#include <generated/barebox_default_env.h>
#ifdef CONFIG_DEFAULT_ENVIRONMENT_COMPRESSED
#include <uncompress.h>
void *defaultenv;
#else
#define defaultenv default_environment
#endif
static int register_default_env(void)
{
#ifdef CONFIG_DEFAULT_ENVIRONMENT_COMPRESSED
int ret;
void *tmp;
tmp = xzalloc(default_environment_size);
memcpy(tmp, default_environment, default_environment_size);
defaultenv = xzalloc(default_environment_uncompress_size);
ret = uncompress(tmp, default_environment_size, NULL, NULL,
defaultenv, NULL, uncompress_err_stdout);
free(tmp);
if (ret)
return ret;
#endif
add_mem_device("defaultenv", (unsigned long)defaultenv,
default_environment_uncompress_size,
IORESOURCE_MEM_WRITEABLE);
return 0;
}
device_initcall(register_default_env);
#endif
#if defined CONFIG_FS_RAMFS && defined CONFIG_FS_DEVFS
static int mount_root(void)
{
mount("none", "ramfs", "/");
mkdir("/dev", 0);
mount("none", "devfs", "/dev");
return 0;
}
fs_initcall(mount_root);
#endif
void start_barebox (void)
{
initcall_t *initcall;
int result;
#ifdef CONFIG_COMMAND_SUPPORT
struct stat s;
#endif
for (initcall = __barebox_initcalls_start;
initcall < __barebox_initcalls_end; initcall++) {
debug("initcall-> %pS\n", *initcall);
result = (*initcall)();
debug("initcall<- %pS (%d)\n", *initcall, result);
}
debug("initcalls done\n");
display_meminfo();
#ifdef CONFIG_ENV_HANDLING
if (envfs_load(default_environment_path, "/env")) {
#ifdef CONFIG_DEFAULT_ENVIRONMENT
printf("no valid environment found on %s. "
"Using default environment\n",
default_environment_path);
envfs_load("/dev/defaultenv", "/env");
#endif
}
#endif
#ifdef CONFIG_COMMAND_SUPPORT
printf("running /env/bin/init...\n");
if (!stat("/env/bin/init", &s)) {
run_command("source /env/bin/init", 0);
} else {
printf("not found\n");
}
#endif
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;)
run_shell();
/* NOTREACHED - no way out of command loop except booting */
}
void __noreturn hang (void)
{
puts ("### ERROR ### Please RESET the board ###\n");
for (;;);
}
/* Everything needed to cleanly shutdown barebox.
* Should be called before starting an OS to get
* the devices into a clean state
*/
void shutdown_barebox(void)
{
devices_shutdown();
#ifdef ARCH_SHUTDOWN
arch_shutdown();
#endif
}