diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2011-04-01 14:18:40 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2011-04-04 16:27:57 +0200 |
commit | bb7fff04afdddaa63c2f519221df07abf8a8467d (patch) | |
tree | 77c181063f1268fedf0ec9e2259c9a151c758231 /arch/arm/lib/bootm.c | |
parent | 4ade5f86705c93fd5b9512658aff014ee0ee5121 (diff) | |
download | barebox-bb7fff04afdddaa63c2f519221df07abf8a8467d.tar.gz barebox-bb7fff04afdddaa63c2f519221df07abf8a8467d.tar.xz |
ARM: move bootm code to its own file
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/lib/bootm.c')
-rw-r--r-- | arch/arm/lib/bootm.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c new file mode 100644 index 0000000000..b09fe70e3e --- /dev/null +++ b/arch/arm/lib/bootm.c @@ -0,0 +1,92 @@ +#include <boot.h> +#include <common.h> +#include <command.h> +#include <driver.h> +#include <environment.h> +#include <image.h> +#include <zlib.h> +#include <init.h> +#include <fs.h> +#include <linux/list.h> +#include <xfuncs.h> +#include <malloc.h> +#include <fcntl.h> +#include <errno.h> + +#include <asm/byteorder.h> +#include <asm/global_data.h> +#include <asm/setup.h> +#include <asm/barebox-arm.h> +#include <asm/armlinux.h> +#include <asm/system.h> + +static int do_bootm_linux(struct image_data *data) +{ + void (*theKernel)(int zero, int arch, void *params); + image_header_t *os_header = &data->os->header; + + if (image_get_type(os_header) == IH_TYPE_MULTI) { + printf("Multifile images not handled at the moment\n"); + return -1; + } + + theKernel = (void *)image_get_ep(os_header); + + debug("## Transferring control to Linux (at address 0x%p) ...\n", + theKernel); + + if (relocate_image(data->os, (void *)image_get_load(os_header))) + return -1; + + if (data->initrd) + if (relocate_image(data->initrd, (void *)image_get_load(&data->initrd->header))) + return -1; + + /* we assume that the kernel is in place */ + printf("\nStarting kernel %s...\n\n", data->initrd ? "with initrd " : ""); + + start_linux(theKernel, 0, data); + + return -1; +} + +static int image_handle_cmdline_parse(struct image_data *data, int opt, + char *optarg) +{ + int ret = 1; + int no; + + switch (opt) { + case 'a': + no = simple_strtoul(optarg, NULL, 0); + armlinux_set_architecture(no); + ret = 0; + break; + case 'R': + no = simple_strtoul(optarg, NULL, 0); + armlinux_set_revision(no); + ret = 0; + break; + default: + break; + } + + return ret; +} + +static struct image_handler handler = { + .cmdline_options = "a:R:", + .cmdline_parse = image_handle_cmdline_parse, + .help_string = " -a <arch> use architecture number <arch>\n" + " -R <system_rev> use system revison <system_rev>\n", + + .bootm = do_bootm_linux, + .image_type = IH_OS_LINUX, +}; + +static int armlinux_register_image_handler(void) +{ + return register_image_handler(&handler); +} + +late_initcall(armlinux_register_image_handler); |