1/*- 2 * Copyright (c) 2011 Marcel Moolenaar 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 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29#include <machine/asm.h> 30#include <machine/ia64_cpu.h> 31 32 .text 33 34/* 35 * u_long ia64_efi_physical(ia64_efi_f, u_long, u_long, u_long, u_long) 36 * 37 * loc0 = ar.pfs 38 * loc1 = rp 39 * loc2 = psr 40 * loc3 = sp 41 * loc4 = bsp 42 * loc5 = gp 43 */ 44ENTRY(ia64_efi_physical, 5) 45 .prologue 46 .regstk 5,6,4,0 47 .save ar.pfs,loc0 48 alloc loc0=ar.pfs,5,6,4,0 49 ;; 50 .save rp,loc1 51 mov loc1=rp 52 ;; 53 .body 54 mov loc2=psr // save psr 55 movl r16=IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | \ 56 IA64_PSR_RT | IA64_PSR_DFL | IA64_PSR_DFH 57 ;; 58 andcm r14=loc2,r16 59 movl r15=IA64_PSR_BN 60 ;; 61 rsm psr.i 62 mov r17=ar.rsc 63 or r16=r14,r15 // new psr 64 ;; 65 mov ar.rsc=0 66 or loc2=loc2,r15 67 ;; 68 flushrs 69 mov loc3=sp // save sp 70 ;; 71 mov loc4=ar.bsp // save ar.bsp 72 mov r18=ar.rnat 73 ;; 74 tpa r19=loc4 // new bspstore 75 mov loc5=gp 76 ;; 77 tpa r20=loc3 // new sp 78 ld8 r21=[in0],8 79 ;; 801: 81 mov r14=ip 82 ;; 83 ld8 r22=[in0] 84 add r15=2f-1b,r14 85 ;; 86 tpa r14=r15 87 ;; 88 rsm psr.ic 89 ;; 90 srlz.i 91 ;; 92 mov cr.iip=r14 93 mov cr.ifs=r0 94 mov cr.ipsr=r16 95 ;; 96 rfi 972: 98 mov ar.bspstore=r19 99 mov sp=r20 100 ;; 101 mov ar.rnat=r18 102 mov ar.rsc=r17 103 ;; 104 mov b6=r21 105 mov gp=r22 106 mov out0=in1 107 mov out1=in2 108 mov out2=in3 109 mov out3=in4 110 ;; 111 br.call.sptk.many rp=b6 112 mov gp=loc5 113 ;; 114 rsm psr.i | psr.ic 115 mov r16=ar.rsc 116 ;; 117 srlz.i 118 mov ar.rsc=0 119 ;; 120 flushrs 121 ;; 122 mov r17=ar.rnat 123 movl r18=3f 124 ;; 125 mov cr.iip=r18 126 mov cr.ifs=r0 127 mov cr.ipsr=loc2 128 ;; 129 rfi 1303: 131 mov ar.bspstore=loc4 132 mov sp=loc3 133 ;; 134 mov ar.rnat=r17 135 mov ar.rsc=r16 136 ;; 137 mov rp=loc1 138 mov ar.pfs=loc0 139 ;; 140 br.ret.sptk.many rp 141END(ia64_efi_physical) 142 143 144/* 145 * ia64_pal_ret ia64_pal_physical(ia64_fw_f, u_long, u_long, u_long, u_long) 146 * 147 * loc0 = ar.pfs 148 * loc1 = rp 149 * loc2 = psr 150 * loc3 = sp 151 * loc4 = bsp 152 * loc5 = gp 153 */ 154ENTRY(ia64_pal_physical, 5) 155 .prologue 156 .regstk 5,6,4,0 157 .save ar.pfs,loc0 158 alloc loc0=ar.pfs,5,6,4,0 159 ;; 160 .save rp,loc1 161 mov loc1=rp 162 ;; 163 .body 164 mov loc2=psr // save psr 165 movl r16=IA64_PSR_I | IA64_PSR_IT | IA64_PSR_DT | \ 166 IA64_PSR_RT | IA64_PSR_DFL | IA64_PSR_DFH 167 ;; 168 andcm r14=loc2,r16 169 movl r15=IA64_PSR_BN 170 ;; 171 rsm psr.i 172 mov r17=ar.rsc 173 or r16=r14,r15 // new psr 174 ;; 175 mov ar.rsc=0 176 or loc2=loc2,r15 177 ;; 178 flushrs 179 mov loc3=sp // save sp 180 ;; 181 mov loc4=ar.bsp // save ar.bsp 182 mov r18=ar.rnat 183 ;; 184 mov loc5=gp 185 movl r14=kstack 186 ;; 187 tpa r19=r14 // new bspstore 188 movl r15=kstack_top 189 ;; 190 tpa r20=r15 // new sp 191 movl r21=ia64_pal_entry 192 ;; 1931: 194 mov r14=ip 195 ld8 r22=[r21] 196 ;; 197 tpa r21=r22 198 add r15=2f-1b,r14 199 ;; 200 tpa r14=r15 201 ;; 202 rsm psr.ic 203 ;; 204 srlz.i 205 ;; 206 mov cr.iip=r14 207 mov cr.ifs=r0 208 mov cr.ipsr=r16 209 ;; 210 rfi 2112: 212 mov ar.bspstore=r19 213 add sp=-16,r20 214 ;; 215 mov ar.rnat=r18 216 mov ar.rsc=r17 217 ;; 218 mov b6=r21 219 mov out0=in0 220 mov out1=in1 221 mov out2=in2 222 mov out3=in3 223 // PAL static calls 224 mov r28=in0 225 mov r29=in1 226 mov r30=in2 227 mov r31=in3 228 br.call.sptk.many rp=b6 229 mov gp=loc5 230 ;; 231 rsm psr.i | psr.ic 232 mov r16=ar.rsc 233 ;; 234 srlz.i 235 mov ar.rsc=0 236 ;; 237 flushrs 238 ;; 239 mov r17=ar.rnat 240 movl r18=3f 241 ;; 242 mov cr.iip=r18 243 mov cr.ifs=r0 244 mov cr.ipsr=loc2 245 ;; 246 rfi 2473: 248 mov ar.bspstore=loc4 249 mov sp=loc3 250 ;; 251 mov ar.rnat=r17 252 mov ar.rsc=r16 253 ;; 254 mov rp=loc1 255 mov ar.pfs=loc0 256 ;; 257 br.ret.sptk.many rp 258END(ia64_pal_physical) 259