1/*- 2 * Copyright (c) 2000-2001 Doug Rabson 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29#include <machine/asm.h> 30 31 .data 32 .global ia64_pal_entry 33ia64_pal_entry: .quad 0 34 .text 35 36/* 37 * struct ia64_pal_result ia64_call_pal_static(u_int64_t proc, 38 * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) 39 */ 40ENTRY(ia64_call_pal_static, 4) 41 42 .regstk 4,4,0,0 43palret = loc0 44entry = loc1 45rpsave = loc2 46pfssave = loc3 47 48 alloc pfssave=ar.pfs,4,4,0,0 49 ;; 50 mov rpsave=rp 51 movl entry=@gprel(ia64_pal_entry) 52 531: mov palret=ip // for return address 54 ;; 55 add entry=entry,gp 56 add palret=2f-1b,palret // calculate return address 57 mov r28=in0 // procedure number 58 mov r29=in1 // copy arguments 59 mov r30=in2 60 mov r31=in3 61 ;; 62 ld8 entry=[entry] // read entry point 63 mov b0=palret 64 ;; 65 mov b6=entry 66 ;; 67 br.cond.sptk b6 // call into firmware 68 ;; 692: 70 mov rp=rpsave 71 mov ar.pfs=pfssave 72 ;; 73 br.ret.sptk rp 74 ;; 75END(ia64_call_pal_static) 76 77/* 78 * struct ia64_pal_result ia64_call_pal_stacked(u_int64_t proc, 79 * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) 80 */ 81ENTRY(ia64_call_pal_stacked, 4) 82 83 .regstk 4,4,4,0 84entry = loc0 85rpsave = loc1 86pfssave = loc2 87psrsave = loc3 88 89 alloc pfssave=ar.pfs,4,4,4,0 90 ;; 91 mov rpsave=rp 92 movl entry=@gprel(ia64_pal_entry) 93 ;; 94 add entry=entry,gp 95 mov psrsave=psr 96 mov r28=in0 // procedure number 97 mov out0=in0 98 ;; 99 ld8 entry=[entry] // read entry point 100 mov out1=in1 // copy arguments 101 mov out2=in2 102 mov out3=in3 103 ;; 104 mov b6=entry 105 ;; 106 rsm psr.i // disable interrupts 107 ;; 108 br.call.sptk.many rp=b6 // call into firmware 109 mov psr.l=psrsave 110 mov rp=rpsave 111 mov ar.pfs=pfssave 112 ;; 113 srlz.d 114 br.ret.sptk rp 115 116END(ia64_call_pal_stacked) 117