diff options
author | Michael Brown | 2008-01-08 16:51:36 +0100 |
---|---|---|
committer | Michael Brown | 2008-01-08 16:51:36 +0100 |
commit | 74fd544101c8f17f35dfc2cd16738ebd5228d366 (patch) | |
tree | b813ee1138e4397ee557144739ede124f80c65a0 /src/image | |
parent | When the DHCP file/sname fields are empty, don't allow them to override (diff) | |
download | ipxe-74fd544101c8f17f35dfc2cd16738ebd5228d366.tar.gz ipxe-74fd544101c8f17f35dfc2cd16738ebd5228d366.tar.xz ipxe-74fd544101c8f17f35dfc2cd16738ebd5228d366.zip |
Added the embedded pxelinux payload patch from hpa.
Diffstat (limited to 'src/image')
-rw-r--r-- | src/image/embed.S | 7 | ||||
-rw-r--r-- | src/image/embedded.c | 49 |
2 files changed, 56 insertions, 0 deletions
diff --git a/src/image/embed.S b/src/image/embed.S new file mode 100644 index 00000000..4541bfdc --- /dev/null +++ b/src/image/embed.S @@ -0,0 +1,7 @@ + .section ".data", "aw" + .balign 4 + .globl _embedded_image_start +_embedded_image_start: + .incbin EMBEDIMG + .globl _embedded_image_end +_embedded_image_end: 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; +} + |