[v4,18/26] tools/include: Add simplified version of pe.h

Message ID 3f48e8bb2232220153b353d0f43cb6d96139b2da.1671098103.git.baskov@ispras.ru
State New
Headers
Series x86_64: Improvements at compressed kernel stage |

Commit Message

Evgeniy Baskov Dec. 15, 2022, 12:38 p.m. UTC
  This is needed to remove magic numbers from x86 bzImage building tool
(arch/x86/boot/tools/build.c).

Tested-by: Mario Limonciello <mario.limonciello@amd.com>
Tested-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Evgeniy Baskov <baskov@ispras.ru>
---
 tools/include/linux/pe.h | 150 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 150 insertions(+)
 create mode 100644 tools/include/linux/pe.h
  

Comments

Ard Biesheuvel March 10, 2023, 3:01 p.m. UTC | #1
On Thu, 15 Dec 2022 at 13:42, Evgeniy Baskov <baskov@ispras.ru> wrote:
>
> This is needed to remove magic numbers from x86 bzImage building tool
> (arch/x86/boot/tools/build.c).
>
> Tested-by: Mario Limonciello <mario.limonciello@amd.com>
> Tested-by: Peter Jones <pjones@redhat.com>
> Signed-off-by: Evgeniy Baskov <baskov@ispras.ru>

Acked-by: Ard Biesheuvel <ardb@kernel.org>

