1/******************************************************************************
2 * arch/ia64/include/asm/native/inst.h
3 *
4 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
5 *                    VA Linux Systems Japan K.K.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20 *
21 */
22
23#define DO_SAVE_MIN		IA64_NATIVE_DO_SAVE_MIN
24
25#define __paravirt_switch_to			ia64_native_switch_to
26#define __paravirt_leave_syscall		ia64_native_leave_syscall
27#define __paravirt_work_processed_syscall	ia64_native_work_processed_syscall
28#define __paravirt_leave_kernel			ia64_native_leave_kernel
29#define __paravirt_pending_syscall_end		ia64_work_pending_syscall_end
30#define __paravirt_work_processed_syscall_target \
31						ia64_work_processed_syscall
32
33#define paravirt_fsyscall_table			ia64_native_fsyscall_table
34#define paravirt_fsys_bubble_down		ia64_native_fsys_bubble_down
35
36#ifdef CONFIG_PARAVIRT_GUEST_ASM_CLOBBER_CHECK
37# define PARAVIRT_POISON	0xdeadbeefbaadf00d
38# define CLOBBER(clob)				\
39	;;					\
40	movl clob = PARAVIRT_POISON;		\
41	;;
42# define CLOBBER_PRED(pred_clob)		\
43	;;					\
44	cmp.eq pred_clob, p0 = r0, r0		\
45	;;
46#else
47# define CLOBBER(clob)			/* nothing */
48# define CLOBBER_PRED(pred_clob)	/* nothing */
49#endif
50
51#define MOV_FROM_IFA(reg)	\
52	mov reg = cr.ifa
53
54#define MOV_FROM_ITIR(reg)	\
55	mov reg = cr.itir
56
57#define MOV_FROM_ISR(reg)	\
58	mov reg = cr.isr
59
60#define MOV_FROM_IHA(reg)	\
61	mov reg = cr.iha
62
63#define MOV_FROM_IPSR(pred, reg)	\
64(pred)	mov reg = cr.ipsr
65
66#define MOV_FROM_IIM(reg)	\
67	mov reg = cr.iim
68
69#define MOV_FROM_IIP(reg)	\
70	mov reg = cr.iip
71
72#define MOV_FROM_IVR(reg, clob)	\
73	mov reg = cr.ivr	\
74	CLOBBER(clob)
75
76#define MOV_FROM_PSR(pred, reg, clob)	\
77(pred)	mov reg = psr			\
78	CLOBBER(clob)
79
80#define MOV_FROM_ITC(pred, pred_clob, reg, clob)	\
81(pred)	mov reg = ar.itc				\
82	CLOBBER(clob)					\
83	CLOBBER_PRED(pred_clob)
84
85#define MOV_TO_IFA(reg, clob)	\
86	mov cr.ifa = reg	\
87	CLOBBER(clob)
88
89#define MOV_TO_ITIR(pred, reg, clob)	\
90(pred)	mov cr.itir = reg		\
91	CLOBBER(clob)
92
93#define MOV_TO_IHA(pred, reg, clob)	\
94(pred)	mov cr.iha = reg		\
95	CLOBBER(clob)
96
97#define MOV_TO_IPSR(pred, reg, clob)		\
98(pred)	mov cr.ipsr = reg			\
99	CLOBBER(clob)
100
101#define MOV_TO_IFS(pred, reg, clob)	\
102(pred)	mov cr.ifs = reg		\
103	CLOBBER(clob)
104
105#define MOV_TO_IIP(reg, clob)	\
106	mov cr.iip = reg	\
107	CLOBBER(clob)
108
109#define MOV_TO_KR(kr, reg, clob0, clob1)	\
110	mov IA64_KR(kr) = reg			\
111	CLOBBER(clob0)				\
112	CLOBBER(clob1)
113
114#define ITC_I(pred, reg, clob)	\
115(pred)	itc.i reg		\
116	CLOBBER(clob)
117
118#define ITC_D(pred, reg, clob)	\
119(pred)	itc.d reg		\
120	CLOBBER(clob)
121
122#define ITC_I_AND_D(pred_i, pred_d, reg, clob)	\
123(pred_i) itc.i reg;				\
124(pred_d) itc.d reg				\
125	CLOBBER(clob)
126
127#define THASH(pred, reg0, reg1, clob)		\
128(pred)	thash reg0 = reg1			\
129	CLOBBER(clob)
130
131#define SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(clob0, clob1)		\
132	ssm psr.ic | PSR_DEFAULT_BITS					\
133	CLOBBER(clob0)							\
134	CLOBBER(clob1)							\
135	;;								\
136	srlz.i /* guarantee that interruption collectin is on */	\
137	;;
138
139#define SSM_PSR_IC_AND_SRLZ_D(clob0, clob1)	\
140	ssm psr.ic				\
141	CLOBBER(clob0)				\
142	CLOBBER(clob1)				\
143	;;					\
144	srlz.d
145
146#define RSM_PSR_IC(clob)	\
147	rsm psr.ic		\
148	CLOBBER(clob)
149
150#define SSM_PSR_I(pred, pred_clob, clob)	\
151(pred)	ssm psr.i				\
152	CLOBBER(clob)				\
153	CLOBBER_PRED(pred_clob)
154
155#define RSM_PSR_I(pred, clob0, clob1)	\
156(pred)	rsm psr.i			\
157	CLOBBER(clob0)			\
158	CLOBBER(clob1)
159
160#define RSM_PSR_I_IC(clob0, clob1, clob2)	\
161	rsm psr.i | psr.ic			\
162	CLOBBER(clob0)				\
163	CLOBBER(clob1)				\
164	CLOBBER(clob2)
165
166#define RSM_PSR_DT		\
167	rsm psr.dt
168
169#define RSM_PSR_BE_I(clob0, clob1)	\
170	rsm psr.be | psr.i		\
171	CLOBBER(clob0)			\
172	CLOBBER(clob1)
173
174#define SSM_PSR_DT_AND_SRLZ_I	\
175	ssm psr.dt		\
176	;;			\
177	srlz.i
178
179#define BSW_0(clob0, clob1, clob2)	\
180	bsw.0				\
181	CLOBBER(clob0)			\
182	CLOBBER(clob1)			\
183	CLOBBER(clob2)
184
185#define BSW_1(clob0, clob1)	\
186	bsw.1			\
187	CLOBBER(clob0)		\
188	CLOBBER(clob1)
189
190#define COVER	\
191	cover
192
193#define RFI	\
194	rfi
195