load_file.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  4. */
  5. #include <linux/memblock.h>
  6. #include <os.h>
  7. #include "um_arch.h"
  8. static int __init __uml_load_file(const char *filename, void *buf, int size)
  9. {
  10. int fd, n;
  11. fd = os_open_file(filename, of_read(OPENFLAGS()), 0);
  12. if (fd < 0) {
  13. printk(KERN_ERR "Opening '%s' failed - err = %d\n", filename,
  14. -fd);
  15. return -1;
  16. }
  17. n = os_read_file(fd, buf, size);
  18. if (n != size) {
  19. printk(KERN_ERR "Read of %d bytes from '%s' failed, "
  20. "err = %d\n", size,
  21. filename, -n);
  22. return -1;
  23. }
  24. os_close_file(fd);
  25. return 0;
  26. }
  27. void *uml_load_file(const char *filename, unsigned long long *size)
  28. {
  29. void *area;
  30. int err;
  31. *size = 0;
  32. if (!filename)
  33. return NULL;
  34. err = os_file_size(filename, size);
  35. if (err)
  36. return NULL;
  37. if (*size == 0) {
  38. printk(KERN_ERR "\"%s\" is empty\n", filename);
  39. return NULL;
  40. }
  41. area = memblock_alloc(*size, SMP_CACHE_BYTES);
  42. if (!area)
  43. panic("%s: Failed to allocate %llu bytes\n", __func__, *size);
  44. if (__uml_load_file(filename, area, *size)) {
  45. memblock_free(area, *size);
  46. return NULL;
  47. }
  48. return area;
  49. }