> ---
>  tools/include/linux/pe.h | 150 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 150 insertions(+)
>  create mode 100644 tools/include/linux/pe.h
>
> diff --git a/tools/include/linux/pe.h b/tools/include/linux/pe.h
> new file mode 100644
> index 000000000000..41c09ec371d8
> --- /dev/null
> +++ b/tools/include/linux/pe.h
> @@ -0,0 +1,150 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Simplified version of include/linux/pe.h:
> + *  Copyright 2011 Red Hat, Inc. All rights reserved.
> + *  Author(s): Peter Jones <pjones@redhat.com>
> + */
> +#ifndef __LINUX_PE_H
> +#define __LINUX_PE_H
> +
> +#include <linux/types.h>
> +
> +#define        IMAGE_FILE_MACHINE_I386         0x014c
> +
> +#define IMAGE_SCN_CNT_CODE     0x00000020 /* .text */
> +#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* .data */
> +#define IMAGE_SCN_ALIGN_4096BYTES 0x00d00000
> +#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 /* scn can be discarded */
> +#define IMAGE_SCN_MEM_EXECUTE  0x20000000 /* can be executed as code */
> +#define IMAGE_SCN_MEM_READ     0x40000000 /* readable */
> +#define IMAGE_SCN_MEM_WRITE    0x80000000 /* writeable */
> +
> +#define MZ_HEADER_PEADDR_OFFSET 0x3c
> +
> +struct pe_hdr {
> +       uint32_t magic;         /* PE magic */
> +       uint16_t machine;       /* machine type */
> +       uint16_t sections;      /* number of sections */
> +       uint32_t timestamp;     /* time_t */
> +       uint32_t symbol_table;  /* symbol table offset */
> +       uint32_t symbols;       /* number of symbols */
> +       uint16_t opt_hdr_size;  /* size of optional header */
> +       uint16_t flags;         /* flags */
> +};
> +
> +/* the fact that pe32 isn't padded where pe32+ is 64-bit means union won't
> + * work right.  vomit. */
> +struct pe32_opt_hdr {
> +       /* "standard" header */
> +       uint16_t magic;         /* file type */
> +       uint8_t  ld_major;      /* linker major version */
> +       uint8_t  ld_minor;      /* linker minor version */
> +       uint32_t text_size;     /* size of text section(s) */
> +       uint32_t data_size;     /* size of data section(s) */
> +       uint32_t bss_size;      /* size of bss section(s) */
> +       uint32_t entry_point;   /* file offset of entry point */
> +       uint32_t code_base;     /* relative code addr in ram */
> +       uint32_t data_base;     /* relative data addr in ram */
> +       /* "windows" header */
> +       uint32_t image_base;    /* preferred load address */
> +       uint32_t section_align; /* alignment in bytes */
> +       uint32_t file_align;    /* file alignment in bytes */
> +       uint16_t os_major;      /* major OS version */
> +       uint16_t os_minor;      /* minor OS version */
> +       uint16_t image_major;   /* major image version */
> +       uint16_t image_minor;   /* minor image version */
> +       uint16_t subsys_major;  /* major subsystem version */
> +       uint16_t subsys_minor;  /* minor subsystem version */
> +       uint32_t win32_version; /* reserved, must be 0 */
> +       uint32_t image_size;    /* image size */
> +       uint32_t header_size;   /* header size rounded up to
> +                                  file_align */
> +       uint32_t csum;          /* checksum */
> +       uint16_t subsys;        /* subsystem */
> +       uint16_t dll_flags;     /* more flags! */
> +       uint32_t stack_size_req;/* amt of stack requested */
> +       uint32_t stack_size;    /* amt of stack required */
> +       uint32_t heap_size_req; /* amt of heap requested */
> +       uint32_t heap_size;     /* amt of heap required */
> +       uint32_t loader_flags;  /* reserved, must be 0 */
> +       uint32_t data_dirs;     /* number of data dir entries */
> +};
> +
> +struct pe32plus_opt_hdr {
> +       uint16_t magic;         /* file type */
> +       uint8_t  ld_major;      /* linker major version */
> +       uint8_t  ld_minor;      /* linker minor version */
> +       uint32_t text_size;     /* size of text section(s) */
> +       uint32_t data_size;     /* size of data section(s) */
> +       uint32_t bss_size;      /* size of bss section(s) */
> +       uint32_t entry_point;   /* file offset of entry point */
> +       uint32_t code_base;     /* relative code addr in ram */
> +       /* "windows" header */
> +       uint64_t image_base;    /* preferred load address */
> +       uint32_t section_align; /* alignment in bytes */
> +       uint32_t file_align;    /* file alignment in bytes */
> +       uint16_t os_major;      /* major OS version */
> +       uint16_t os_minor;      /* minor OS version */
> +       uint16_t image_major;   /* major image version */
> +       uint16_t image_minor;   /* minor image version */
> +       uint16_t subsys_major;  /* major subsystem version */
> +       uint16_t subsys_minor;  /* minor subsystem version */
> +       uint32_t win32_version; /* reserved, must be 0 */
> +       uint32_t image_size;    /* image size */
> +       uint32_t header_size;   /* header size rounded up to
> +                                  file_align */
> +       uint32_t csum;          /* checksum */
> +       uint16_t subsys;        /* subsystem */
> +       uint16_t dll_flags;     /* more flags! */
> +       uint64_t stack_size_req;/* amt of stack requested */
> +       uint64_t stack_size;    /* amt of stack required */
> +       uint64_t heap_size_req; /* amt of heap requested */
> +       uint64_t heap_size;     /* amt of heap required */
> +       uint32_t loader_flags;  /* reserved, must be 0 */
> +       uint32_t data_dirs;     /* number of data dir entries */
> +};
> +
> +struct data_dirent {
> +       uint32_t virtual_address;       /* relative to load address */
> +       uint32_t size;
> +};
> +
> +struct data_directory {
> +       struct data_dirent exports;             /* .edata */
> +       struct data_dirent imports;             /* .idata */
> +       struct data_dirent resources;           /* .rsrc */
> +       struct data_dirent exceptions;          /* .pdata */
> +       struct data_dirent certs;               /* certs */
> +       struct data_dirent base_relocations;    /* .reloc */
> +       struct data_dirent debug;               /* .debug */
> +       struct data_dirent arch;                /* reservered */
> +       struct data_dirent global_ptr;          /* global pointer reg. Size=0 */
> +       struct data_dirent tls;                 /* .tls */
> +       struct data_dirent load_config;         /* load configuration structure */
> +       struct data_dirent bound_imports;       /* no idea */
> +       struct data_dirent import_addrs;        /* import address table */
> +       struct data_dirent delay_imports;       /* delay-load import table */
> +       struct data_dirent clr_runtime_hdr;     /* .cor (object only) */
> +       struct data_dirent reserved;
> +};
> +
> +struct section_header {
> +       char name[8];                   /* name or "/12\0" string tbl offset */
> +       uint32_t virtual_size;          /* size of loaded section in ram */
> +       uint32_t virtual_address;       /* relative virtual address */
> +       uint32_t raw_data_size;         /* size of the section */
> +       uint32_t data_addr;             /* file pointer to first page of sec */
> +       uint32_t relocs;                /* file pointer to relocation entries */
> +       uint32_t line_numbers;          /* line numbers! */
> +       uint16_t num_relocs;            /* number of relocations */
> +       uint16_t num_lin_numbers;       /* srsly. */
> +       uint32_t flags;
> +};
> +
> +struct coff_reloc {
> +       uint32_t virtual_address;
> +       uint32_t symbol_table_index;
> +       uint16_t data;
> +};
> +
> +#endif /* __LINUX_PE_H */
> --
> 2.37.4
>
  

