11.1Sjakllsch/*	$NetBSD: crt0-efi-ia64.S,v 1.1.1.2 2021/09/30 18:50:09 jmcneill Exp $	*/
21.1Sjakllsch
31.1Sjakllsch/* crt0-efi-ia64.S - IA-64 EFI startup code.
41.1Sjakllsch   Copyright (C) 1999 Hewlett-Packard Co.
51.1Sjakllsch	Contributed by David Mosberger <davidm@hpl.hp.com>.
61.1Sjakllsch
71.1Sjakllsch    All rights reserved.
81.1Sjakllsch
91.1Sjakllsch    Redistribution and use in source and binary forms, with or without
101.1Sjakllsch    modification, are permitted provided that the following conditions
111.1Sjakllsch    are met:
121.1Sjakllsch
131.1Sjakllsch    * Redistributions of source code must retain the above copyright
141.1Sjakllsch      notice, this list of conditions and the following disclaimer.
151.1Sjakllsch    * Redistributions in binary form must reproduce the above
161.1Sjakllsch      copyright notice, this list of conditions and the following
171.1Sjakllsch      disclaimer in the documentation and/or other materials
181.1Sjakllsch      provided with the distribution.
191.1Sjakllsch    * Neither the name of Hewlett-Packard Co. nor the names of its
201.1Sjakllsch      contributors may be used to endorse or promote products derived
211.1Sjakllsch      from this software without specific prior written permission.
221.1Sjakllsch
231.1Sjakllsch    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
241.1Sjakllsch    CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
251.1Sjakllsch    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
261.1Sjakllsch    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
271.1Sjakllsch    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
281.1Sjakllsch    BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
291.1Sjakllsch    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
301.1Sjakllsch    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
311.1Sjakllsch    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
321.1Sjakllsch    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
331.1Sjakllsch    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
341.1Sjakllsch    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
351.1Sjakllsch    SUCH DAMAGE.
361.1Sjakllsch*/
371.1Sjakllsch	.text
381.1Sjakllsch	.psr abi64
391.1Sjakllsch	.psr lsb
401.1Sjakllsch	.lsb
411.1Sjakllsch
421.1Sjakllsch	.proc _start
431.1Sjakllsch_start:
441.1Sjakllsch	alloc loc0=ar.pfs,2,2,2,0
451.1Sjakllsch	mov loc1=rp
461.1Sjakllsch	movl out0=@gprel(ImageBase)	// out0 <- ImageBase (ldbase)
471.1Sjakllsch	;;
481.1Sjakllsch	add out0=out0,gp
491.1Sjakllsch	movl out1=@gprel(_DYNAMIC)	// out1 <- _DYNAMIC
501.1Sjakllsch	;;		// avoid WAW on CFM
511.1Sjakllsch	add out1=out1,gp
521.1Sjakllsch	br.call.sptk.few rp=_relocate
531.1Sjakllsch.Lret0:
541.1Sjakllsch	cmp.ne p6,p0=r0,r8		// r8 == EFI_SUCCESS?
551.1Sjakllsch(p6)	br.cond.sptk.few .exit		// no ->
561.1Sjakllsch
571.1Sjakllsch.Lret1:
581.1Sjakllsch
591.1Sjakllsch	mov out0=in0			// image handle
601.1Sjakllsch	mov out1=in1			// systab
611.1Sjakllsch	br.call.sptk.few rp=efi_main
621.1Sjakllsch.Lret2:
631.1Sjakllsch.exit:
641.1Sjakllsch	mov ar.pfs=loc0
651.1Sjakllsch	mov rp=loc1
661.1Sjakllsch	;;
671.1Sjakllsch	br.ret.sptk.few rp
681.1Sjakllsch
691.1Sjakllsch	.endp _start
701.1Sjakllsch
711.1Sjakllsch
721.1Sjakllsch	// PE32+ wants a PLABEL, not the code address of the entry point:
731.1Sjakllsch
741.1Sjakllsch	.align 16
751.1Sjakllsch	.global _start_plabel
761.1Sjakllsch	.section .plabel, "a"
771.1Sjakllsch_start_plabel:
781.1Sjakllsch	data8	_start
791.1Sjakllsch	data8	__gp
801.1Sjakllsch
811.1Sjakllsch	// hand-craft a .reloc section for the plabel:
821.1Sjakllsch
831.1Sjakllsch#define IMAGE_REL_BASED_DIR64	10
841.1Sjakllsch
851.1Sjakllsch	.section .reloc, "a"
861.1Sjakllsch	data4	_start_plabel				// Page RVA
871.1.1.2Sjmcneill	data4	12					// Block Size (2*4+2*2), must be aligned by 32 Bits
881.1Sjakllsch	data2	(IMAGE_REL_BASED_DIR64<<12) +  0	// reloc for plabel's entry point
891.1Sjakllsch	data2	(IMAGE_REL_BASED_DIR64<<12) +  8	// reloc for plabel's global pointer
90