aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2021-01-25 16:18:28 +0000
committerMichael Brown <mcb30@ipxe.org>2021-01-25 17:03:56 +0000
commit989a7a8032db02eb0524bd78a674d3b087dea3a6 (patch)
tree3ead7f99b466e3274d29dbeb0df7374905ff92d5
parentffc41ae9d12f319be67053e529091c8710303d3c (diff)
downloadipxe-989a7a8032db02eb0524bd78a674d3b087dea3a6.zip
ipxe-989a7a8032db02eb0524bd78a674d3b087dea3a6.tar.gz
ipxe-989a7a8032db02eb0524bd78a674d3b087dea3a6.tar.bz2
[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>
-rw-r--r--src/arch/x86/core/runtime.c44
-rw-r--r--src/core/image.c44
-rw-r--r--src/hci/commands/image_mem_cmd.c4
-rw-r--r--src/include/ipxe/image.h2
-rw-r--r--src/include/usr/imgmgmt.h3
-rw-r--r--src/usr/imgmgmt.c41
6 files changed, 62 insertions, 76 deletions
diff --git a/src/arch/x86/core/runtime.c b/src/arch/x86/core/runtime.c
index 4de3bfa..02072b5 100644
--- a/src/arch/x86/core/runtime.c
+++ b/src/arch/x86/core/runtime.c
@@ -179,7 +179,6 @@ static int cmdline_init ( void ) {
*/
static int initrd_init ( void ) {
struct image *image;
- int rc;
/* Do nothing if no initrd was specified */
if ( ! initrd_phys ) {
@@ -193,51 +192,18 @@ static int initrd_init ( void ) {
DBGC ( colour, "RUNTIME found initrd at [%x,%x)\n",
initrd_phys, ( initrd_phys + initrd_len ) );
- /* Allocate image */
- image = alloc_image ( NULL );
+ /* Create initrd image */
+ image = image_memory ( "<INITRD>", phys_to_user ( initrd_phys ),
+ initrd_len );
if ( ! image ) {
- DBGC ( colour, "RUNTIME could not allocate image for "
- "initrd\n" );
- 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;
+ DBGC ( colour, "RUNTIME could not create initrd image\n" );
+ return -ENOMEM;
}
/* Mark initrd as consumed */
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;
-
- err_register_image:
- err_set_data:
- err_set_name:
- image_put ( image );
- err_alloc_image:
- return rc;
}
/**
diff --git a/src/core/image.c b/src/core/image.c
index 54b9980..9fe77c5 100644
--- a/src/core/image.c
+++ b/src/core/image.c
@@ -505,3 +505,47 @@ int image_set_trust ( int require_trusted, int permanent ) {
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;
+}
diff --git a/src/hci/commands/image_mem_cmd.c b/src/hci/commands/image_mem_cmd.c
index 61d5053..c8bfab1 100644
--- a/src/hci/commands/image_mem_cmd.c
+++ b/src/hci/commands/image_mem_cmd.c
@@ -60,7 +60,6 @@ static struct command_descriptor imgmem_cmd =
*/
static int imgmem_exec ( int argc, char **argv ) {
struct imgmem_options opts;
- struct image *image;
unsigned int data;
unsigned int len;
int rc;
@@ -82,8 +81,7 @@ static int imgmem_exec ( int argc, char **argv ) {
return rc;
/* Create image */
- if ( ( rc = imgmem ( phys_to_user ( data ), len, opts.name,
- &image ) ) != 0 )
+ if ( ( rc = imgmem ( opts.name, phys_to_user ( data ), len ) ) != 0 )
return rc;
return 0;
diff --git a/src/include/ipxe/image.h b/src/include/ipxe/image.h
index 4c38776..4fd2700 100644
--- a/src/include/ipxe/image.h
+++ b/src/include/ipxe/image.h
@@ -184,6 +184,8 @@ extern int image_replace ( struct image *replacement );
extern int image_select ( struct image *image );
extern struct image * image_find_selected ( void );
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_asn1 ( struct image *image, size_t offset,
struct asn1_cursor **cursor );
diff --git a/src/include/usr/imgmgmt.h b/src/include/usr/imgmgmt.h
index c59cf1a..14fb7cb 100644
--- a/src/include/usr/imgmgmt.h
+++ b/src/include/usr/imgmgmt.h
@@ -18,7 +18,6 @@ extern int imgdownload_string ( const char *uri_string, unsigned long timeout,
extern int imgacquire ( const char *name, unsigned long timeout,
struct image **image );
extern void imgstat ( struct image *image );
-extern int imgmem ( userptr_t data, size_t len, const char *name,
- struct image **image );
+extern int imgmem ( const char *name, userptr_t data, size_t len );
#endif /* _USR_IMGMGMT_H */
diff --git a/src/usr/imgmgmt.c b/src/usr/imgmgmt.c
index bf4c745..f8d1491 100644
--- a/src/usr/imgmgmt.c
+++ b/src/usr/imgmgmt.c
@@ -173,43 +173,20 @@ void imgstat ( struct image *image ) {
/**
* Create image from block of memory
*
+ * @v name Name
* @v data Image data
* @v len Length
- * @v name Name
- * @v image Image to fill in
* @ret rc Return status code
*/
-int imgmem ( userptr_t data, size_t len, const char *name,
- 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;
+int imgmem ( const char *name, userptr_t data, size_t len ) {
+ struct image *image;
- /* 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;
+ /* Create image */
+ image = image_memory ( name, data, len );
+ if ( ! image ) {
+ printf ( "Could not create image\n" );
+ return -ENOMEM;
}
- err_register_image:
- err_set_data:
- err_set_name:
- image_put ( *image );
- err_alloc_image:
- return rc;
+ return 0;
}