You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

embedded.c 1.0KB

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