Patch

diff --git a/tools/include/linux/pe.h b/tools/include/linux/pe.h
new file mode 100644
index 000000000000..41c09ec371d8
--- /dev/null
+++ b/tools/include/linux/pe.h
@@ -0,0 +1,150 @@ 
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Simplified version of include/linux/pe.h:
+ *  Copyright 2011 Red Hat, Inc. All rights reserved.
+ *  Author(s): Peter Jones <pjones@redhat.com>
+ */
+#ifndef __LINUX_PE_H
+#define __LINUX_PE_H
+
+#include <linux/types.h>
+
+#define	IMAGE_FILE_MACHINE_I386		0x014c
+
+#define IMAGE_SCN_CNT_CODE	0x00000020 /* .text */
+#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* .data */
+#define IMAGE_SCN_ALIGN_4096BYTES 0x00d00000
+#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 /* scn can be discarded */
+#define IMAGE_SCN_MEM_EXECUTE	0x20000000 /* can be executed as code */
+#define IMAGE_SCN_MEM_READ	0x40000000 /* readable */
+#define IMAGE_SCN_MEM_WRITE	0x80000000 /* writeable */
+
+#define MZ_HEADER_PEADDR_OFFSET 0x3c
+
+struct pe_hdr {
+	uint32_t magic;		/* PE magic */
+	uint16_t machine;	/* machine type */
+	uint16_t sections;	/* number of sections */
+	uint32_t timestamp;	/* time_t */
+	uint32_t symbol_table;	/* symbol table offset */
+	uint32_t symbols;	/* number of symbols */
+	uint16_t opt_hdr_size;	/* size of optional header */
+	uint16_t flags;		/* flags */
+};
+
+/* the fact that pe32 isn't padded where pe32+ is 64-bit means union won't
+ * work right.  vomit. */
+struct pe32_opt_hdr {
+	/* "standard" header */
+	uint16_t magic;		/* file type */
+	uint8_t  ld_major;	/* linker major version */
+	uint8_t  ld_minor;	/* linker minor version */
+	uint32_t text_size;	/* size of text section(s) */
+	uint32_t data_size;	/* size of data section(s) */
+	uint32_t bss_size;	/* size of bss section(s) */
+	uint32_t entry_point;	/* file offset of entry point */
+	uint32_t code_base;	/* relative code addr in ram */
+	uint32_t data_base;	/* relative data addr in ram */
+	/* "windows" header */
+	uint32_t image_base;	/* preferred load address */
+	uint32_t section_align;	/* alignment in bytes */
+	uint32_t file_align;	/* file alignment in bytes */
+	uint16_t os_major;	/* major OS version */
+	uint16_t os_minor;	/* minor OS version */
+	uint16_t image_major;	/* major image version */
+	uint16_t image_minor;	/* minor image version */
+	uint16_t subsys_major;	/* major subsystem version */
+	uint16_t subsys_minor;	/* minor subsystem version */
+	uint32_t win32_version;	/* reserved, must be 0 */
+	uint32_t image_size;	/* image size */
+	uint32_t header_size;	/* header size rounded up to
+				   file_align */
+	uint32_t csum;		/* checksum */
+	uint16_t subsys;	/* subsystem */
+	uint16_t dll_flags;	/* more flags! */
+	uint32_t stack_size_req;/* amt of stack requested */
+	uint32_t stack_size;	/* amt of stack required */
+	uint32_t heap_size_req;	/* amt of heap requested */
+	uint32_t heap_size;	/* amt of heap required */
+	uint32_t loader_flags;	/* reserved, must be 0 */
+	uint32_t data_dirs;	/* number of data dir entries */
+};
+
+struct pe32plus_opt_hdr {
+	uint16_t magic;		/* file type */
+	uint8_t  ld_major;	/* linker major version */
+	uint8_t  ld_minor;	/* linker minor version */
+	uint32_t text_size;	/* size of text section(s) */
+	uint32_t data_size;	/* size of data section(s) */
+	uint32_t bss_size;	/* size of bss section(s) */
+	uint32_t entry_point;	/* file offset of entry point */
+	uint32_t code_base;	/* relative code addr in ram */
+	/* "windows" header */
+	uint64_t image_base;	/* preferred load address */
+	uint32_t section_align;	/* alignment in bytes */
+	uint32_t file_align;	/* file alignment in bytes */
+	uint16_t os_major;	/* major OS version */
+	uint16_t os_minor;	/* minor OS version */
+	uint16_t image_major;	/* major image version */
+	uint16_t image_minor;	/* minor image version */
+	uint16_t subsys_major;	/* major subsystem version */
+	uint16_t subsys_minor;	/* minor subsystem version */
+	uint32_t win32_version;	/* reserved, must be 0 */
+	uint32_t image_size;	/* image size */
+	uint32_t header_size;	/* header size rounded up to
+				   file_align */
+	uint32_t csum;		/* checksum */
+	uint16_t subsys;	/* subsystem */
+	uint16_t dll_flags;	/* more flags! */
+	uint64_t stack_size_req;/* amt of stack requested */
+	uint64_t stack_size;	/* amt of stack required */
+	uint64_t heap_size_req;	/* amt of heap requested */
+	uint64_t heap_size;	/* amt of heap required */
+	uint32_t loader_flags;	/* reserved, must be 0 */
+	uint32_t data_dirs;	/* number of data dir entries */
+};
+
+struct data_dirent {
+	uint32_t virtual_address;	/* relative to load address */
+	uint32_t size;
+};
+
+struct data_directory {
+	struct data_dirent exports;		/* .edata */
+	struct data_dirent imports;		/* .idata */
+	struct data_dirent resources;		/* .rsrc */
+	struct data_dirent exceptions;		/* .pdata */
+	struct data_dirent certs;		/* certs */
+	struct data_dirent base_relocations;	/* .reloc */
+	struct data_dirent debug;		/* .debug */
+	struct data_dirent arch;		/* reservered */
+	struct data_dirent global_ptr;		/* global pointer reg. Size=0 */
+	struct data_dirent tls;			/* .tls */
+	struct data_dirent load_config;		/* load configuration structure */
+	struct data_dirent bound_imports;	/* no idea */
+	struct data_dirent import_addrs;	/* import address table */
+	struct data_dirent delay_imports;	/* delay-load import table */
+	struct data_dirent clr_runtime_hdr;	/* .cor (object only) */
+	struct data_dirent reserved;
+};
+
+struct section_header {
+	char name[8];			/* name or "/12\0" string tbl offset */
+	uint32_t virtual_size;		/* size of loaded section in ram */
+	uint32_t virtual_address;	/* relative virtual address */
+	uint32_t raw_data_size;		/* size of the section */
+	uint32_t data_addr;		/* file pointer to first page of sec */
+	uint32_t relocs;		/* file pointer to relocation entries */
+	uint32_t line_numbers;		/* line numbers! */
+	uint16_t num_relocs;		/* number of relocations */
+	uint16_t num_lin_numbers;	/* srsly. */
+	uint32_t flags;
+};
+
+struct coff_reloc {
+	uint32_t virtual_address;
+	uint32_t symbol_table_index;
+	uint16_t data;
+};
+
+#endif /* __LINUX_PE_H */