[RFC PATCH 2/3] arm64: add C struct definition for Image header

Ard Biesheuvel ard.biesheuvel at linaro.org
Tue Jul 8 05:50:02 PDT 2014


In order to be able to interpret the Image header from C code, we need a
struct definition that reflects the specification for Image headers as laid
out in Documentation/arm64/booting.txt.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
---
 arch/arm64/include/asm/image_hdr.h | 53 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)
 create mode 100644 arch/arm64/include/asm/image_hdr.h

diff --git a/arch/arm64/include/asm/image_hdr.h b/arch/arm64/include/asm/image_hdr.h
new file mode 100644
index 000000000000..16d32600fb18
--- /dev/null
+++ b/arch/arm64/include/asm/image_hdr.h
@@ -0,0 +1,53 @@
+/*
+ * image_hdr.h - C struct definition of the Image header format
+ *
+ * Copyright (C) 2014 Linaro Ltd  <ard.biesheuvel at linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ASM_IMAGE_HDR_H
+#define __ASM_IMAGE_HDR_H
+
+#include <linux/bug.h>
+#include <linux/byteorder/generic.h>
+#include <linux/types.h>
+
+/*
+ * As defined in Documentation/arm64/booting.txt
+ */
+#define IMAGE_HDR_SIZE		64
+
+struct image_hdr {
+	u32	code0;		/* Executable code */
+	u32	code1;		/* Executable code */
+	__le64	text_offset;	/* Image load offset */
+	u64	res0;		/* Reserved, must be 0 */
+	u64	res1;		/* Reserved, must be 0 */
+	u64	res2;		/* Reserved, must be 0 */
+	u64	res3;		/* Reserved, must be 0 */
+	u64	res4;		/* Reserved, must be 0 */
+	__le32	magic;		/* Magic number, little endian, "ARM\x64" */
+	__le32	pehdr_offset;	/* PE header offset, only used by EFI */
+};
+
+/*
+ * bool image_hdr_check() - checks the Image header for inconsistencies.
+ */
+static inline bool image_hdr_check(struct image_hdr const *hdr)
+{
+	BUILD_BUG_ON(sizeof(struct image_hdr) != IMAGE_HDR_SIZE);
+
+	if (hdr->res0 | hdr->res1 | hdr->res2 | hdr->res3 | hdr->res4)
+		return false;
+	return hdr->magic == cpu_to_le32(0x644d5241);
+}
+
+static inline u64 image_hdr_text_offset(struct image_hdr const *hdr)
+{
+	return le64_to_cpu(hdr->text_offset);
+}
+
+#endif
-- 
1.8.3.2




More information about the linux-arm-kernel mailing list