linux-kernel-image-header-vars.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * (C) Copyright 2017 NVIDIA Corporation <www.nvidia.com>
  4. *
  5. * Derived from Linux kernel v4.14 files:
  6. *
  7. * arch/arm64/include/asm/assembler.h:
  8. * Based on arch/arm/include/asm/assembler.h, arch/arm/mm/proc-macros.S
  9. * Copyright (C) 1996-2000 Russell King
  10. * Copyright (C) 2012 ARM Ltd.
  11. *
  12. * arch/arm64/kernel/head.S:
  13. * Based on arch/arm/kernel/head.S
  14. * Copyright (C) 1994-2002 Russell King
  15. * Copyright (C) 2003-2012 ARM Ltd.
  16. * Authors: Catalin Marinas <catalin.marinas@arm.com>
  17. * Will Deacon <will.deacon@arm.com>
  18. *
  19. * arch/arm64/kernel/image.h:
  20. * Copyright (C) 2014 ARM Ltd.
  21. */
  22. /*
  23. * There aren't any ELF relocations we can use to endian-swap values known only
  24. * at link time (e.g. the subtraction of two symbol addresses), so we must get
  25. * the linker to endian-swap certain values before emitting them.
  26. *
  27. * Note that, in order for this to work when building the ELF64 PIE executable
  28. * (for KASLR), these values should not be referenced via R_AARCH64_ABS64
  29. * relocations, since these are fixed up at runtime rather than at build time
  30. * when PIE is in effect. So we need to split them up in 32-bit high and low
  31. * words.
  32. */
  33. #ifdef CONFIG_CPU_BIG_ENDIAN
  34. #define DATA_LE32(data) \
  35. ((((data) & 0x000000ff) << 24) | \
  36. (((data) & 0x0000ff00) << 8) | \
  37. (((data) & 0x00ff0000) >> 8) | \
  38. (((data) & 0xff000000) >> 24))
  39. #else
  40. #define DATA_LE32(data) ((data) & 0xffffffff)
  41. #endif
  42. #define DEFINE_IMAGE_LE64(sym, data) \
  43. sym##_lo32 = DATA_LE32((data) & 0xffffffff); \
  44. sym##_hi32 = DATA_LE32((data) >> 32)
  45. #define __MAX(a, b) (((a) > (b)) ? (a) : (b))
  46. #define __CODE_DATA_SIZE (__bss_start - _start)
  47. #define __BSS_SIZE (__bss_end - __bss_start)
  48. #ifdef CONFIG_INIT_SP_RELATIVE
  49. #define __MAX_EXTRA_RAM_USAGE __MAX(__BSS_SIZE, CONFIG_SYS_INIT_SP_BSS_OFFSET)
  50. #else
  51. #define __MAX_EXTRA_RAM_USAGE __BSS_SIZE
  52. #endif
  53. #define __MEM_USAGE (__CODE_DATA_SIZE + __MAX_EXTRA_RAM_USAGE)
  54. #ifdef CONFIG_CPU_BIG_ENDIAN
  55. #define __HEAD_FLAG_BE 1
  56. #else
  57. #define __HEAD_FLAG_BE 0
  58. #endif
  59. #define __HEAD_FLAG_PAGE_SIZE 1 /* 4K hard-coded */
  60. #define __HEAD_FLAG_PHYS_BASE 1
  61. #define __HEAD_FLAGS ((__HEAD_FLAG_BE << 0) | \
  62. (__HEAD_FLAG_PAGE_SIZE << 1) | \
  63. (__HEAD_FLAG_PHYS_BASE << 3))
  64. #define TEXT_OFFSET (CONFIG_SYS_TEXT_BASE - \
  65. CONFIG_LNX_KRNL_IMG_TEXT_OFFSET_BASE)
  66. /*
  67. * These will output as part of the Image header, which should be little-endian
  68. * regardless of the endianness of the kernel. While constant values could be
  69. * endian swapped in head.S, all are done here for consistency.
  70. */
  71. #define HEAD_SYMBOLS \
  72. DEFINE_IMAGE_LE64(_kernel_size_le, __MEM_USAGE); \
  73. DEFINE_IMAGE_LE64(_kernel_offset_le, TEXT_OFFSET); \
  74. DEFINE_IMAGE_LE64(_kernel_flags_le, __HEAD_FLAGS);
  75. HEAD_SYMBOLS