ia64/pv_ops: paravirtualize gate.S.
paravirtualize gate.S. Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
committed by
Tony Luck
parent
53129c5c55
commit
c4312511ba
@@ -166,6 +166,11 @@
|
|||||||
#define RSM_PSR_DT \
|
#define RSM_PSR_DT \
|
||||||
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 \
|
#define SSM_PSR_DT_AND_SRLZ_I \
|
||||||
ssm psr.dt \
|
ssm psr.dt \
|
||||||
;; \
|
;; \
|
||||||
|
@@ -251,6 +251,9 @@
|
|||||||
IS_RREG_CLOB(clob2)
|
IS_RREG_CLOB(clob2)
|
||||||
#define RSM_PSR_DT \
|
#define RSM_PSR_DT \
|
||||||
nop 0
|
nop 0
|
||||||
|
#define RSM_PSR_BE_I(clob0, clob1) \
|
||||||
|
IS_RREG_CLOB(clob0) \
|
||||||
|
IS_RREG_CLOB(clob1)
|
||||||
#define SSM_PSR_DT_AND_SRLZ_I \
|
#define SSM_PSR_DT_AND_SRLZ_I \
|
||||||
nop 0
|
nop 0
|
||||||
#define BSW_0(clob0, clob1, clob2) \
|
#define BSW_0(clob0, clob1, clob2) \
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
#include <asm/sigcontext.h>
|
#include <asm/sigcontext.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
|
#include "paravirt_inst.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can't easily refer to symbols inside the kernel. To avoid full runtime relocation,
|
* We can't easily refer to symbols inside the kernel. To avoid full runtime relocation,
|
||||||
@@ -323,7 +324,7 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
|
|||||||
epc // B causes split-issue
|
epc // B causes split-issue
|
||||||
}
|
}
|
||||||
;;
|
;;
|
||||||
rsm psr.be | psr.i // M2 (5 cyc to srlz.d)
|
RSM_PSR_BE_I(r20, r22) // M2 (5 cyc to srlz.d)
|
||||||
LOAD_FSYSCALL_TABLE(r14) // X
|
LOAD_FSYSCALL_TABLE(r14) // X
|
||||||
;;
|
;;
|
||||||
mov r16=IA64_KR(CURRENT) // M2 (12 cyc)
|
mov r16=IA64_KR(CURRENT) // M2 (12 cyc)
|
||||||
@@ -331,7 +332,7 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
|
|||||||
mov r19=NR_syscalls-1 // A
|
mov r19=NR_syscalls-1 // A
|
||||||
;;
|
;;
|
||||||
lfetch [r18] // M0|1
|
lfetch [r18] // M0|1
|
||||||
mov r29=psr // M2 (12 cyc)
|
MOV_FROM_PSR(p0, r29, r8) // M2 (12 cyc)
|
||||||
// If r17 is a NaT, p6 will be zero
|
// If r17 is a NaT, p6 will be zero
|
||||||
cmp.geu p6,p7=r19,r17 // A (sysnr > 0 && sysnr < 1024+NR_syscalls)?
|
cmp.geu p6,p7=r19,r17 // A (sysnr > 0 && sysnr < 1024+NR_syscalls)?
|
||||||
;;
|
;;
|
||||||
@@ -347,7 +348,7 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
|
|||||||
(p6) tbit.z.unc p8,p0=r18,0 // I0 (dual-issues with "mov b7=r18"!)
|
(p6) tbit.z.unc p8,p0=r18,0 // I0 (dual-issues with "mov b7=r18"!)
|
||||||
nop.i 0
|
nop.i 0
|
||||||
;;
|
;;
|
||||||
(p8) ssm psr.i
|
SSM_PSR_I(p8, p14, r25)
|
||||||
(p6) mov b7=r18 // I0
|
(p6) mov b7=r18 // I0
|
||||||
(p8) br.dptk.many b7 // B
|
(p8) br.dptk.many b7 // B
|
||||||
|
|
||||||
@@ -368,9 +369,17 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
|
|||||||
#else
|
#else
|
||||||
BRL_COND_FSYS_BUBBLE_DOWN(p6)
|
BRL_COND_FSYS_BUBBLE_DOWN(p6)
|
||||||
#endif
|
#endif
|
||||||
ssm psr.i
|
SSM_PSR_I(p0, p14, r10)
|
||||||
mov r10=-1
|
mov r10=-1
|
||||||
(p10) mov r8=EINVAL
|
(p10) mov r8=EINVAL
|
||||||
(p9) mov r8=ENOSYS
|
(p9) mov r8=ENOSYS
|
||||||
FSYS_RETURN
|
FSYS_RETURN
|
||||||
|
|
||||||
|
#ifdef CONFIG_PARAVIRT
|
||||||
|
/*
|
||||||
|
* padd to make the size of this symbol constant
|
||||||
|
* independent of paravirtualization.
|
||||||
|
*/
|
||||||
|
.align PAGE_SIZE / 8
|
||||||
|
#endif
|
||||||
END(__kernel_syscall_via_epc)
|
END(__kernel_syscall_via_epc)
|
||||||
|
Reference in New Issue
Block a user