[image] Provide image_memory()

Consolidate the remaining logic common to initrd_init() and imgmem()
into a shared image_memory() function.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2021-01-25 16:18:28 +00:00
parent ffc41ae9d1
commit 989a7a8032
6 changed files with 62 additions and 76 deletions

View File

@@ -179,7 +179,6 @@ static int cmdline_init ( void ) {
*/ */
static int initrd_init ( void ) { static int initrd_init ( void ) {
struct image *image; struct image *image;
int rc;
/* Do nothing if no initrd was specified */ /* Do nothing if no initrd was specified */
if ( ! initrd_phys ) { if ( ! initrd_phys ) {
@@ -193,51 +192,18 @@ static int initrd_init ( void ) {
DBGC ( colour, "RUNTIME found initrd at [%x,%x)\n", DBGC ( colour, "RUNTIME found initrd at [%x,%x)\n",
initrd_phys, ( initrd_phys + initrd_len ) ); initrd_phys, ( initrd_phys + initrd_len ) );
/* Allocate image */ /* Create initrd image */
image = alloc_image ( NULL ); image = image_memory ( "<INITRD>", phys_to_user ( initrd_phys ),
initrd_len );
if ( ! image ) { if ( ! image ) {
DBGC ( colour, "RUNTIME could not allocate image for " DBGC ( colour, "RUNTIME could not create initrd image\n" );
"initrd\n" ); return -ENOMEM;
rc = -ENOMEM;
goto err_alloc_image;
}
/* Set image name */
if ( ( rc = image_set_name ( image, "<INITRD>" ) ) != 0 ) {
DBGC ( colour, "RUNTIME could not set image name: %s\n",
strerror ( rc ) );
goto err_set_name;
}
/* Set image content */
if ( ( rc = image_set_data ( image, phys_to_user ( initrd_phys ),
initrd_len ) ) != 0 ) {
DBGC ( colour, "RUNTIME could not set image data: %s\n",
strerror ( rc ) );
goto err_set_data;
} }
/* Mark initrd as consumed */ /* Mark initrd as consumed */
initrd_phys = 0; initrd_phys = 0;
/* Register image */
if ( ( rc = register_image ( image ) ) != 0 ) {
DBGC ( colour, "RUNTIME could not register initrd: %s\n",
strerror ( rc ) );
goto err_register_image;
}
/* Drop our reference to the image */
image_put ( image );
return 0; return 0;
err_register_image:
err_set_data:
err_set_name:
image_put ( image );
err_alloc_image:
return rc;
} }
/** /**

View File

@@ -505,3 +505,47 @@ int image_set_trust ( int require_trusted, int permanent ) {
return 0; return 0;
} }
/**
* Create registered image from block of memory
*
* @v name Name
* @v data Image data
* @v len Length
* @ret image Image, or NULL on error
*/
struct image * image_memory ( const char *name, userptr_t data, size_t len ) {
struct image *image;
int rc;
/* Allocate image */
image = alloc_image ( NULL );
if ( ! image ) {
rc = -ENOMEM;
goto err_alloc_image;
}
/* Set name */
if ( ( rc = image_set_name ( image, name ) ) != 0 )
goto err_set_name;
/* Set data */
if ( ( rc = image_set_data ( image, data, len ) ) != 0 )
goto err_set_data;
/* Register image */
if ( ( rc = register_image ( image ) ) != 0 )
goto err_register;
/* Drop local reference to image */
image_put ( image );
return image;
err_register:
err_set_data:
err_set_name:
image_put ( image );
err_alloc_image:
return NULL;
}

View File

@@ -60,7 +60,6 @@ static struct command_descriptor imgmem_cmd =
*/ */
static int imgmem_exec ( int argc, char **argv ) { static int imgmem_exec ( int argc, char **argv ) {
struct imgmem_options opts; struct imgmem_options opts;
struct image *image;
unsigned int data; unsigned int data;
unsigned int len; unsigned int len;
int rc; int rc;
@@ -82,8 +81,7 @@ static int imgmem_exec ( int argc, char **argv ) {
return rc; return rc;
/* Create image */ /* Create image */
if ( ( rc = imgmem ( phys_to_user ( data ), len, opts.name, if ( ( rc = imgmem ( opts.name, phys_to_user ( data ), len ) ) != 0 )
&image ) ) != 0 )
return rc; return rc;
return 0; return 0;

View File

@@ -184,6 +184,8 @@ extern int image_replace ( struct image *replacement );
extern int image_select ( struct image *image ); extern int image_select ( struct image *image );
extern struct image * image_find_selected ( void ); extern struct image * image_find_selected ( void );
extern int image_set_trust ( int require_trusted, int permanent ); extern int image_set_trust ( int require_trusted, int permanent );
extern struct image * image_memory ( const char *name, userptr_t data,
size_t len );
extern int image_pixbuf ( struct image *image, struct pixel_buffer **pixbuf ); extern int image_pixbuf ( struct image *image, struct pixel_buffer **pixbuf );
extern int image_asn1 ( struct image *image, size_t offset, extern int image_asn1 ( struct image *image, size_t offset,
struct asn1_cursor **cursor ); struct asn1_cursor **cursor );

View File

@@ -18,7 +18,6 @@ extern int imgdownload_string ( const char *uri_string, unsigned long timeout,
extern int imgacquire ( const char *name, unsigned long timeout, extern int imgacquire ( const char *name, unsigned long timeout,
struct image **image ); struct image **image );
extern void imgstat ( struct image *image ); extern void imgstat ( struct image *image );
extern int imgmem ( userptr_t data, size_t len, const char *name, extern int imgmem ( const char *name, userptr_t data, size_t len );
struct image **image );
#endif /* _USR_IMGMGMT_H */ #endif /* _USR_IMGMGMT_H */

View File

@@ -173,43 +173,20 @@ void imgstat ( struct image *image ) {
/** /**
* Create image from block of memory * Create image from block of memory
* *
* @v name Name
* @v data Image data * @v data Image data
* @v len Length * @v len Length
* @v name Name
* @v image Image to fill in
* @ret rc Return status code * @ret rc Return status code
*/ */
int imgmem ( userptr_t data, size_t len, const char *name, int imgmem ( const char *name, userptr_t data, size_t len ) {
struct image **image ) { struct image *image;
int rc;
/* Allocate image */ /* Create image */
*image = alloc_image ( NULL ); image = image_memory ( name, data, len );
if ( ! *image ) { if ( ! image ) {
rc = -ENOMEM; printf ( "Could not create image\n" );
goto err_alloc_image; return -ENOMEM;
} }
/* Set name */ return 0;
if ( ( rc = image_set_name ( *image, name ) ) != 0 )
goto err_set_name;
/* Set data */
if ( ( rc = image_set_data ( *image, data, len ) ) != 0 ) {
printf ( "Could not set image data: %s\n", strerror ( rc ) );
goto err_set_data;
}
/* Register image */
if ( ( rc = register_image ( *image ) ) != 0 ) {
printf ( "Could not register image: %s\n", strerror ( rc ) );
goto err_register_image;
}
err_register_image:
err_set_data:
err_set_name:
image_put ( *image );
err_alloc_image:
return rc;
} }