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