ekern

ekern.git
git clone git://git.lenczewski.org/ekern.git
Log | Files | Refs | README | LICENSE

header.S (4479B)


      1 /* PE32+ header for UEFI booting */
      2 
      3 #include "pe.h"
      4 
      5 #include "voffset.h"
      6 
      7 #define ALIGN_NEXT(v, align) (((v) + ((align) - 1)) & ~((align) - 1))
      8 
      9 HEADER:
     10 
     11 MSDOS_HDR:
     12 MSDOS_HDR.e_magic: 		.short IMAGE_DOS_SIGNATURE
     13 				.short 0
     14 .fill 14, 4, 0x00000000
     15 MSDOS_HDR.e_lfanew: 		.int (PE_HDR - MSDOS_HDR)
     16 MSDOS_HDR_END:
     17 
     18 MSDOS_STUB:
     19 .fill 16, 4, 0x00000000
     20 MSDOS_STUB_END:
     21 
     22 PE_HDR:
     23 PE_HDR.PEMagic:			.int IMAGE_NT_SIGNATURE
     24 
     25 #if defined(__KERNEL_AMD64__)
     26 PE_HDR.Machine:			.short IMAGE_FILE_MACHINE_AMD64
     27 #elif defined(__KERNEL_ARM64__)
     28 PE_HDR.Machine:			.short IMAGE_FILE_MACHINE_ARM64
     29 #elif defined(__KERNEL_RISCV64__)
     30 PE_HDR.Machine:			.short IMAGE_FILE_MACHINE_RISCV64
     31 #else
     32 	#error "Unknown target architecture, must be one of: amd64 arm64"
     33 #endif
     34 
     35 PE_HDR.NumberOfSections:	.short ((SECTION_HDRS_END - SECTION_HDRS) / 40)
     36 PE_HDR.TimeDateStamp:		.int 0
     37 PE_HDR.PointerToSymbolTable:	.int 0
     38 PE_HDR.NumberOfSymbols:		.int 0
     39 PE_HDR.SizeOfOptionalHeader:	.short PEOPT_HDR_END - PEOPT_HDR
     40 PE_HDR.Characteristics:		.short IMAGE_FILE_LARGE_ADDRESS_AWARE | \
     41 				       IMAGE_FILE_EXECUTABLE_IMAGE
     42 PE_HDR_END:
     43 
     44 PEOPT_HDR:
     45 PEOPT_HDR.PEOptMagic:		.short PE32_MAGIC
     46 PEOPT_HDR.MajorLinkerVersion:	.byte 0
     47 PEOPT_HDR.MinorLinkerVersion:	.byte 0
     48 PEOPT_HDR.SizeOfCode:		.int (__etext - __text)
     49 PEOPT_HDR.SizeOfData:		.int (__edata - __data)
     50 PEOPT_HDR.SizeOfBss:		.int 0
     51 PEOPT_HDR.AddressOfEntryPoint:	.int (__efi_entry - __image)
     52 PEOPT_HDR.BaseOfCode:		.int (__text - __image)
     53 PEOPT_HDR.BaseOfData:		/* missing due to 64-bit ImageBase in 64-bit PEs*/
     54 
     55 PEOPT_HDR.ImageBase:		.quad __image
     56 PEOPT_HDR.SectionAlignment:	.int __sect_alignment
     57 PEOPT_HDR.FileAlignment:	.int __sect_alignment
     58 PEOPT_HDR.MajorOSVersion:	.short 0
     59 PEOPT_HDR.MinorOSVersion:	.short 0
     60 PEOPT_HDR.MajorImageVersion:	.short 0
     61 PEOPT_HDR.MinorImageVersion:	.short 0
     62 PEOPT_HDR.MajorSubsystemVersion:.short 0
     63 PEOPT_HDR.MinorSubsystemVersion:.short 0
     64 PEOPT_HDR.Win32VersionValue:	.int 0
     65 PEOPT_HDR.SizeOfImage:		.int ALIGN_NEXT(__eimage - __image, __sect_alignment)
     66 PEOPT_HDR.SizeOfHeaders:	.int ALIGN_NEXT(__ehead - __head, __sect_alignment)
     67 PEOPT_HDR.Checksum:		.int 0
     68 PEOPT_HDR.Subsystem:		.short IMAGE_SUBSYSTEM_EFI_APPLICATION
     69 PEOPT_HDR.DllCharacteristics:	.short IMAGE_DLLCHARACTERISTICS_NX_COMPAT
     70 PEOPT_HDR.SizeOfStackReserve:	.quad 0x100000
     71 PEOPT_HDR.SizeOfStackCommit:	.quad 0x1000
     72 PEOPT_HDR.SizeOfHeapReserve:	.quad 0x100000
     73 PEOPT_HDR.SizeOfHeapCommit:	.quad 0x1000
     74 PEOPT_HDR.LoaderFlags:		.int 0
     75 
     76 PEOPT_HDR.NumberOfRvaAndSizes:	.int ((DATA_DIRS_END - DATA_DIRS) / 8)
     77 
     78 DATA_DIRS:
     79 
     80 DATA_DIRS.ExportTable:		.quad 0
     81 DATA_DIRS.ImportTable:		.quad 0
     82 DATA_DIRS.ResourceTable:	.quad 0
     83 DATA_DIRS.ExceptionTable:	.quad 0
     84 DATA_DIRS.CertificateTable.Addr:.int (__sbcert - __image)
     85 DATA_DIRS.CertificateTable.Size:.int (__esbcert - __sbcert)
     86 DATA_DIRS.BaseRelocationTable:	.quad 0
     87 DATA_DIRS.Debug:		.quad 0
     88 DATA_DIRS.Architecture:		.quad 0
     89 DATA_DIRS.GlobalPointer:	.quad 0
     90 DATA_DIRS.TLSTable:		.quad 0
     91 DATA_DIRS.LoadConfiguration:	.quad 0
     92 DATA_DIRS.BoundImportTable:	.quad 0
     93 DATA_DIRS.ImportAddressTable:	.quad 0
     94 DATA_DIRS.DelayImportTable:	.quad 0
     95 DATA_DIRS.CLRRuntimeHeader:	.quad 0
     96 DATA_DIRS.Reserved:		.quad 0
     97 
     98 DATA_DIRS_END:
     99 
    100 PEOPT_HDR_END:
    101 
    102 SECTION_HDRS:
    103 
    104 SECTION_CODE:
    105 SECTION_CODE.Name:		.ascii ".text"
    106 				.byte 0, 0, 0
    107 SECTION_CODE.VirtualSize:	.int (__etext - __text)
    108 SECTION_CODE.VirtualAddress:	.int (__text - __image)
    109 SECTION_CODE.SizeOfRawData:	.int (__etext - __text)
    110 SECTION_CODE.PointerToRawData:	.int (__text - __image)
    111 SECTION_CODE.PointerToRelocs:	.int 0
    112 SECTION_CODE.PointerToLineNums:	.int 0
    113 SECTION_CODE.NumberOfRelocs:	.short 0
    114 SECTION_CODE.NumberOfLineNums:	.short 0
    115 SECTION_CODE.Characteristics:	.int IMAGE_SCN_CNT_CODE | \
    116 				     IMAGE_SCN_MEM_EXECUTE | \
    117 				     IMAGE_SCN_MEM_READ
    118 
    119 SECTION_DATA:
    120 SECTION_DATA.Name:		.ascii ".data"
    121 				.byte 0, 0, 0
    122 SECTION_DATA.VirtualSize:	.int (__edata - __data)
    123 SECTION_DATA.VirtualAddress:	.int (__data - __image)
    124 SECTION_DATA.SizeOfRawData:	.int (__edata - __data)
    125 SECTION_DATA.PointerToRawData:	.int (__data - __image)
    126 SECTION_DATA.PointerToRelocs:	.int 0
    127 SECTION_DATA.PointerToLineNums:	.int 0
    128 SECTION_DATA.NumberOfRelocs:	.short 0
    129 SECTION_DATA.NumberOfLineNums:	.short 0
    130 SECTION_DATA.Characteristics:	.int IMAGE_SCN_CNT_INITIALIZED_DATA | \
    131 				     IMAGE_SCN_MEM_READ | \
    132 				     IMAGE_SCN_MEM_WRITE
    133 
    134 SECTION_HDRS_END:
    135 
    136 HEADER_END:
    137 
    138 .balign __sect_alignment, 0
    139 
    140 .if ((HEADER_END - HEADER) > (__ehead - __head))
    141 	.err "PE header overflows allocated area"
    142 .endif