From b97a2a0a21f279d66de8a9bdbfe21920968bcb1c Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Tue, 8 Jan 2008 18:14:09 +0100 Subject: [new uImage] Define a API for image handling operations - Add inline helper macros for basic header processing - Move common non inline code common/image.c - Replace direct header access with the API routines - Rename IH_CPU_* to IH_ARCH_* Signed-off-by: Marian Balakowicz --- lib_i386/i386_linux.c | 44 +++++++++++++++++--------------------------- lib_i386/zimage.c | 33 ++++++++++++++++----------------- 2 files changed, 33 insertions(+), 44 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/i386_linux.c b/lib_i386/i386_linux.c index b4a6f5a3cd..67a78c4e3b 100644 --- a/lib_i386/i386_linux.c +++ b/lib_i386/i386_linux.c @@ -50,7 +50,7 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], { void *base_ptr; - ulong len = 0, checksum; + ulong len = 0; ulong initrd_start, initrd_end; ulong data; image_header_t *hdr = &header; @@ -60,48 +60,37 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], */ if (argc >= 3) { addr = simple_strtoul(argv[2], NULL, 16); + hdr = (image_header_t *)addr; printf ("## Loading Ramdisk Image at %08lx ...\n", addr); - /* Copy header so we can blank CRC field for re-calculation */ - memcpy (&header, (char *)addr, sizeof(image_header_t)); - - if (ntohl(hdr->ih_magic) != IH_MAGIC) { + if (!image_check_magic (hdr)) { printf ("Bad Magic Number\n"); do_reset (cmdtp, flag, argc, argv); } - data = (ulong)&header; - len = sizeof(image_header_t); - - checksum = ntohl(hdr->ih_hcrc); - hdr->ih_hcrc = 0; - - if (crc32 (0, (char *)data, len) != checksum) { + if (!image_check_hcrc (hdr)) { printf ("Bad Header Checksum\n"); do_reset (cmdtp, flag, argc, argv); } print_image_hdr (hdr); - data = addr + sizeof(image_header_t); - len = ntohl(hdr->ih_size); + data = image_get_data (hdr); + len = image_get_data_size (hdr); if (verify) { - ulong csum = 0; - printf (" Verifying Checksum ... "); - csum = crc32 (0, (char *)data, len); - if (csum != ntohl(hdr->ih_dcrc)) { + if (!image_check_dcrc (hdr)) { printf ("Bad Data CRC\n"); do_reset (cmdtp, flag, argc, argv); } printf ("OK\n"); } - if ((hdr->ih_os != IH_OS_LINUX) || - (hdr->ih_arch != IH_CPU_I386) || - (hdr->ih_type != IH_TYPE_RAMDISK) ) { + if (!image_check_os (hdr, IH_OS_LINUX) || + !image_check_arch (hdr, IH_ARCH_I386) || + !image_check_type (hdr, IH_TYPE_RAMDISK)) { printf ("No Linux i386 Ramdisk Image\n"); do_reset (cmdtp, flag, argc, argv); } @@ -109,8 +98,8 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], /* * Now check if we have a multifile image */ - } else if ((hdr->ih_type==IH_TYPE_MULTI) && (len_ptr[1])) { - ulong tail = ntohl(len_ptr[0]) % 4; + } else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { + ulong tail = image_to_cpu (len_ptr[0]) % 4; int i; /* skip kernel length and terminator */ @@ -119,12 +108,12 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], for (i=1; len_ptr[i]; ++i) data += 4; /* add kernel length, and align */ - data += ntohl(len_ptr[0]); + data += image_to_cpu (len_ptr[0]); if (tail) { data += 4 - tail; } - len = ntohl(len_ptr[1]); + len = image_to_cpu (len_ptr[1]); } else { /* @@ -152,12 +141,13 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], } /* if multi-part image, we need to advance base ptr */ - if ((hdr->ih_type==IH_TYPE_MULTI) && (len_ptr[1])) { + if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { int i; for (i=0, addr+=sizeof(int); len_ptr[i++]; addr+=sizeof(int)); } - base_ptr = load_zimage((void*)addr + sizeof(image_header_t), ntohl(hdr->ih_size), + base_ptr = load_zimage((void*)addr + image_get_header_size (), + image_get_data_size (hdr), initrd_start, initrd_end-initrd_start, 0); if (NULL == base_ptr) { diff --git a/lib_i386/zimage.c b/lib_i386/zimage.c index 3510f2fd64..20f9f8d84b 100644 --- a/lib_i386/zimage.c +++ b/lib_i386/zimage.c @@ -251,25 +251,24 @@ image_header_t *fake_zimage_header(image_header_t *hdr, void *ptr, int size) #else checksum = 0; #endif - memset(hdr, 0, sizeof(image_header_t)); + memset(hdr, 0, image_get_header_size ()); /* Build new header */ - hdr->ih_magic = htonl(IH_MAGIC); - hdr->ih_time = 0; - hdr->ih_size = htonl(size); - hdr->ih_load = htonl(ZIMAGE_LOAD); - hdr->ih_ep = 0; - hdr->ih_dcrc = htonl(checksum); - hdr->ih_os = IH_OS_LINUX; - hdr->ih_arch = IH_CPU_I386; - hdr->ih_type = IH_TYPE_KERNEL; - hdr->ih_comp = IH_COMP_NONE; - - strncpy((char *)hdr->ih_name, "(none)", IH_NMLEN); - - checksum = crc32(0,(const char *)hdr,sizeof(image_header_t)); - - hdr->ih_hcrc = htonl(checksum); + image_set_magic (hdr, IH_MAGIC); + image_set_time (hdr, 0); + image_set_size (hdr, size); + image_set_load (hdr, ZIMAGE_LOAD); + image_set_ep (hdr, 0); + image_set_dcrc (hdr, checksum); + image_set_os (hdr, IH_OS_LINUX); + image_set_arch (hdr, IH_ARCH_I386); + image_set_type (hdr, IH_TYPE_KERNEL); + image_set_comp (hdr, IH_COMP_NONE); + + image_set_name (hdr, "(none)"); + + checksum = crc32 (0, (const char *)hdr, image_get_header_size ()); + image_set_hcrc (hdr, checksum); return hdr; } -- cgit From 261dcf4624b25f3c551efcf8634e9194fabba9c3 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Tue, 8 Jan 2008 18:11:44 +0100 Subject: [new uImage] Remove I386 uImage fake_header() routine I386 targets are not using a uImage format, instead fake header is added to ram image before it is further processed by bootm. Remove this fixup and force proper uImage use for I386. Signed-off-by: Marian Balakowicz --- lib_i386/i386_linux.c | 12 ------------ lib_i386/zimage.c | 49 ------------------------------------------------- 2 files changed, 61 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/i386_linux.c b/lib_i386/i386_linux.c index 67a78c4e3b..6cb021a193 100644 --- a/lib_i386/i386_linux.c +++ b/lib_i386/i386_linux.c @@ -33,18 +33,6 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); extern image_header_t header; /* from cmd_bootm.c */ - -image_header_t *fake_header(image_header_t *hdr, void *ptr, int size) -{ - /* try each supported image type in order */ - if (NULL != fake_zimage_header(hdr, ptr, size)) { - return hdr; - } - - return NULL; -} - - void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong addr, ulong *len_ptr, int verify) { diff --git a/lib_i386/zimage.c b/lib_i386/zimage.c index 20f9f8d84b..c3b4e597aa 100644 --- a/lib_i386/zimage.c +++ b/lib_i386/zimage.c @@ -212,7 +212,6 @@ void *load_zimage(char *image, unsigned long kernel_size, return setup_base; } - void boot_zimage(void *setup_base) { struct pt_regs regs; @@ -224,51 +223,3 @@ void boot_zimage(void *setup_base) regs.eflags = 0; enter_realmode(((u32)setup_base+SETUP_START_OFFSET)>>4, 0, ®s, ®s); } - - -image_header_t *fake_zimage_header(image_header_t *hdr, void *ptr, int size) -{ - /* There is no way to know the size of a zImage ... * - * so we assume that 2MB will be enough for now */ -#define ZIMAGE_SIZE 0x200000 - - /* load a 1MB, the loaded will have to be moved to its final - * position again later... */ -#define ZIMAGE_LOAD 0x100000 - - ulong checksum; - - if (KERNEL_MAGIC != *(u16*)(ptr + BOOT_FLAG_OFF)) { - /* not a zImage or bzImage */ - return NULL; - } - - if (-1 == size) { - size = ZIMAGE_SIZE; - } -#if 0 - checksum = crc32 (0, ptr, size); -#else - checksum = 0; -#endif - memset(hdr, 0, image_get_header_size ()); - - /* Build new header */ - image_set_magic (hdr, IH_MAGIC); - image_set_time (hdr, 0); - image_set_size (hdr, size); - image_set_load (hdr, ZIMAGE_LOAD); - image_set_ep (hdr, 0); - image_set_dcrc (hdr, checksum); - image_set_os (hdr, IH_OS_LINUX); - image_set_arch (hdr, IH_ARCH_I386); - image_set_type (hdr, IH_TYPE_KERNEL); - image_set_comp (hdr, IH_COMP_NONE); - - image_set_name (hdr, "(none)"); - - checksum = crc32 (0, (const char *)hdr, image_get_header_size ()); - image_set_hcrc (hdr, checksum); - - return hdr; -} -- cgit From 15158971f49255ccef54f0979a942cfd3de2ae52 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Tue, 8 Jan 2008 18:11:44 +0100 Subject: [new uImage] Fix uImage header pointer use in i386 do_bootm_linux() Use image header copy instead of a (possibly corrupted) pointer to a initial image location. Signed-off-by: Marian Balakowicz --- lib_i386/i386_linux.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/i386_linux.c b/lib_i386/i386_linux.c index 6cb021a193..b0cf2630ca 100644 --- a/lib_i386/i386_linux.c +++ b/lib_i386/i386_linux.c @@ -129,13 +129,13 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], } /* if multi-part image, we need to advance base ptr */ - if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { + if (image_check_type (&header, IH_TYPE_MULTI) && (len_ptr[1])) { int i; for (i=0, addr+=sizeof(int); len_ptr[i++]; addr+=sizeof(int)); } - base_ptr = load_zimage((void*)addr + image_get_header_size (), - image_get_data_size (hdr), + base_ptr = load_zimage ((void*)addr + image_get_header_size (), + image_get_data_size (&header), initrd_start, initrd_end-initrd_start, 0); if (NULL == base_ptr) { -- cgit From f13e7b2e993c61fed1f607962501e051940d6e80 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Tue, 8 Jan 2008 18:12:17 +0100 Subject: [new uImage] Cleanup image header pointer use in bootm code - use single image header pointer instead of a set of auxilliary variables. - add multi component image helper routines: get component size/data address Signed-off-by: Marian Balakowicz --- lib_i386/i386_linux.c | 81 +++++++++++++++++++++------------------------------ 1 file changed, 33 insertions(+), 48 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/i386_linux.c b/lib_i386/i386_linux.c index b0cf2630ca..27a2b0d9ab 100644 --- a/lib_i386/i386_linux.c +++ b/lib_i386/i386_linux.c @@ -31,54 +31,50 @@ /*cmd_boot.c*/ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); -extern image_header_t header; /* from cmd_bootm.c */ - void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - ulong addr, ulong *len_ptr, int verify) + image_header_t *hdr, int verify) { void *base_ptr; - ulong len = 0; + ulong os_data, os_len; + ulong rd_data, rd_len; ulong initrd_start, initrd_end; - ulong data; - image_header_t *hdr = &header; + image_header_t *rd_hdr; /* * Check if there is an initrd image */ if (argc >= 3) { - addr = simple_strtoul(argv[2], NULL, 16); - hdr = (image_header_t *)addr; - - printf ("## Loading Ramdisk Image at %08lx ...\n", addr); + rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16); + printf ("## Loading Ramdisk Image at %08lx ...\n", rd_hdr); - if (!image_check_magic (hdr)) { + if (!image_check_magic (rd_hdr)) { printf ("Bad Magic Number\n"); do_reset (cmdtp, flag, argc, argv); } - if (!image_check_hcrc (hdr)) { + if (!image_check_hcrc (rd_hdr)) { printf ("Bad Header Checksum\n"); do_reset (cmdtp, flag, argc, argv); } - print_image_hdr (hdr); + print_image_hdr (rd_hdr); - data = image_get_data (hdr); - len = image_get_data_size (hdr); + rd_data = image_get_data (rd_hdr); + rd_len = image_get_data_size (rd_hdr); if (verify) { printf (" Verifying Checksum ... "); - if (!image_check_dcrc (hdr)) { + if (!image_check_dcrc (rd_hdr)) { printf ("Bad Data CRC\n"); do_reset (cmdtp, flag, argc, argv); } printf ("OK\n"); } - if (!image_check_os (hdr, IH_OS_LINUX) || - !image_check_arch (hdr, IH_ARCH_I386) || - !image_check_type (hdr, IH_TYPE_RAMDISK)) { + if (!image_check_os (rd_hdr, IH_OS_LINUX) || + !image_check_arch (rd_hdr, IH_ARCH_I386) || + !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) { printf ("No Linux i386 Ramdisk Image\n"); do_reset (cmdtp, flag, argc, argv); } @@ -86,42 +82,30 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], /* * Now check if we have a multifile image */ - } else if (image_check_type (hdr, IH_TYPE_MULTI) && (len_ptr[1])) { - ulong tail = image_to_cpu (len_ptr[0]) % 4; - int i; - - /* skip kernel length and terminator */ - data = (ulong)(&len_ptr[2]); - /* skip any additional image length fields */ - for (i=1; len_ptr[i]; ++i) - data += 4; - /* add kernel length, and align */ - data += image_to_cpu (len_ptr[0]); - if (tail) { - data += 4 - tail; - } - - len = image_to_cpu (len_ptr[1]); - + } else if (image_check_type (hdr, IH_TYPE_MULTI)) { + /* + * Get second entry data start address and len + */ + image_multi_getimg (hdr, 1, &rd_data, &rd_len); } else { /* * no initrd image */ - data = 0; + rd_data = rd_len = 0; } #ifdef DEBUG - if (!data) { + if (!rd_data) { printf ("No initrd\n"); } #endif - if (data) { - initrd_start = data; - initrd_end = initrd_start + len; + if (rd_data) { + initrd_start = rd_data; + initrd_end = initrd_start + rd_len; printf (" Loading Ramdisk to %08lx, end %08lx ... ", initrd_start, initrd_end); - memmove ((void *)initrd_start, (void *)data, len); + memmove ((void *)initrd_start, (void *)rd_data, rd_len); printf ("OK\n"); } else { initrd_start = 0; @@ -129,14 +113,15 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], } /* if multi-part image, we need to advance base ptr */ - if (image_check_type (&header, IH_TYPE_MULTI) && (len_ptr[1])) { - int i; - for (i=0, addr+=sizeof(int); len_ptr[i++]; addr+=sizeof(int)); + if (image_check_type (hdr, IH_TYPE_MULTI)) { + image_multi_getimg (hdr, 0, &os_data, &os_len); + } else { + os_data = image_get_data (hdr); + os_len = image_get_data_size (hdr); } - base_ptr = load_zimage ((void*)addr + image_get_header_size (), - image_get_data_size (&header), - initrd_start, initrd_end-initrd_start, 0); + base_ptr = load_zimage ((void*)os_data, os_len, + initrd_start, rd_len, 0); if (NULL == base_ptr) { printf ("## Kernel loading failed ...\n"); -- cgit From 4a995edec1ac163d9326d143ffe2b47e7543407f Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Thu, 31 Jan 2008 13:20:06 +0100 Subject: [new uImage] Rename architecture specific bootm code files Implementation of the do_bootm_linux() and other bootm helper routines is architecture specific code. As such it resides in lib_ directories in files named _linux.c This patch renames those files to a more clear and accurate lib_/bootm.c form. List of the renamed files: lib_arm/armlinux.c -> lib_arm/bootm.c lib_avr32/avr32_linux.c -> lib_avr32/bootm.c lib_blackfin/bf533_linux.c -> lib_blackfin/bootm.c lib_i386/i386_linux.c -> lib_i386/bootm.c lib_m68k/m68k_linux.c -> lib_m68k/bootm.c lib_microblaze/microblaze_linux.c -> lib_microblaze/bootm.c lib_mips/mips_linux.c -> lib_mips/bootm.c lib_nios/nios_linux.c -> lib_nios/bootm.c lib_nios2/nios_linux.c -> lib_nios2/bootm.c lib_ppc/ppc_linux.c -> lib_ppc/bootm.c lib_sh/sh_linux.c -> lib_sh/bootm.c Signed-off-by: Marian Balakowicz --- lib_i386/Makefile | 2 +- lib_i386/bootm.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib_i386/i386_linux.c | 142 -------------------------------------------------- 3 files changed, 143 insertions(+), 143 deletions(-) create mode 100644 lib_i386/bootm.c delete mode 100644 lib_i386/i386_linux.c (limited to 'lib_i386') diff --git a/lib_i386/Makefile b/lib_i386/Makefile index e344da5157..ef0ba54673 100644 --- a/lib_i386/Makefile +++ b/lib_i386/Makefile @@ -27,7 +27,7 @@ LIB = $(obj)lib$(ARCH).a SOBJS = bios.o bios_pci.o realmode_switch.o -COBJS = board.o bios_setup.o i386_linux.o zimage.o realmode.o \ +COBJS = board.o bios_setup.o bootm.o zimage.o realmode.o \ pci_type1.o pci.o video_bios.o video.o SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c new file mode 100644 index 0000000000..27a2b0d9ab --- /dev/null +++ b/lib_i386/bootm.c @@ -0,0 +1,142 @@ +/* + * (C) Copyright 2002 + * Sysgo Real-Time Solutions, GmbH + * Marius Groeger + * + * Copyright (C) 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) + * + * 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 +#include +#include + +/*cmd_boot.c*/ +extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); + +void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], + image_header_t *hdr, int verify) +{ + void *base_ptr; + + ulong os_data, os_len; + ulong rd_data, rd_len; + ulong initrd_start, initrd_end; + image_header_t *rd_hdr; + + /* + * Check if there is an initrd image + */ + if (argc >= 3) { + rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16); + printf ("## Loading Ramdisk Image at %08lx ...\n", rd_hdr); + + if (!image_check_magic (rd_hdr)) { + printf ("Bad Magic Number\n"); + do_reset (cmdtp, flag, argc, argv); + } + + if (!image_check_hcrc (rd_hdr)) { + printf ("Bad Header Checksum\n"); + do_reset (cmdtp, flag, argc, argv); + } + + print_image_hdr (rd_hdr); + + rd_data = image_get_data (rd_hdr); + rd_len = image_get_data_size (rd_hdr); + + if (verify) { + printf (" Verifying Checksum ... "); + if (!image_check_dcrc (rd_hdr)) { + printf ("Bad Data CRC\n"); + do_reset (cmdtp, flag, argc, argv); + } + printf ("OK\n"); + } + + if (!image_check_os (rd_hdr, IH_OS_LINUX) || + !image_check_arch (rd_hdr, IH_ARCH_I386) || + !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) { + printf ("No Linux i386 Ramdisk Image\n"); + do_reset (cmdtp, flag, argc, argv); + } + + /* + * Now check if we have a multifile image + */ + } else if (image_check_type (hdr, IH_TYPE_MULTI)) { + /* + * Get second entry data start address and len + */ + image_multi_getimg (hdr, 1, &rd_data, &rd_len); + } else { + /* + * no initrd image + */ + rd_data = rd_len = 0; + } + +#ifdef DEBUG + if (!rd_data) { + printf ("No initrd\n"); + } +#endif + + if (rd_data) { + initrd_start = rd_data; + initrd_end = initrd_start + rd_len; + printf (" Loading Ramdisk to %08lx, end %08lx ... ", + initrd_start, initrd_end); + memmove ((void *)initrd_start, (void *)rd_data, rd_len); + printf ("OK\n"); + } else { + initrd_start = 0; + initrd_end = 0; + } + + /* if multi-part image, we need to advance base ptr */ + if (image_check_type (hdr, IH_TYPE_MULTI)) { + image_multi_getimg (hdr, 0, &os_data, &os_len); + } else { + os_data = image_get_data (hdr); + os_len = image_get_data_size (hdr); + } + + base_ptr = load_zimage ((void*)os_data, os_len, + initrd_start, rd_len, 0); + + if (NULL == base_ptr) { + printf ("## Kernel loading failed ...\n"); + do_reset(cmdtp, flag, argc, argv); + + } + +#ifdef DEBUG + printf ("## Transferring control to Linux (at address %08x) ...\n", + (u32)base_ptr); +#endif + + /* we assume that the kernel is in place */ + printf("\nStarting kernel ...\n\n"); + + boot_zimage(base_ptr); + +} diff --git a/lib_i386/i386_linux.c b/lib_i386/i386_linux.c deleted file mode 100644 index 27a2b0d9ab..0000000000 --- a/lib_i386/i386_linux.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * (C) Copyright 2002 - * Sysgo Real-Time Solutions, GmbH - * Marius Groeger - * - * Copyright (C) 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) - * - * 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 -#include -#include - -/*cmd_boot.c*/ -extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); - -void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) -{ - void *base_ptr; - - ulong os_data, os_len; - ulong rd_data, rd_len; - ulong initrd_start, initrd_end; - image_header_t *rd_hdr; - - /* - * Check if there is an initrd image - */ - if (argc >= 3) { - rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16); - printf ("## Loading Ramdisk Image at %08lx ...\n", rd_hdr); - - if (!image_check_magic (rd_hdr)) { - printf ("Bad Magic Number\n"); - do_reset (cmdtp, flag, argc, argv); - } - - if (!image_check_hcrc (rd_hdr)) { - printf ("Bad Header Checksum\n"); - do_reset (cmdtp, flag, argc, argv); - } - - print_image_hdr (rd_hdr); - - rd_data = image_get_data (rd_hdr); - rd_len = image_get_data_size (rd_hdr); - - if (verify) { - printf (" Verifying Checksum ... "); - if (!image_check_dcrc (rd_hdr)) { - printf ("Bad Data CRC\n"); - do_reset (cmdtp, flag, argc, argv); - } - printf ("OK\n"); - } - - if (!image_check_os (rd_hdr, IH_OS_LINUX) || - !image_check_arch (rd_hdr, IH_ARCH_I386) || - !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) { - printf ("No Linux i386 Ramdisk Image\n"); - do_reset (cmdtp, flag, argc, argv); - } - - /* - * Now check if we have a multifile image - */ - } else if (image_check_type (hdr, IH_TYPE_MULTI)) { - /* - * Get second entry data start address and len - */ - image_multi_getimg (hdr, 1, &rd_data, &rd_len); - } else { - /* - * no initrd image - */ - rd_data = rd_len = 0; - } - -#ifdef DEBUG - if (!rd_data) { - printf ("No initrd\n"); - } -#endif - - if (rd_data) { - initrd_start = rd_data; - initrd_end = initrd_start + rd_len; - printf (" Loading Ramdisk to %08lx, end %08lx ... ", - initrd_start, initrd_end); - memmove ((void *)initrd_start, (void *)rd_data, rd_len); - printf ("OK\n"); - } else { - initrd_start = 0; - initrd_end = 0; - } - - /* if multi-part image, we need to advance base ptr */ - if (image_check_type (hdr, IH_TYPE_MULTI)) { - image_multi_getimg (hdr, 0, &os_data, &os_len); - } else { - os_data = image_get_data (hdr); - os_len = image_get_data_size (hdr); - } - - base_ptr = load_zimage ((void*)os_data, os_len, - initrd_start, rd_len, 0); - - if (NULL == base_ptr) { - printf ("## Kernel loading failed ...\n"); - do_reset(cmdtp, flag, argc, argv); - - } - -#ifdef DEBUG - printf ("## Transferring control to Linux (at address %08x) ...\n", - (u32)base_ptr); -#endif - - /* we assume that the kernel is in place */ - printf("\nStarting kernel ...\n\n"); - - boot_zimage(base_ptr); - -} -- cgit From 5ad03eb3854c162684222a718b44c0716ea0db03 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Thu, 31 Jan 2008 13:55:39 +0100 Subject: [new uImage] Factor out common image_get_ramdisk() routine Architecture specific do_bootm_linux() routines share common ramdisk image processing code. Move this code to a common helper routine. Signed-off-by: Marian Balakowicz --- lib_i386/bootm.c | 76 +++----------------------------------------------------- 1 file changed, 3 insertions(+), 73 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index 27a2b0d9ab..ab6c2a9676 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -37,80 +37,10 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], void *base_ptr; ulong os_data, os_len; - ulong rd_data, rd_len; ulong initrd_start, initrd_end; - image_header_t *rd_hdr; - /* - * Check if there is an initrd image - */ - if (argc >= 3) { - rd_hdr = (image_header_t *)simple_strtoul (argv[2], NULL, 16); - printf ("## Loading Ramdisk Image at %08lx ...\n", rd_hdr); - - if (!image_check_magic (rd_hdr)) { - printf ("Bad Magic Number\n"); - do_reset (cmdtp, flag, argc, argv); - } - - if (!image_check_hcrc (rd_hdr)) { - printf ("Bad Header Checksum\n"); - do_reset (cmdtp, flag, argc, argv); - } - - print_image_hdr (rd_hdr); - - rd_data = image_get_data (rd_hdr); - rd_len = image_get_data_size (rd_hdr); - - if (verify) { - printf (" Verifying Checksum ... "); - if (!image_check_dcrc (rd_hdr)) { - printf ("Bad Data CRC\n"); - do_reset (cmdtp, flag, argc, argv); - } - printf ("OK\n"); - } - - if (!image_check_os (rd_hdr, IH_OS_LINUX) || - !image_check_arch (rd_hdr, IH_ARCH_I386) || - !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) { - printf ("No Linux i386 Ramdisk Image\n"); - do_reset (cmdtp, flag, argc, argv); - } - - /* - * Now check if we have a multifile image - */ - } else if (image_check_type (hdr, IH_TYPE_MULTI)) { - /* - * Get second entry data start address and len - */ - image_multi_getimg (hdr, 1, &rd_data, &rd_len); - } else { - /* - * no initrd image - */ - rd_data = rd_len = 0; - } - -#ifdef DEBUG - if (!rd_data) { - printf ("No initrd\n"); - } -#endif - - if (rd_data) { - initrd_start = rd_data; - initrd_end = initrd_start + rd_len; - printf (" Loading Ramdisk to %08lx, end %08lx ... ", - initrd_start, initrd_end); - memmove ((void *)initrd_start, (void *)rd_data, rd_len); - printf ("OK\n"); - } else { - initrd_start = 0; - initrd_end = 0; - } + get_ramdisk (cmdtp, flag, argc, argv, hdr, verify, + IH_ARCH_I386, &initrd_start, &initrd_end); /* if multi-part image, we need to advance base ptr */ if (image_check_type (hdr, IH_TYPE_MULTI)) { @@ -121,7 +51,7 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], } base_ptr = load_zimage ((void*)os_data, os_len, - initrd_start, rd_len, 0); + initrd_start, initrd_end - initrd_start, 0); if (NULL == base_ptr) { printf ("## Kernel loading failed ...\n"); -- cgit From d5934ad7756f038a393a9cfab76a4fe306d9d930 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Mon, 4 Feb 2008 08:28:09 +0100 Subject: [new uImage] Add dual format uImage support framework This patch adds framework for dual format images. Format detection is added and the bootm controll flow is updated to include cases for new FIT format uImages. When the legacy (image_header based) format is detected appropriate legacy specific handling is invoked. For the new (FIT based) format uImages dual boot framework has a minial support, that will only print out a corresponding debug messages. Implementation of the FIT specific handling will be added in following patches. Signed-off-by: Marian Balakowicz --- lib_i386/bootm.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index ab6c2a9676..3a6497c77a 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -32,22 +32,35 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - image_header_t *hdr, int verify) + bootm_headers_t *images, int verify) { - void *base_ptr; + void *base_ptr; + ulong os_data, os_len; + ulong initrd_start, initrd_end; + ulong ep; + image_header_t *hdr; - ulong os_data, os_len; - ulong initrd_start, initrd_end; - - get_ramdisk (cmdtp, flag, argc, argv, hdr, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, verify, IH_ARCH_I386, &initrd_start, &initrd_end); - /* if multi-part image, we need to advance base ptr */ - if (image_check_type (hdr, IH_TYPE_MULTI)) { - image_multi_getimg (hdr, 0, &os_data, &os_len); + if (images->legacy_hdr_valid) { + hdr = images->legacy_hdr_os; + if (image_check_type (hdr, IH_TYPE_MULTI)) { + /* if multi-part image, we need to get first subimage */ + image_multi_getimg (hdr, 0, &os_data, &os_len); + } else { + /* otherwise get image data */ + os_data = image_get_data (hdr); + os_len = image_get_data_size (hdr); + } +#if defined(CONFIG_FIT) + } else if (images->fit_uname_os) { + fit_unsupported_reset ("I386 linux bootm"); + do_reset (cmdtp, flag, argc, argv); +#endif } else { - os_data = image_get_data (hdr); - os_len = image_get_data_size (hdr); + puts ("Could not find kernel image!\n"); + do_reset (cmdtp, flag, argc, argv); } base_ptr = load_zimage ((void*)os_data, os_len, -- cgit From 823afe7cefe00dafefc6696c1cc7aa828c394234 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Wed, 27 Feb 2008 11:00:47 +0100 Subject: [Makefile] Sort COBJS in lib_ Makefiles Signed-off-by: Marian Balakowicz --- lib_i386/Makefile | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/Makefile b/lib_i386/Makefile index ef0ba54673..4cc29f432a 100644 --- a/lib_i386/Makefile +++ b/lib_i386/Makefile @@ -25,13 +25,22 @@ include $(TOPDIR)/config.mk LIB = $(obj)lib$(ARCH).a -SOBJS = bios.o bios_pci.o realmode_switch.o - -COBJS = board.o bios_setup.o bootm.o zimage.o realmode.o \ - pci_type1.o pci.o video_bios.o video.o - -SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) -OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) +SOBJS-y += bios.o +SOBJS-y += bios_pci.o +SOBJS-y += realmode_switch.o + +COBJS-y += bios_setup.o +COBJS-y += board.o +COBJS-y += bootm.o +COBJS-y += pci.o +COBJS-y += pci_type1.o +COBJS-y += realmode.o +COBJS-y += video_bios.o +COBJS-y += video.o +COBJS-y += zimage.o + +SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) +OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) $(LIB): $(obj).depend $(OBJS) $(AR) $(ARFLAGS) $@ $(OBJS) -- cgit From 8a5ea3e6168fe6a2780eeaf257a3b19f30dec658 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Wed, 27 Feb 2008 11:01:04 +0100 Subject: [new uImage] Move image verify flag to bootm_headers structure Do not pass image verification flag directly to related routines. Simplify argument passing and move it to the bootm_header structure which contains curently processed image specific data and is already being passed on the argument list. Signed-off-by: Marian Balakowicz Acked-by: Kumar Gala --- lib_i386/bootm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index 3a6497c77a..aea58d178b 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -32,7 +32,7 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], - bootm_headers_t *images, int verify) + bootm_headers_t *images) { void *base_ptr; ulong os_data, os_len; @@ -40,7 +40,7 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong ep; image_header_t *hdr; - get_ramdisk (cmdtp, flag, argc, argv, images, verify, + get_ramdisk (cmdtp, flag, argc, argv, images, IH_ARCH_I386, &initrd_start, &initrd_end); if (images->legacy_hdr_valid) { -- cgit From 75fa002c47171b73fb4c1f2c2fe4d6391c136276 Mon Sep 17 00:00:00 2001 From: Kumar Gala Date: Wed, 27 Feb 2008 21:51:51 -0600 Subject: [new uImage] Respect autostart setting in linux bootm Signed-off-by: Kumar Gala Acked-by: Marian Balakowicz --- lib_i386/bootm.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib_i386') diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index aea58d178b..89a423c243 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -72,6 +72,9 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], } + if (!images->autostart) + return ; + #ifdef DEBUG printf ("## Transferring control to Linux (at address %08x) ...\n", (u32)base_ptr); -- cgit From 9a4daad0a35eb5143037eea9f786a3e9d672bdd6 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Fri, 29 Feb 2008 14:58:34 +0100 Subject: [new uImage] Update naming convention for bootm/uImage related code This patch introduces the following prefix convention for the image format handling and bootm related code: genimg_ - dual format shared code image_ - legacy uImage format specific code fit_ - new uImage format specific code boot_ - booting process related code Related routines are renamed and a few pieces of code are moved around and re-grouped. Signed-off-by: Marian Balakowicz --- lib_i386/bootm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib_i386') diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index 89a423c243..76bcf6cd85 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -40,7 +40,7 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong ep; image_header_t *hdr; - get_ramdisk (cmdtp, flag, argc, argv, images, + boot_get_ramdisk (cmdtp, flag, argc, argv, images, IH_ARCH_I386, &initrd_start, &initrd_end); if (images->legacy_hdr_valid) { -- cgit From d985c8498c4e47095820da97aa722381d39172c5 Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Wed, 12 Mar 2008 10:14:38 +0100 Subject: [new uImage] Remove unnecessary arguments passed to ramdisk routines boot_get_ramdisk() and image_get_ramdisk() do not need all cmdtp, flag, argc and argv arguments. Simplify routines definition. Signed-off-by: Marian Balakowicz --- lib_i386/bootm.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index 76bcf6cd85..b4a52fa21d 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -39,9 +39,12 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong initrd_start, initrd_end; ulong ep; image_header_t *hdr; + int ret; - boot_get_ramdisk (cmdtp, flag, argc, argv, images, - IH_ARCH_I386, &initrd_start, &initrd_end); + ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_I386, + &initrd_start, &initrd_end); + if (ret) + do_reset (cmdtp, flag, argc, argv); if (images->legacy_hdr_valid) { hdr = images->legacy_hdr_os; -- cgit From cd7c596e9f561dbbc17b717277438aee78cde14f Mon Sep 17 00:00:00 2001 From: Marian Balakowicz Date: Wed, 12 Mar 2008 10:33:00 +0100 Subject: [new uImage] Add new uImage format support to arch specific do_bootm_linux() routines This patch updates architecture specific implementations of do_bootm_linux() adding new uImage format handling for operations like get kernel entry point address, get kernel image data start address. Signed-off-by: Marian Balakowicz --- lib_i386/bootm.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'lib_i386') diff --git a/lib_i386/bootm.c b/lib_i386/bootm.c index b4a52fa21d..107ebaaa67 100644 --- a/lib_i386/bootm.c +++ b/lib_i386/bootm.c @@ -40,11 +40,15 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong ep; image_header_t *hdr; int ret; +#if defined(CONFIG_FIT) + const void *data; + size_t len; +#endif ret = boot_get_ramdisk (argc, argv, images, IH_ARCH_I386, &initrd_start, &initrd_end); if (ret) - do_reset (cmdtp, flag, argc, argv); + goto error; if (images->legacy_hdr_valid) { hdr = images->legacy_hdr_os; @@ -58,12 +62,18 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], } #if defined(CONFIG_FIT) } else if (images->fit_uname_os) { - fit_unsupported_reset ("I386 linux bootm"); - do_reset (cmdtp, flag, argc, argv); + ret = fit_image_get_data (images->fit_hdr_os, + images->fit_noffset_os, &data, &len); + if (ret) { + puts ("Can't get image data/size!\n"); + goto error; + } + os_data = (ulong)data; + os_len = (ulong)len; #endif } else { puts ("Could not find kernel image!\n"); - do_reset (cmdtp, flag, argc, argv); + goto error; } base_ptr = load_zimage ((void*)os_data, os_len, @@ -71,7 +81,7 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], if (NULL == base_ptr) { printf ("## Kernel loading failed ...\n"); - do_reset(cmdtp, flag, argc, argv); + goto error; } @@ -87,5 +97,11 @@ void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], printf("\nStarting kernel ...\n\n"); boot_zimage(base_ptr); + /* does not return */ + return; +error: + if (images->autostart) + do_reset (cmdtp, flag, argc, argv); + return; } -- cgit