summaryrefslogtreecommitdiffstats
path: root/src/image/embedded.c
diff options
context:
space:
mode:
authorMichael Brown2008-01-08 16:51:36 +0100
committerMichael Brown2008-01-08 16:51:36 +0100
commit74fd544101c8f17f35dfc2cd16738ebd5228d366 (patch)
treeb813ee1138e4397ee557144739ede124f80c65a0 /src/image/embedded.c
parentWhen the DHCP file/sname fields are empty, don't allow them to override (diff)
downloadipxe-74fd544101c8f17f35dfc2cd16738ebd5228d366.tar.gz
ipxe-74fd544101c8f17f35dfc2cd16738ebd5228d366.tar.xz
ipxe-74fd544101c8f17f35dfc2cd16738ebd5228d366.zip
Added the embedded pxelinux payload patch from hpa.
Diffstat (limited to 'src/image/embedded.c')
-rw-r--r--src/image/embedded.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/image/embedded.c b/src/image/embedded.c
new file mode 100644
index 00000000..e2782a43
--- /dev/null
+++ b/src/image/embedded.c
@@ -0,0 +1,49 @@
+/** @file
+ *
+ * Take a possible embedded image and put it in a struct image
+ * data structure.
+ */
+
+#include <stdio.h>
+#include <gpxe/image.h>
+#include <gpxe/malloc.h>
+#include <gpxe/uaccess.h>
+#include <gpxe/umalloc.h>
+#include <gpxe/embedded.h>
+
+extern char _embedded_image_start[], _embedded_image_end[];
+
+struct image *embedded_image(void)
+{
+ static int reclaimed = 0;
+ struct image *image;
+ size_t eisize = _embedded_image_end - _embedded_image_start;
+
+ if ( !eisize )
+ return NULL; /* No embedded image */
+
+ if ( reclaimed )
+ return NULL; /* Already reclaimed */
+
+ printf("Embedded image: %d bytes at %p\n",
+ eisize, _embedded_image_start);
+
+ image = alloc_image();
+ if (!image)
+ return NULL;
+
+ image->len = eisize;
+ image->data = umalloc(eisize);
+ if (image->data == UNULL) {
+ image_put(image);
+ return image = NULL;
+ }
+ copy_to_user(image->data, 0, _embedded_image_start, eisize);
+
+ /* Reclaim embedded image memory */
+ reclaimed = 1;
+ mpopulate(_embedded_image_start, eisize);
+
+ return image;
+}
+