Commit c4312511 authored by Isaku Yamahata's avatar Isaku Yamahata Committed by Tony Luck

ia64/pv_ops: paravirtualize gate.S.

paravirtualize gate.S.
Signed-off-by: default avatarIsaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 53129c5c
...@@ -166,6 +166,11 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment