123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 |
- #include <asm/asmmacro.h>
- #include <asm/errno.h>
- #include <asm/asm-offsets.h>
- #include <asm/sigcontext.h>
- #include <asm/unistd.h>
- #include <asm/kregs.h>
- #include <asm/page.h>
- #include <asm/native/inst.h>
- .section ".data..patch.fsyscall_table", "a"
- .previous
- #define LOAD_FSYSCALL_TABLE(reg) \
- [1:] movl reg=0; \
- .xdata4 ".data..patch.fsyscall_table", 1b-.
- .section ".data..patch.brl_fsys_bubble_down", "a"
- .previous
- #define BRL_COND_FSYS_BUBBLE_DOWN(pr) \
- [1:](pr)brl.cond.sptk 0; \
- ;; \
- .xdata4 ".data..patch.brl_fsys_bubble_down", 1b-.
- GLOBAL_ENTRY(__kernel_syscall_via_break)
- .prologue
- .altrp b6
- .body
-
- { .mib
- break 0x100000
- nop.i 0
- br.ret.sptk.many b6
- }
- END(__kernel_syscall_via_break)
- # define ARG0_OFF (16 + IA64_SIGFRAME_ARG0_OFFSET)
- # define ARG1_OFF (16 + IA64_SIGFRAME_ARG1_OFFSET)
- # define ARG2_OFF (16 + IA64_SIGFRAME_ARG2_OFFSET)
- # define SIGHANDLER_OFF (16 + IA64_SIGFRAME_HANDLER_OFFSET)
- # define SIGCONTEXT_OFF (16 + IA64_SIGFRAME_SIGCONTEXT_OFFSET)
- # define FLAGS_OFF IA64_SIGCONTEXT_FLAGS_OFFSET
- # define CFM_OFF IA64_SIGCONTEXT_CFM_OFFSET
- # define FR6_OFF IA64_SIGCONTEXT_FR6_OFFSET
- # define BSP_OFF IA64_SIGCONTEXT_AR_BSP_OFFSET
- # define RNAT_OFF IA64_SIGCONTEXT_AR_RNAT_OFFSET
- # define UNAT_OFF IA64_SIGCONTEXT_AR_UNAT_OFFSET
- # define FPSR_OFF IA64_SIGCONTEXT_AR_FPSR_OFFSET
- # define PR_OFF IA64_SIGCONTEXT_PR_OFFSET
- # define RP_OFF IA64_SIGCONTEXT_IP_OFFSET
- # define SP_OFF IA64_SIGCONTEXT_R12_OFFSET
- # define RBS_BASE_OFF IA64_SIGCONTEXT_RBS_BASE_OFFSET
- # define LOADRS_OFF IA64_SIGCONTEXT_LOADRS_OFFSET
- # define base0 r2
- # define base1 r3
-
- #define SIGTRAMP_SAVES \
- .unwabi 3, 's'; \
- .unwabi @svr4, 's'; \
- .savesp ar.unat, UNAT_OFF+SIGCONTEXT_OFF; \
- .savesp ar.fpsr, FPSR_OFF+SIGCONTEXT_OFF; \
- .savesp pr, PR_OFF+SIGCONTEXT_OFF; \
- .savesp rp, RP_OFF+SIGCONTEXT_OFF; \
- .savesp ar.pfs, CFM_OFF+SIGCONTEXT_OFF; \
- .vframesp SP_OFF+SIGCONTEXT_OFF
- GLOBAL_ENTRY(__kernel_sigtramp)
-
- .prologue
- SIGTRAMP_SAVES
- .body
- .label_state 1
- adds base0=SIGHANDLER_OFF,sp
- adds base1=RBS_BASE_OFF+SIGCONTEXT_OFF,sp
- br.call.sptk.many rp=1f
- 1:
- ld8 r17=[base0],(ARG0_OFF-SIGHANDLER_OFF)
- ld8 r15=[base1]
- cover
- ;;
- cmp.ne p1,p0=r15,r0
- mov.m r9=ar.bsp
- .spillsp.p p1, ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
- (p1) br.cond.spnt setup_rbs
- back_from_setup_rbs:
- alloc r8=ar.pfs,0,0,3,0
- ld8 out0=[base0],16
- adds base1=(ARG1_OFF-(RBS_BASE_OFF+SIGCONTEXT_OFF)),base1
- ;;
- ld8 out1=[base1]
- ld8 r10=[r17],8
- ;;
- ld8 out2=[base0]
- ld8 gp=[r17]
- adds base0=(BSP_OFF+SIGCONTEXT_OFF),sp
- ;;
- .spillsp ar.bsp, BSP_OFF+SIGCONTEXT_OFF
- st8 [base0]=r9
- adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp
- adds base1=(FR6_OFF+16+SIGCONTEXT_OFF),sp
- ;;
- stf.spill [base0]=f6,32
- stf.spill [base1]=f7,32
- ;;
- stf.spill [base0]=f8,32
- stf.spill [base1]=f9,32
- mov b6=r10
- ;;
- stf.spill [base0]=f10,32
- stf.spill [base1]=f11,32
- ;;
- stf.spill [base0]=f12,32
- stf.spill [base1]=f13,32
- ;;
- stf.spill [base0]=f14,32
- stf.spill [base1]=f15,32
- br.call.sptk.many rp=b6
- .ret0: adds base0=(BSP_OFF+SIGCONTEXT_OFF),sp
- ;;
- ld8 r15=[base0]
- mov r14=ar.bsp
- ;;
- cmp.ne p1,p0=r14,r15
- (p1) br.cond.spnt restore_rbs
- ;;
- back_from_restore_rbs:
- adds base0=(FR6_OFF+SIGCONTEXT_OFF),sp
- adds base1=(FR6_OFF+16+SIGCONTEXT_OFF),sp
- ;;
- ldf.fill f6=[base0],32
- ldf.fill f7=[base1],32
- ;;
- ldf.fill f8=[base0],32
- ldf.fill f9=[base1],32
- ;;
- ldf.fill f10=[base0],32
- ldf.fill f11=[base1],32
- ;;
- ldf.fill f12=[base0],32
- ldf.fill f13=[base1],32
- ;;
- ldf.fill f14=[base0],32
- ldf.fill f15=[base1],32
- mov r15=__NR_rt_sigreturn
- .restore sp
- break __BREAK_SYSCALL
- .prologue
- SIGTRAMP_SAVES
- setup_rbs:
- mov ar.rsc=0
- ;;
- .save ar.rnat, r19
- mov r19=ar.rnat
- adds r14=(RNAT_OFF+SIGCONTEXT_OFF),sp
- mov r18=ar.bspstore
- mov ar.bspstore=r15
- ;;
- .spillsp ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
- st8 [r14]=r19
- .body
- mov.m r16=ar.bsp
- adds r14=(LOADRS_OFF+SIGCONTEXT_OFF),sp
- ;;
- invala
- sub r15=r16,r15
- extr.u r20=r18,3,6
- ;;
- mov ar.rsc=0xf
- cmp.eq p8,p0=63,r20
- shl r15=r15,16
- ;;
- st8 [r14]=r15
- (p8) st8 [r18]=r19
- .restore sp
- br.cond.sptk back_from_setup_rbs
- .prologue
- SIGTRAMP_SAVES
- .spillsp ar.rnat, RNAT_OFF+SIGCONTEXT_OFF
- .body
- restore_rbs:
-
-
-
-
-
-
-
-
-
-
-
-
-
- alloc r2=ar.pfs,0,0,0,0
- adds r16=(LOADRS_OFF+SIGCONTEXT_OFF),sp
- adds r18=(RNAT_OFF+SIGCONTEXT_OFF),sp
- ;;
- ld8 r17=[r16]
- ld8 r16=[r18]
- extr.u r18=r15,3,6
- ;;
- mov ar.rsc=r17
- shr.u r17=r17,16
- ;;
- sub r14=r14,r17
- shr.u r17=r17,3
- ;;
- loadrs
- extr.u r14=r14,3,6
- ;;
- add r14=r14,r17
- ;;
- shr.u r14=r14,6
- ;;
- sub r14=r14,r17
- movl r17=0x8208208208208209
- ;;
- add r18=r18,r14
- setf.sig f7=r17
- cmp.lt p7,p0=r14,r0
- ;;
- (p7) adds r18=-62,r18
- ;;
- setf.sig f6=r18
- ;;
- xmpy.h f6=f6,f7
- ;;
- getf.sig r17=f6
- ;;
- add r17=r17,r18
- shr r18=r18,63
- ;;
- shr r17=r17,5
- ;;
- sub r17=r17,r18
- ;;
- add r17=r14,r17
- ;;
- shladd r15=r17,3,r15
- ;;
- mov ar.bspstore=r15
- ;;
- mov ar.rnat=r16
- mov ar.rsc=0xf
-
- br.cond.sptk back_from_restore_rbs
- END(__kernel_sigtramp)
- GLOBAL_ENTRY(__kernel_syscall_via_epc)
- .prologue
- .altrp b6
- .body
- {
-
- adds r17=-1024,r15
- mov r10=0
- epc
- }
- ;;
- RSM_PSR_BE_I(r20, r22)
- LOAD_FSYSCALL_TABLE(r14)
- ;;
- mov r16=IA64_KR(CURRENT)
- shladd r18=r17,3,r14
- mov r19=NR_syscalls-1
- ;;
- lfetch [r18]
- MOV_FROM_PSR(p0, r29, r8)
-
- cmp.geu p6,p7=r19,r17
- ;;
- mov r21=ar.fpsr
- tnat.nz p10,p9=r15
- mov.i r26=ar.pfs
- ;;
- srlz.d
- (p6) ld8 r18=[r18]
- nop.i 0
- ;;
- nop.m 0
- (p6) tbit.z.unc p8,p0=r18,0
- nop.i 0
- ;;
- SSM_PSR_I(p8, p14, r25)
- (p6) mov b7=r18
- (p8) br.dptk.many b7
- mov r27=ar.rsc
- #ifdef CONFIG_ITANIUM
- (p6) add r14=-8,r14
- ;;
- (p6) ld8 r14=[r14]
- ;;
- (p6) mov b7=r14
- (p6) br.sptk.many b7
- #else
- BRL_COND_FSYS_BUBBLE_DOWN(p6)
- #endif
- SSM_PSR_I(p0, p14, r10)
- mov r10=-1
- (p10) mov r8=EINVAL
- (p9) mov r8=ENOSYS
- FSYS_RETURN
- END(__kernel_syscall_via_epc)
|