Added the embedded pxelinux payload patch from hpa.
[people/dverkamp/gpxe.git] / src / image / embedded.c
1 /** @file
2  *
3  * Take a possible embedded image and put it in a struct image
4  * data structure.
5  */
6
7 #include <stdio.h>
8 #include <gpxe/image.h>
9 #include <gpxe/malloc.h>
10 #include <gpxe/uaccess.h>
11 #include <gpxe/umalloc.h>
12 #include <gpxe/embedded.h>
13
14 extern char _embedded_image_start[], _embedded_image_end[];
15
16 struct image *embedded_image(void)
17 {
18         static int reclaimed = 0;
19         struct image *image;
20         size_t eisize = _embedded_image_end - _embedded_image_start;
21
22         if ( !eisize )
23                 return NULL;    /* No embedded image */
24
25         if ( reclaimed )
26                 return NULL;    /* Already reclaimed */
27
28         printf("Embedded image: %d bytes at %p\n",
29                eisize, _embedded_image_start);
30
31         image = alloc_image();
32         if (!image)
33                 return NULL;
34
35         image->len     = eisize;
36         image->data    = umalloc(eisize);
37         if (image->data == UNULL) {
38                 image_put(image);
39                 return image = NULL;
40         }
41         copy_to_user(image->data, 0, _embedded_image_start, eisize);
42
43         /* Reclaim embedded image memory */
44         reclaimed = 1;
45         mpopulate(_embedded_image_start, eisize);
46
47         return image;
48 }
49