]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/ia64/ia64/physical.S
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / ia64 / ia64 / physical.S
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  */
44 ENTRY(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                 ;;
80 1:
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
97 2:
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
130 3:
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
141 END(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  */
154 ENTRY(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                 ;;
193 1:
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
211 2:
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
247 3:
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
258 END(ia64_pal_physical)