image.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2019 Western Digital Corporation or its affiliates.
  4. * Authors:
  5. * Atish Patra <atish.patra@wdc.com>
  6. * Based on arm/lib/image.c
  7. */
  8. #include <common.h>
  9. #include <image.h>
  10. #include <mapmem.h>
  11. #include <errno.h>
  12. #include <asm/global_data.h>
  13. #include <linux/sizes.h>
  14. #include <linux/stddef.h>
  15. DECLARE_GLOBAL_DATA_PTR;
  16. /* ASCII version of "RSC\0x5" defined in Linux kernel */
  17. #define LINUX_RISCV_IMAGE_MAGIC 0x05435352
  18. struct linux_image_h {
  19. uint32_t code0; /* Executable code */
  20. uint32_t code1; /* Executable code */
  21. uint64_t text_offset; /* Image load offset */
  22. uint64_t image_size; /* Effective Image size */
  23. uint64_t flags; /* kernel flags (little endian) */
  24. uint32_t version; /* version of the header */
  25. uint32_t res1; /* reserved */
  26. uint64_t res2; /* reserved */
  27. uint64_t res3; /* reserved */
  28. uint32_t magic; /* Magic number */
  29. uint32_t res4; /* reserved */
  30. };
  31. int booti_setup(ulong image, ulong *relocated_addr, ulong *size,
  32. bool force_reloc)
  33. {
  34. struct linux_image_h *lhdr;
  35. lhdr = (struct linux_image_h *)map_sysmem(image, 0);
  36. if (lhdr->magic != LINUX_RISCV_IMAGE_MAGIC) {
  37. puts("Bad Linux RISCV Image magic!\n");
  38. return -EINVAL;
  39. }
  40. if (lhdr->image_size == 0) {
  41. puts("Image lacks image_size field, error!\n");
  42. return -EINVAL;
  43. }
  44. *size = lhdr->image_size;
  45. if (force_reloc ||
  46. (gd->ram_base <= image && image < gd->ram_base + gd->ram_size)) {
  47. *relocated_addr = gd->ram_base + lhdr->text_offset;
  48. } else {
  49. *relocated_addr = image;
  50. }
  51. unmap_sysmem(lhdr);
  52. return 0;
  53. }