summaryrefslogblamecommitdiffstats
path: root/src/core/image.c
blob: 31ea95577a23231af2aa423a018c985dbf12351f (plain) (tree)
















































                                                                     
#include "buffer.h"
#include "image.h"

static struct image images_start[0] __image_start;
static struct image images_end[0] __image_end;

/*
 * Identify the image format
 *
 */
static struct image * identify_image ( struct buffer *buffer ) {
	struct image_header header;
	int header_len = sizeof ( header );
	off_t len;
	struct image *image;
	
	/* Copy first (up to) 512 bytes of image to easily-accessible
	 * buffer.
	 */
	len = buffer->fill;
	copy_from_phys ( &header, buffer->start,
			 len < header_len ? len : header_len );
	
	for ( image = images_start ; image < images_end ; image++ ) {
		if ( image->probe ( &header, len ) )
			return image;
	}
	
	return NULL;
}

/*
 * Boot a loaded image
 *
 */
int boot_image ( struct buffer *buffer ) {
	struct image *image;

	image = identify_image ( buffer );
	if ( ! image ) {
		DBG ( "IMAGE could not identify image format\n" );
		return 0;
	}

	DBG ( "IMAGE found %s image (length %d)\n",
	      image->name, buffer->fill );

	return image->boot ( buffer->start, buffer->fill );
}