aboutsummaryrefslogtreecommitdiffstats
path: root/src/image/embedded.c
blob: 0ce097833f10087933827f1412dfa98c0cd32717 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/** @file
 *
 * Take a possible embedded image and put it in a struct image
 * data structure.
 */

#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 */

	DBG ( "Embedded image: %zd 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);
	register_image(image);

	/* Reclaim embedded image memory */
	reclaimed = 1;
	mpopulate(_embedded_image_start, eisize);

	return image;
}