]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
arm64: add image head flag definitions
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Thu, 15 Nov 2018 05:52:46 +0000 (14:52 +0900)
committerWill Deacon <will.deacon@arm.com>
Thu, 6 Dec 2018 14:38:51 +0000 (14:38 +0000)
Those image head's flags will be used later by kexec_file loader.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Acked-by: James Morse <james.morse@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/include/asm/image.h [new file with mode: 0644]
arch/arm64/kernel/head.S
arch/arm64/kernel/image.h

diff --git a/arch/arm64/include/asm/image.h b/arch/arm64/include/asm/image.h
new file mode 100644 (file)
index 0000000..e2c27a2
--- /dev/null
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __ASM_IMAGE_H
+#define __ASM_IMAGE_H
+
+#define ARM64_IMAGE_MAGIC      "ARM\x64"
+
+#define ARM64_IMAGE_FLAG_BE_SHIFT              0
+#define ARM64_IMAGE_FLAG_PAGE_SIZE_SHIFT       (ARM64_IMAGE_FLAG_BE_SHIFT + 1)
+#define ARM64_IMAGE_FLAG_PHYS_BASE_SHIFT \
+                                       (ARM64_IMAGE_FLAG_PAGE_SIZE_SHIFT + 2)
+#define ARM64_IMAGE_FLAG_BE_MASK               0x1
+#define ARM64_IMAGE_FLAG_PAGE_SIZE_MASK                0x3
+#define ARM64_IMAGE_FLAG_PHYS_BASE_MASK                0x1
+
+#define ARM64_IMAGE_FLAG_LE                    0
+#define ARM64_IMAGE_FLAG_BE                    1
+#define ARM64_IMAGE_FLAG_PAGE_SIZE_4K          1
+#define ARM64_IMAGE_FLAG_PAGE_SIZE_16K         2
+#define ARM64_IMAGE_FLAG_PAGE_SIZE_64K         3
+#define ARM64_IMAGE_FLAG_PHYS_BASE             1
+
+#ifndef __ASSEMBLY__
+
+#define arm64_image_flag_field(flags, field) \
+                               (((flags) >> field##_SHIFT) & field##_MASK)
+
+/*
+ * struct arm64_image_header - arm64 kernel image header
+ * See Documentation/arm64/booting.txt for details
+ *
+ * @code0:             Executable code, or
+ *   @mz_header                  alternatively used for part of MZ header
+ * @code1:             Executable code
+ * @text_offset:       Image load offset
+ * @image_size:                Effective Image size
+ * @flags:             kernel flags
+ * @reserved:          reserved
+ * @magic:             Magic number
+ * @reserved5:         reserved, or
+ *   @pe_header:         alternatively used for PE COFF offset
+ */
+
+struct arm64_image_header {
+       __le32 code0;
+       __le32 code1;
+       __le64 text_offset;
+       __le64 image_size;
+       __le64 flags;
+       __le64 res2;
+       __le64 res3;
+       __le64 res4;
+       __le32 magic;
+       __le32 res5;
+};
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __ASM_IMAGE_H */
index 4471f570a2952775a1d1224be2d2f6adcbb13027..4d0b78c95c3431ecef74bf4b0acc7b3d1a787f8e 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/cache.h>
 #include <asm/cputype.h>
 #include <asm/elf.h>
+#include <asm/image.h>
 #include <asm/kernel-pgtable.h>
 #include <asm/kvm_arm.h>
 #include <asm/memory.h>
@@ -91,7 +92,7 @@ _head:
        .quad   0                               // reserved
        .quad   0                               // reserved
        .quad   0                               // reserved
-       .ascii  "ARM\x64"                       // Magic number
+       .ascii  ARM64_IMAGE_MAGIC               // Magic number
 #ifdef CONFIG_EFI
        .long   pe_header - _head               // Offset to the PE header.
 
index a820ed07fb80035405ace44f36a6a05418730a58..d843f9cbcd929d75cd1113676469cc347832e054 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-#ifndef __ASM_IMAGE_H
-#define __ASM_IMAGE_H
+#ifndef __ARM64_KERNEL_IMAGE_H
+#define __ARM64_KERNEL_IMAGE_H
 
 #ifndef LINKER_SCRIPT
 #error This file should only be included in vmlinux.lds.S
 #endif
 
+#include <asm/image.h>
+
 /*
  * There aren't any ELF relocations we can use to endian-swap values known only
  * at link time (e.g. the subtraction of two symbol addresses), so we must get
        sym##_lo32 = DATA_LE32((data) & 0xffffffff);            \
        sym##_hi32 = DATA_LE32((data) >> 32)
 
+#define __HEAD_FLAG(field)     (__HEAD_FLAG_##field << \
+                                       ARM64_IMAGE_FLAG_##field##_SHIFT)
+
 #ifdef CONFIG_CPU_BIG_ENDIAN
-#define __HEAD_FLAG_BE         1
+#define __HEAD_FLAG_BE         ARM64_IMAGE_FLAG_BE
 #else
-#define __HEAD_FLAG_BE         0
+#define __HEAD_FLAG_BE         ARM64_IMAGE_FLAG_LE
 #endif
 
 #define __HEAD_FLAG_PAGE_SIZE  ((PAGE_SHIFT - 10) / 2)
 
 #define __HEAD_FLAG_PHYS_BASE  1
 
-#define __HEAD_FLAGS           ((__HEAD_FLAG_BE << 0) |        \
-                                (__HEAD_FLAG_PAGE_SIZE << 1) | \
-                                (__HEAD_FLAG_PHYS_BASE << 3))
+#define __HEAD_FLAGS           (__HEAD_FLAG(BE)        | \
+                                __HEAD_FLAG(PAGE_SIZE) | \
+                                __HEAD_FLAG(PHYS_BASE))
 
 /*
  * These will output as part of the Image header, which should be little-endian
@@ -119,4 +124,4 @@ __efistub_screen_info               = KALLSYMS_HIDE(screen_info);
 
 #endif
 
-#endif /* __ASM_IMAGE_H */
+#endif /* __ARM64_KERNEL_IMAGE_H */