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