Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

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 <gpxe/image.h>
  7. #include <gpxe/malloc.h>
  8. #include <gpxe/uaccess.h>
  9. #include <gpxe/umalloc.h>
  10. #include <gpxe/embedded.h>
  11. extern char _embedded_image_start[], _embedded_image_end[];
  12. struct image *embedded_image(void)
  13. {
  14. static int reclaimed = 0;
  15. struct image *image;
  16. size_t eisize = _embedded_image_end - _embedded_image_start;
  17. if ( !eisize )
  18. return NULL; /* No embedded image */
  19. if ( reclaimed )
  20. return NULL; /* Already reclaimed */
  21. DBG ( "Embedded image: %zd bytes at %p\n",
  22. eisize, _embedded_image_start );
  23. image = alloc_image();
  24. if (!image)
  25. return NULL;
  26. image->len = eisize;
  27. image->data = umalloc(eisize);
  28. if (image->data == UNULL) {
  29. image_put(image);
  30. return image = NULL;
  31. }
  32. copy_to_user(image->data, 0, _embedded_image_start, eisize);
  33. register_image(image);
  34. /* Reclaim embedded image memory */
  35. reclaimed = 1;
  36. mpopulate(_embedded_image_start, eisize);
  37. return image;
  38. }