| /****************************************************************************** | |
| * arch/ia64/include/asm/native/inst.h | |
| * | |
| * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp> | |
| * VA Linux Systems Japan K.K. | |
| * | |
| * This program is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License as published by | |
| * the Free Software Foundation; either version 2 of the License, or | |
| * (at your option) any later version. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU General Public License | |
| * along with this program; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| * | |
| */ | |
| #define DO_SAVE_MIN IA64_NATIVE_DO_SAVE_MIN | |
| #define __paravirt_switch_to ia64_native_switch_to | |
| #define __paravirt_leave_syscall ia64_native_leave_syscall | |
| #define __paravirt_work_processed_syscall ia64_native_work_processed_syscall | |
| #define __paravirt_leave_kernel ia64_native_leave_kernel | |
| #define __paravirt_pending_syscall_end ia64_work_pending_syscall_end | |
| #define __paravirt_work_processed_syscall_target \ | |
| ia64_work_processed_syscall | |
| #define paravirt_fsyscall_table ia64_native_fsyscall_table | |
| #define paravirt_fsys_bubble_down ia64_native_fsys_bubble_down | |
| #ifdef CONFIG_PARAVIRT_GUEST_ASM_CLOBBER_CHECK | |
| # define PARAVIRT_POISON 0xdeadbeefbaadf00d | |
| # define CLOBBER(clob) \ | |
| ;; \ | |
| movl clob = PARAVIRT_POISON; \ | |
| ;; | |
| # define CLOBBER_PRED(pred_clob) \ | |
| ;; \ | |
| cmp.eq pred_clob, p0 = r0, r0 \ | |
| ;; | |
| #else | |
| # define CLOBBER(clob) /* nothing */ | |
| # define CLOBBER_PRED(pred_clob) /* nothing */ | |
| #endif | |
| #define MOV_FROM_IFA(reg) \ | |
| mov reg = cr.ifa | |
| #define MOV_FROM_ITIR(reg) \ | |
| mov reg = cr.itir | |
| #define MOV_FROM_ISR(reg) \ | |
| mov reg = cr.isr | |
| #define MOV_FROM_IHA(reg) \ | |
| mov reg = cr.iha | |
| #define MOV_FROM_IPSR(pred, reg) \ | |
| (pred) mov reg = cr.ipsr | |
| #define MOV_FROM_IIM(reg) \ | |
| mov reg = cr.iim | |
| #define MOV_FROM_IIP(reg) \ | |
| mov reg = cr.iip | |
| #define MOV_FROM_IVR(reg, clob) \ | |
| mov reg = cr.ivr \ | |
| CLOBBER(clob) | |
| #define MOV_FROM_PSR(pred, reg, clob) \ | |
| (pred) mov reg = psr \ | |
| CLOBBER(clob) | |
| #define MOV_FROM_ITC(pred, pred_clob, reg, clob) \ | |
| (pred) mov reg = ar.itc \ | |
| CLOBBER(clob) \ | |
| CLOBBER_PRED(pred_clob) | |
| #define MOV_TO_IFA(reg, clob) \ | |
| mov cr.ifa = reg \ | |
| CLOBBER(clob) | |
| #define MOV_TO_ITIR(pred, reg, clob) \ | |
| (pred) mov cr.itir = reg \ | |
| CLOBBER(clob) | |
| #define MOV_TO_IHA(pred, reg, clob) \ | |
| (pred) mov cr.iha = reg \ | |
| CLOBBER(clob) | |
| #define MOV_TO_IPSR(pred, reg, clob) \ | |
| (pred) mov cr.ipsr = reg \ | |
| CLOBBER(clob) | |
| #define MOV_TO_IFS(pred, reg, clob) \ | |
| (pred) mov cr.ifs = reg \ | |
| CLOBBER(clob) | |
| #define MOV_TO_IIP(reg, clob) \ | |
| mov cr.iip = reg \ | |
| CLOBBER(clob) | |
| #define MOV_TO_KR(kr, reg, clob0, clob1) \ | |
| mov IA64_KR(kr) = reg \ | |
| CLOBBER(clob0) \ | |
| CLOBBER(clob1) | |
| #define ITC_I(pred, reg, clob) \ | |
| (pred) itc.i reg \ | |
| CLOBBER(clob) | |
| #define ITC_D(pred, reg, clob) \ | |
| (pred) itc.d reg \ | |
| CLOBBER(clob) | |
| #define ITC_I_AND_D(pred_i, pred_d, reg, clob) \ | |
| (pred_i) itc.i reg; \ | |
| (pred_d) itc.d reg \ | |
| CLOBBER(clob) | |
| #define THASH(pred, reg0, reg1, clob) \ | |
| (pred) thash reg0 = reg1 \ | |
| CLOBBER(clob) | |
| #define SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(clob0, clob1) \ | |
| ssm psr.ic | PSR_DEFAULT_BITS \ | |
| CLOBBER(clob0) \ | |
| CLOBBER(clob1) \ | |
| ;; \ | |
| srlz.i /* guarantee that interruption collectin is on */ \ | |
| ;; | |
| #define SSM_PSR_IC_AND_SRLZ_D(clob0, clob1) \ | |
| ssm psr.ic \ | |
| CLOBBER(clob0) \ | |
| CLOBBER(clob1) \ | |
| ;; \ | |
| srlz.d | |
| #define RSM_PSR_IC(clob) \ | |
| rsm psr.ic \ | |
| CLOBBER(clob) | |
| #define SSM_PSR_I(pred, pred_clob, clob) \ | |
| (pred) ssm psr.i \ | |
| CLOBBER(clob) \ | |
| CLOBBER_PRED(pred_clob) | |
| #define RSM_PSR_I(pred, clob0, clob1) \ | |
| (pred) rsm psr.i \ | |
| CLOBBER(clob0) \ | |
| CLOBBER(clob1) | |
| #define RSM_PSR_I_IC(clob0, clob1, clob2) \ | |
| rsm psr.i | psr.ic \ | |
| CLOBBER(clob0) \ | |
| CLOBBER(clob1) \ | |
| CLOBBER(clob2) | |
| #define RSM_PSR_DT \ | |
| rsm psr.dt | |
| #define RSM_PSR_BE_I(clob0, clob1) \ | |
| rsm psr.be | psr.i \ | |
| CLOBBER(clob0) \ | |
| CLOBBER(clob1) | |
| #define SSM_PSR_DT_AND_SRLZ_I \ | |
| ssm psr.dt \ | |
| ;; \ | |
| srlz.i | |
| #define BSW_0(clob0, clob1, clob2) \ | |
| bsw.0 \ | |
| CLOBBER(clob0) \ | |
| CLOBBER(clob1) \ | |
| CLOBBER(clob2) | |
| #define BSW_1(clob0, clob1) \ | |
| bsw.1 \ | |
| CLOBBER(clob0) \ | |
| CLOBBER(clob1) | |
| #define COVER \ | |
| cover | |
| #define RFI \ | |
| rfi |