diff options
| -rw-r--r-- | common/cmd_bootm.c | 14 | ||||
| -rw-r--r-- | common/image.c | 1 | ||||
| -rw-r--r-- | include/image.h | 1 | ||||
| -rw-r--r-- | tools/default_image.c | 3 | 
4 files changed, 16 insertions, 3 deletions
| diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index b073f095b..d5745b14e 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -272,7 +272,13 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]  		return 1;  	} +	if (images.os.type == IH_TYPE_KERNEL_NOLOAD) { +		images.os.load = images.os.image_start; +		images.ep += images.os.load; +	} +  	if (((images.os.type == IH_TYPE_KERNEL) || +	     (images.os.type == IH_TYPE_KERNEL_NOLOAD) ||  	     (images.os.type == IH_TYPE_MULTI)) &&  	    (images.os.os == IH_OS_LINUX)) {  		/* find ramdisk */ @@ -314,6 +320,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)  	ulong image_start = os.image_start;  	ulong image_len = os.image_len;  	__maybe_unused uint unc_len = CONFIG_SYS_BOOTM_LEN; +	int no_overlap = 0;  #if defined(CONFIG_LZMA) || defined(CONFIG_LZO)  	int ret;  #endif /* defined(CONFIG_LZMA) || defined(CONFIG_LZO) */ @@ -324,6 +331,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)  	case IH_COMP_NONE:  		if (load == blob_start || load == image_start) {  			printf("   XIP %s ... ", type_name); +			no_overlap = 1;  		} else {  			printf("   Loading %s ... ", type_name);  			memmove_wd((void *)load, (void *)image_start, @@ -418,7 +426,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)  	if (boot_progress)  		show_boot_progress(7); -	if ((load < blob_end) && (*load_end > blob_start)) { +	if (!no_overlap && (load < blob_end) && (*load_end > blob_start)) {  		debug("images.os.start = 0x%lX, images.os.end = 0x%lx\n",  			blob_start, blob_end);  		debug("images.os.load = 0x%lx, load_end = 0x%lx\n", load, @@ -796,7 +804,8 @@ static int fit_check_kernel(const void *fit, int os_noffset, int verify)  	}  	show_boot_progress(106); -	if (!fit_image_check_type(fit, os_noffset, IH_TYPE_KERNEL)) { +	if (!fit_image_check_type(fit, os_noffset, IH_TYPE_KERNEL) && +	    !fit_image_check_type(fit, os_noffset, IH_TYPE_KERNEL_NOLOAD)) {  		puts("Not a kernel image\n");  		show_boot_progress(-106);  		return 0; @@ -874,6 +883,7 @@ static void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,  		/* get os_data and os_len */  		switch (image_get_type(hdr)) {  		case IH_TYPE_KERNEL: +		case IH_TYPE_KERNEL_NOLOAD:  			*os_data = image_get_data(hdr);  			*os_len = image_get_data_size(hdr);  			break; diff --git a/common/image.c b/common/image.c index 555d9d9d4..aacae5ac5 100644 --- a/common/image.c +++ b/common/image.c @@ -136,6 +136,7 @@ static const table_entry_t uimage_type[] = {  	{	IH_TYPE_FIRMWARE,   "firmware",	  "Firmware",		},  	{	IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",	},  	{	IH_TYPE_KERNEL,	    "kernel",	  "Kernel Image",	}, +	{	IH_TYPE_KERNEL_NOLOAD, "kernel_noload",  "Kernel Image (no loading done)", },  	{	IH_TYPE_KWBIMAGE,   "kwbimage",   "Kirkwood Boot Image",},  	{	IH_TYPE_IMXIMAGE,   "imximage",   "Freescale i.MX Boot Image",},  	{	IH_TYPE_INVALID,    NULL,	  "Invalid Image",	}, diff --git a/include/image.h b/include/image.h index 6a41c2e34..466c98018 100644 --- a/include/image.h +++ b/include/image.h @@ -162,6 +162,7 @@  #define IH_TYPE_UBLIMAGE	11	/* Davinci UBL Image		*/  #define IH_TYPE_OMAPIMAGE	12	/* TI OMAP Config Header Image	*/  #define IH_TYPE_AISIMAGE	13	/* TI Davinci AIS Image		*/ +#define IH_TYPE_KERNEL_NOLOAD	14	/* OS Kernel Image, can run from any load address */  /*   * Compression Types diff --git a/tools/default_image.c b/tools/default_image.c index 6ea3b462c..e9d072975 100644 --- a/tools/default_image.c +++ b/tools/default_image.c @@ -35,7 +35,8 @@ static image_header_t header;  static int image_check_image_types(uint8_t type)  { -	if ((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT)) +	if (((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT)) || +	    (type == IH_TYPE_KERNEL_NOLOAD))  		return EXIT_SUCCESS;  	else  		return EXIT_FAILURE; |