Home | History | Annotate | Line # | Download | only in gnuefi
crt0-efi-mips64el.S revision 1.1.1.1.2.2
      1  1.1.1.1.2.2  pgoyette /*	$NetBSD: crt0-efi-mips64el.S,v 1.1.1.1.2.2 2018/09/06 06:56:38 pgoyette Exp $	*/
      2  1.1.1.1.2.2  pgoyette 
      3  1.1.1.1.2.2  pgoyette /*
      4  1.1.1.1.2.2  pgoyette  * crt0-efi-mips64el.S - PE/COFF header for MIPS64 EFI applications
      5  1.1.1.1.2.2  pgoyette  *
      6  1.1.1.1.2.2  pgoyette  * Copright (C) 2014 Linaro Ltd. <ard.biesheuvel (at) linaro.org>
      7  1.1.1.1.2.2  pgoyette  * Copright (C) 2017 Heiher <r (at) hev.cc>
      8  1.1.1.1.2.2  pgoyette  *
      9  1.1.1.1.2.2  pgoyette  * Redistribution and use in source and binary forms, with or without
     10  1.1.1.1.2.2  pgoyette  * modification, are permitted provided that the following conditions
     11  1.1.1.1.2.2  pgoyette  * are met:
     12  1.1.1.1.2.2  pgoyette  * 1. Redistributions of source code must retain the above copyright
     13  1.1.1.1.2.2  pgoyette  *    notice and this list of conditions, without modification.
     14  1.1.1.1.2.2  pgoyette  * 2. The name of the author may not be used to endorse or promote products
     15  1.1.1.1.2.2  pgoyette  *    derived from this software without specific prior written permission.
     16  1.1.1.1.2.2  pgoyette  *
     17  1.1.1.1.2.2  pgoyette  * Alternatively, this software may be distributed under the terms of the
     18  1.1.1.1.2.2  pgoyette  * GNU General Public License as published by the Free Software Foundation;
     19  1.1.1.1.2.2  pgoyette  * either version 2 of the License, or (at your option) any later version.
     20  1.1.1.1.2.2  pgoyette  */
     21  1.1.1.1.2.2  pgoyette 
     22  1.1.1.1.2.2  pgoyette 	.section	.text.head
     23  1.1.1.1.2.2  pgoyette 
     24  1.1.1.1.2.2  pgoyette 	/*
     25  1.1.1.1.2.2  pgoyette 	 * Magic "MZ" signature for PE/COFF
     26  1.1.1.1.2.2  pgoyette 	 */
     27  1.1.1.1.2.2  pgoyette 	.globl	ImageBase
     28  1.1.1.1.2.2  pgoyette ImageBase:
     29  1.1.1.1.2.2  pgoyette 	.ascii	"MZ"
     30  1.1.1.1.2.2  pgoyette 	.skip	58				// 'MZ' + pad + offset == 64
     31  1.1.1.1.2.2  pgoyette 	.long	pe_header - ImageBase		// Offset to the PE header.
     32  1.1.1.1.2.2  pgoyette pe_header:
     33  1.1.1.1.2.2  pgoyette 	.ascii	"PE"
     34  1.1.1.1.2.2  pgoyette 	.short 	0
     35  1.1.1.1.2.2  pgoyette coff_header:
     36  1.1.1.1.2.2  pgoyette 	.short	0x166				// MIPS little endian
     37  1.1.1.1.2.2  pgoyette 	.short	2				// nr_sections
     38  1.1.1.1.2.2  pgoyette 	.long	0 				// TimeDateStamp
     39  1.1.1.1.2.2  pgoyette 	.long	0				// PointerToSymbolTable
     40  1.1.1.1.2.2  pgoyette 	.long	1				// NumberOfSymbols
     41  1.1.1.1.2.2  pgoyette 	.short	section_table - optional_header	// SizeOfOptionalHeader
     42  1.1.1.1.2.2  pgoyette 	.short	0x206				// Characteristics.
     43  1.1.1.1.2.2  pgoyette 						// IMAGE_FILE_DEBUG_STRIPPED |
     44  1.1.1.1.2.2  pgoyette 						// IMAGE_FILE_EXECUTABLE_IMAGE |
     45  1.1.1.1.2.2  pgoyette 						// IMAGE_FILE_LINE_NUMS_STRIPPED
     46  1.1.1.1.2.2  pgoyette optional_header:
     47  1.1.1.1.2.2  pgoyette 	.short	0x20b				// PE32+ format
     48  1.1.1.1.2.2  pgoyette 	.byte	0x02				// MajorLinkerVersion
     49  1.1.1.1.2.2  pgoyette 	.byte	0x14				// MinorLinkerVersion
     50  1.1.1.1.2.2  pgoyette 	.long	_edata - _start			// SizeOfCode
     51  1.1.1.1.2.2  pgoyette 	.long	0				// SizeOfInitializedData
     52  1.1.1.1.2.2  pgoyette 	.long	0				// SizeOfUninitializedData
     53  1.1.1.1.2.2  pgoyette 	.long	_start - ImageBase		// AddressOfEntryPoint
     54  1.1.1.1.2.2  pgoyette 	.long	_start - ImageBase		// BaseOfCode
     55  1.1.1.1.2.2  pgoyette 
     56  1.1.1.1.2.2  pgoyette extra_header_fields:
     57  1.1.1.1.2.2  pgoyette 	.quad	0				// ImageBase
     58  1.1.1.1.2.2  pgoyette 	.long	0x20				// SectionAlignment
     59  1.1.1.1.2.2  pgoyette 	.long	0x8				// FileAlignment
     60  1.1.1.1.2.2  pgoyette 	.short	0				// MajorOperatingSystemVersion
     61  1.1.1.1.2.2  pgoyette 	.short	0				// MinorOperatingSystemVersion
     62  1.1.1.1.2.2  pgoyette 	.short	0				// MajorImageVersion
     63  1.1.1.1.2.2  pgoyette 	.short	0				// MinorImageVersion
     64  1.1.1.1.2.2  pgoyette 	.short	0				// MajorSubsystemVersion
     65  1.1.1.1.2.2  pgoyette 	.short	0				// MinorSubsystemVersion
     66  1.1.1.1.2.2  pgoyette 	.long	0				// Win32VersionValue
     67  1.1.1.1.2.2  pgoyette 
     68  1.1.1.1.2.2  pgoyette 	.long	_edata - ImageBase		// SizeOfImage
     69  1.1.1.1.2.2  pgoyette 
     70  1.1.1.1.2.2  pgoyette 	// Everything before the kernel image is considered part of the header
     71  1.1.1.1.2.2  pgoyette 	.long	_start - ImageBase		// SizeOfHeaders
     72  1.1.1.1.2.2  pgoyette 	.long	0				// CheckSum
     73  1.1.1.1.2.2  pgoyette 	.short	EFI_SUBSYSTEM			// Subsystem
     74  1.1.1.1.2.2  pgoyette 	.short	0				// DllCharacteristics
     75  1.1.1.1.2.2  pgoyette 	.quad	0				// SizeOfStackReserve
     76  1.1.1.1.2.2  pgoyette 	.quad	0				// SizeOfStackCommit
     77  1.1.1.1.2.2  pgoyette 	.quad	0				// SizeOfHeapReserve
     78  1.1.1.1.2.2  pgoyette 	.quad	0				// SizeOfHeapCommit
     79  1.1.1.1.2.2  pgoyette 	.long	0				// LoaderFlags
     80  1.1.1.1.2.2  pgoyette 	.long	0x6				// NumberOfRvaAndSizes
     81  1.1.1.1.2.2  pgoyette 
     82  1.1.1.1.2.2  pgoyette 	.quad	0				// ExportTable
     83  1.1.1.1.2.2  pgoyette 	.quad	0				// ImportTable
     84  1.1.1.1.2.2  pgoyette 	.quad	0				// ResourceTable
     85  1.1.1.1.2.2  pgoyette 	.quad	0				// ExceptionTable
     86  1.1.1.1.2.2  pgoyette 	.quad	0				// CertificationTable
     87  1.1.1.1.2.2  pgoyette 	.quad	0				// BaseRelocationTable
     88  1.1.1.1.2.2  pgoyette 
     89  1.1.1.1.2.2  pgoyette 	// Section table
     90  1.1.1.1.2.2  pgoyette section_table:
     91  1.1.1.1.2.2  pgoyette 
     92  1.1.1.1.2.2  pgoyette 	/*
     93  1.1.1.1.2.2  pgoyette 	 * The EFI application loader requires a relocation section
     94  1.1.1.1.2.2  pgoyette 	 * because EFI applications must be relocatable.  This is a
     95  1.1.1.1.2.2  pgoyette 	 * dummy section as far as we are concerned.
     96  1.1.1.1.2.2  pgoyette 	 */
     97  1.1.1.1.2.2  pgoyette 	.ascii	".reloc"
     98  1.1.1.1.2.2  pgoyette 	.byte	0
     99  1.1.1.1.2.2  pgoyette 	.byte	0			// end of 0 padding of section name
    100  1.1.1.1.2.2  pgoyette 	.long	0
    101  1.1.1.1.2.2  pgoyette 	.long	0
    102  1.1.1.1.2.2  pgoyette 	.long	0			// SizeOfRawData
    103  1.1.1.1.2.2  pgoyette 	.long	0			// PointerToRawData
    104  1.1.1.1.2.2  pgoyette 	.long	0			// PointerToRelocations
    105  1.1.1.1.2.2  pgoyette 	.long	0			// PointerToLineNumbers
    106  1.1.1.1.2.2  pgoyette 	.short	0			// NumberOfRelocations
    107  1.1.1.1.2.2  pgoyette 	.short	0			// NumberOfLineNumbers
    108  1.1.1.1.2.2  pgoyette 	.long	0x42100040		// Characteristics (section flags)
    109  1.1.1.1.2.2  pgoyette 
    110  1.1.1.1.2.2  pgoyette 
    111  1.1.1.1.2.2  pgoyette 	.ascii	".text"
    112  1.1.1.1.2.2  pgoyette 	.byte	0
    113  1.1.1.1.2.2  pgoyette 	.byte	0
    114  1.1.1.1.2.2  pgoyette 	.byte	0        		// end of 0 padding of section name
    115  1.1.1.1.2.2  pgoyette 	.long	_edata - _start		// VirtualSize
    116  1.1.1.1.2.2  pgoyette 	.long	_start - ImageBase	// VirtualAddress
    117  1.1.1.1.2.2  pgoyette 	.long	_edata - _start		// SizeOfRawData
    118  1.1.1.1.2.2  pgoyette 	.long	_start - ImageBase	// PointerToRawData
    119  1.1.1.1.2.2  pgoyette 
    120  1.1.1.1.2.2  pgoyette 	.long	0		// PointerToRelocations (0 for executables)
    121  1.1.1.1.2.2  pgoyette 	.long	0		// PointerToLineNumbers (0 for executables)
    122  1.1.1.1.2.2  pgoyette 	.short	0		// NumberOfRelocations  (0 for executables)
    123  1.1.1.1.2.2  pgoyette 	.short	0		// NumberOfLineNumbers  (0 for executables)
    124  1.1.1.1.2.2  pgoyette 	.long	0xe0500020	// Characteristics (section flags)
    125  1.1.1.1.2.2  pgoyette 
    126  1.1.1.1.2.2  pgoyette 	.set		push
    127  1.1.1.1.2.2  pgoyette 	.set		noreorder
    128  1.1.1.1.2.2  pgoyette 	.align		4
    129  1.1.1.1.2.2  pgoyette 
    130  1.1.1.1.2.2  pgoyette 	.globl	_start
    131  1.1.1.1.2.2  pgoyette 	.ent	_start
    132  1.1.1.1.2.2  pgoyette 	.type	_start, @function
    133  1.1.1.1.2.2  pgoyette _start:
    134  1.1.1.1.2.2  pgoyette 	daddiu		$sp, -32
    135  1.1.1.1.2.2  pgoyette 	sd		$ra, ($sp)
    136  1.1.1.1.2.2  pgoyette 
    137  1.1.1.1.2.2  pgoyette 	// Get pc & gp
    138  1.1.1.1.2.2  pgoyette 	.align		3
    139  1.1.1.1.2.2  pgoyette 	bal		1f
    140  1.1.1.1.2.2  pgoyette 	sd		$gp, 8($sp)
    141  1.1.1.1.2.2  pgoyette _pc:
    142  1.1.1.1.2.2  pgoyette 	.dword		_gp
    143  1.1.1.1.2.2  pgoyette 	.dword		_DYNAMIC
    144  1.1.1.1.2.2  pgoyette 	.dword		_relocate
    145  1.1.1.1.2.2  pgoyette 1:
    146  1.1.1.1.2.2  pgoyette 	// pc in ra
    147  1.1.1.1.2.2  pgoyette 	ld		$gp, ($ra)
    148  1.1.1.1.2.2  pgoyette 	dli		$t0, _pc
    149  1.1.1.1.2.2  pgoyette 	dsubu		$gp, $t0
    150  1.1.1.1.2.2  pgoyette 	daddu		$gp, $ra
    151  1.1.1.1.2.2  pgoyette 
    152  1.1.1.1.2.2  pgoyette 	sd		$a0, 16($sp)
    153  1.1.1.1.2.2  pgoyette 	sd		$a1, 24($sp)
    154  1.1.1.1.2.2  pgoyette 
    155  1.1.1.1.2.2  pgoyette 	// a2: ImageHandle
    156  1.1.1.1.2.2  pgoyette 	move		$a2, $a0
    157  1.1.1.1.2.2  pgoyette 	// a3: SystemTable
    158  1.1.1.1.2.2  pgoyette 	move		$a3, $a1
    159  1.1.1.1.2.2  pgoyette 	// a0: ImageBase
    160  1.1.1.1.2.2  pgoyette 	dli		$t1, ImageBase - _pc
    161  1.1.1.1.2.2  pgoyette 	daddu		$a0, $ra, $t1
    162  1.1.1.1.2.2  pgoyette 	// a1: DynamicSection
    163  1.1.1.1.2.2  pgoyette 	ld		$t1, 8($ra)
    164  1.1.1.1.2.2  pgoyette 	dsubu		$t1, $t0
    165  1.1.1.1.2.2  pgoyette 	daddu		$a1, $ra, $t1
    166  1.1.1.1.2.2  pgoyette 	// call _relocate
    167  1.1.1.1.2.2  pgoyette 	ld		$t1, 16($ra)
    168  1.1.1.1.2.2  pgoyette 	dsubu		$t1, $t0
    169  1.1.1.1.2.2  pgoyette 	daddu		$t9, $ra, $t1
    170  1.1.1.1.2.2  pgoyette 	jalr		$t9
    171  1.1.1.1.2.2  pgoyette 	nop
    172  1.1.1.1.2.2  pgoyette 	bnez		$v0, 1b
    173  1.1.1.1.2.2  pgoyette 	nop
    174  1.1.1.1.2.2  pgoyette 
    175  1.1.1.1.2.2  pgoyette 	// a0: ImageHandle
    176  1.1.1.1.2.2  pgoyette 	ld		$a0, 16($sp)
    177  1.1.1.1.2.2  pgoyette 	// call efi_main
    178  1.1.1.1.2.2  pgoyette 	dla		$t9, efi_main
    179  1.1.1.1.2.2  pgoyette 	jalr		$t9
    180  1.1.1.1.2.2  pgoyette 	// a1: SystemTable
    181  1.1.1.1.2.2  pgoyette 	ld		$a1, 24($sp)
    182  1.1.1.1.2.2  pgoyette 
    183  1.1.1.1.2.2  pgoyette 1:
    184  1.1.1.1.2.2  pgoyette 	ld		$gp, 8($sp)
    185  1.1.1.1.2.2  pgoyette 	ld		$ra, ($sp)
    186  1.1.1.1.2.2  pgoyette 	jr		$ra
    187  1.1.1.1.2.2  pgoyette 	daddiu		$sp, 32
    188  1.1.1.1.2.2  pgoyette 	.end		_start
    189  1.1.1.1.2.2  pgoyette 
    190  1.1.1.1.2.2  pgoyette 	.set		pop
    191