summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2021-01-20 19:03:16 +0100
committerMichael Brown2021-01-22 19:34:47 +0100
commit99ac69b8a9a48207913e98ac6b357c029b0eef81 (patch)
tree22f88f44671cb1fc29fe5ac47b50b5fa54b34586
parent[build] Allow an initrd script to be provided via genfsimg (diff)
downloadipxe-99ac69b8a9a48207913e98ac6b357c029b0eef81.tar.gz
ipxe-99ac69b8a9a48207913e98ac6b357c029b0eef81.tar.xz
ipxe-99ac69b8a9a48207913e98ac6b357c029b0eef81.zip
[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.c21
-rw-r--r--src/core/image.c24
-rw-r--r--src/include/ipxe/image.h1
3 files changed, 34 insertions, 12 deletions
diff --git a/src/arch/x86/core/runtime.c b/src/arch/x86/core/runtime.c
index f96b23af..4de3bfaf 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 078ce1bb..54b99802 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 2e7eb4ce..4c387760 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 );