code: 9ferno

ref: b502a62da2ec6058923db94f87ecc2d29db2fa77
dir: /os/boot/efi/pe32.s/

View raw version
TEXT mzhdr(SB), 1, $0
	BYTE $'M'; BYTE $'Z'

	WORD $0		/* e_cblp UNUSED */
	WORD $0		/* e_cp UNUSED */
	WORD $0		/* e_crlc UNUSED */
	WORD $0		/* e_cparhdr UNUSED */
	WORD $0		/* e_minalloc UNUSED */
	WORD $0		/* e_maxalloc UNUSED */
	WORD $0		/* e_ss UNUSED */
	WORD $0		/* e_sp UNUSED */
	WORD $0		/* e_csum UNUSED */
	WORD $0		/* e_ip UNUSED */
	WORD $0		/* e_cs UNUSED */
	WORD $0		/* e_lsarlc UNUSED */
	WORD $0		/* e_ovno UNUSED */

	WORD $0		/* e_res UNUSED */
	WORD $0
	WORD $0
	WORD $0
	WORD $0

	WORD $0		/* e_oemid UNUSED */

	WORD $0		/* e_res2 UNUSED */
	WORD $0
	WORD $0
	WORD $0
	WORD $0
	WORD $0
	WORD $0
	WORD $0
	WORD $0
	WORD $0

	LONG $pehdr-IMAGEBASE(SB)	/* offset to pe header */

TEXT pehdr(SB), 1, $0
	BYTE $'P'; BYTE $'E'; BYTE $0; BYTE $0

	WORD $0x014C		/* Machine (Intel 386) */
	WORD $1			/* NumberOfSections */
	LONG $0			/* TimeDateStamp UNUSED */
	LONG $0			/* PointerToSymbolTable UNUSED */
	LONG $0			/* NumberOfSymbols UNUSED */
	WORD $0xE0		/* SizeOfOptionalHeader */
	WORD $2103		/* Characteristics (no relocations, executable, 32 bit) */

	WORD $0x10B		/* Magic (PE32) */
    	BYTE $9			/* MajorLinkerVersion UNUSED */
	BYTE $0			/* MinorLinkerVersion UNUSED */
	LONG $0			/* SizeOfCode UNUSED */
	LONG $0			/* SizeOfInitializedData UNUSED */
	LONG $0			/* SizeOfUninitializedData UNUSED */
	LONG $start-IMAGEBASE(SB)/* AddressOfEntryPoint */
	LONG $0			/* BaseOfCode UNUSED */
	LONG $0			/* BaseOfData UNUSED */
	LONG $IMAGEBASE		/* ImageBase */
	LONG $0x200		/* SectionAlignment */
	LONG $0x200		/* FileAlignment */
	WORD $4			/* MajorOperatingSystemVersion UNUSED */
	WORD $0			/* MinorOperatingSystemVersion UNUSED */
	WORD $0			/* MajorImageVersion UNUSED */
	WORD $0			/* MinorImageVersion UNUSED */
	WORD $4			/* MajorSubsystemVersion */
	WORD $0			/* MinorSubsystemVersion UNUSED */
	LONG $0			/* Win32VersionValue UNUSED */
	LONG $end-IMAGEBASE(SB)	/* SizeOfImage */
 	LONG $start-IMAGEBASE(SB)/* SizeOfHeaders */
 	LONG $0			/* CheckSum UNUSED */
	WORD $10		/* Subsystem (10 = efi application) */
	WORD $0			/* DllCharacteristics UNUSED */
	LONG $0			/* SizeOfStackReserve UNUSED */
	LONG $0			/* SizeOfStackCommit UNUSED */
	LONG $0			/* SizeOfHeapReserve UNUSED */
	LONG $0			/* SizeOfHeapCommit UNUSED */
	LONG $0			/* LoaderFlags UNUSED */
	LONG $16		/* NumberOfRvaAndSizes UNUSED */

	LONG $0; LONG $0
	LONG $0; LONG $0
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */
	LONG $0; LONG $0		/* RVA */

	BYTE $'.'; BYTE $'t'; BYTE $'e'; BYTE $'x'
	BYTE $'t'; BYTE $0;   BYTE $0;   BYTE $0
	LONG $edata-(IMAGEBASE+0x200)(SB)		/* VirtualSize */
	LONG $start-IMAGEBASE(SB)			/* VirtualAddress */
	LONG $edata-(IMAGEBASE+0x200)(SB)		/* SizeOfData */
	LONG $start-IMAGEBASE(SB)			/* PointerToRawData */
	LONG $0			/* PointerToRelocations UNUSED */
	LONG $0			/* PointerToLinenumbers UNUSED */
	WORD $0			/* NumberOfRelocations UNUSED */
	WORD $0			/* NumberOfLinenumbers UNUSED */
	LONG $0x86000020	/* Characteristics (code, execute, read, write) */

	/* padding to get start(SB) at IMAGEBASE+0x200 */
	LONG $0; LONG $0; LONG $0; LONG $0;
	LONG $0; LONG $0; LONG $0; LONG $0;
	LONG $0; LONG $0; LONG $0; LONG $0;
	LONG $0; LONG $0; LONG $0; LONG $0;
	LONG $0; LONG $0; LONG $0; LONG $0;
	LONG $0; LONG $0; LONG $0; LONG $0;
	LONG $0; LONG $0; LONG $0; LONG $0;
	LONG $0; LONG $0; LONG $0; LONG $0;
	LONG $0; LONG $0; LONG $0; LONG $0;
	LONG $0; LONG $0; LONG $0; LONG $0;

TEXT start(SB), 1, $0
	CALL reloc(SP)

TEXT reloc(SB), 1, $0
	MOVL 0(SP), SI
	SUBL $reloc-IMAGEBASE(SB), SI
	MOVL $IMAGEBASE, DI
	MOVL $edata-IMAGEBASE(SB), CX
	CLD
	REP; MOVSB
	MOVL $efimain(SB), DI
	MOVL DI, (SP)
	RET

TEXT jump(SB), $0
	CLI
	MOVL 4(SP), AX
	JMP *AX

TEXT eficall(SB), 1, $0
	MOVL SP, SI
	MOVL SP, DI
	MOVL $(4*16), CX
	SUBL CX, DI
	ANDL $~15ULL, DI
	SUBL $8, DI

	MOVL 4(SI), AX
	LEAL 8(DI), SP

	CLD
	REP; MOVSB
	SUBL $(4*16), SI

	CALL AX

	MOVL SI, SP
	RET