diff options
author | Michael Brown <mcb30@ipxe.org> | 2021-01-20 18:03:16 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2021-01-22 18:34:47 +0000 |
commit | 99ac69b8a9a48207913e98ac6b357c029b0eef81 (patch) | |
tree | 22f88f44671cb1fc29fe5ac47b50b5fa54b34586 | |
parent | ae73fb5aa0c8a39d6dc688d856483610ebe12682 (diff) | |
download | ipxe-99ac69b8a9a48207913e98ac6b357c029b0eef81.zip ipxe-99ac69b8a9a48207913e98ac6b357c029b0eef81.tar.gz ipxe-99ac69b8a9a48207913e98ac6b357c029b0eef81.tar.bz2 |
[image] Provide image_set_data()
Extract part of the logic in initrd_init() to a standalone function
image_set_data().
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/arch/x86/core/runtime.c | 21 | ||||
-rw-r--r-- | src/core/image.c | 24 | ||||
-rw-r--r-- | src/include/ipxe/image.h | 1 |
3 files changed, 34 insertions, 12 deletions
diff --git a/src/arch/x86/core/runtime.c b/src/arch/x86/core/runtime.c index f96b23a..4de3bfa 100644 --- a/src/arch/x86/core/runtime.c +++ b/src/arch/x86/core/runtime.c @@ -38,7 +38,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/init.h> #include <ipxe/image.h> #include <ipxe/script.h> -#include <ipxe/umalloc.h> #include <realmode.h> /** Command line physical address @@ -202,23 +201,21 @@ static int initrd_init ( void ) { 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; } - /* Allocate and copy initrd content */ - image->data = umalloc ( initrd_len ); - if ( ! image->data ) { - DBGC ( colour, "RUNTIME could not allocate %d bytes for " - "initrd\n", initrd_len ); - rc = -ENOMEM; - goto err_umalloc; + /* 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; } - image->len = initrd_len; - memcpy_user ( image->data, 0, phys_to_user ( initrd_phys ), 0, - initrd_len ); /* Mark initrd as consumed */ initrd_phys = 0; @@ -236,7 +233,7 @@ static int initrd_init ( void ) { return 0; err_register_image: - err_umalloc: + err_set_data: err_set_name: image_put ( image ); err_alloc_image: diff --git a/src/core/image.c b/src/core/image.c index 078ce1b..54b9980 100644 --- a/src/core/image.c +++ b/src/core/image.c @@ -176,6 +176,30 @@ int image_set_cmdline ( struct image *image, const char *cmdline ) { } /** + * Set image data + * + * @v image Image + * @v data Image data + * @v len Length of image data + * @ret rc Return status code + */ +int image_set_data ( struct image *image, userptr_t data, size_t len ) { + userptr_t new; + + /* (Re)allocate image data */ + new = urealloc ( image->data, len ); + if ( ! new ) + return -ENOMEM; + image->data = new; + + /* Copy in new image data */ + memcpy_user ( image->data, 0, data, 0, len ); + image->len = len; + + return 0; +} + +/** * Determine image type * * @v image Executable image diff --git a/src/include/ipxe/image.h b/src/include/ipxe/image.h index 2e7eb4c..4c38776 100644 --- a/src/include/ipxe/image.h +++ b/src/include/ipxe/image.h @@ -175,6 +175,7 @@ extern struct image * alloc_image ( struct uri *uri ); extern int image_set_uri ( struct image *image, struct uri *uri ); extern int image_set_name ( struct image *image, const char *name ); extern int image_set_cmdline ( struct image *image, const char *cmdline ); +extern int image_set_data ( struct image *image, userptr_t data, size_t len ); extern int register_image ( struct image *image ); extern void unregister_image ( struct image *image ); struct image * find_image ( const char *name ); |