mirror of
https://github.com/ipxe/ipxe
synced 2025-12-17 18:11:49 +03:00
[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:
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user