|
Lines 51-56
Link Here
|
| 51 |
#include <asm/system.h> |
51 |
#include <asm/system.h> |
| 52 |
#include <asm/thread_info.h> |
52 |
#include <asm/thread_info.h> |
| 53 |
#include <asm/unistd.h> |
53 |
#include <asm/unistd.h> |
|
|
54 |
#include <asm/errno.h> |
| 54 |
|
55 |
|
| 55 |
#if 1 |
56 |
#if 1 |
| 56 |
# define PSR_DEFAULT_BITS psr.ac |
57 |
# define PSR_DEFAULT_BITS psr.ac |
|
Lines 697-706
ENTRY(break_fault)
Link Here
|
| 697 |
ssm psr.ic | PSR_DEFAULT_BITS |
698 |
ssm psr.ic | PSR_DEFAULT_BITS |
| 698 |
;; |
699 |
;; |
| 699 |
srlz.i // guarantee that interruption collection is on |
700 |
srlz.i // guarantee that interruption collection is on |
|
|
701 |
mov r3=NR_syscalls - 1 |
| 700 |
;; |
702 |
;; |
| 701 |
(p15) ssm psr.i // restore psr.i |
703 |
(p15) ssm psr.i // restore psr.i |
|
|
704 |
// p10==true means out registers are more than 8 or r15's Nat is true |
| 705 |
(p10) br.cond.spnt.many ia64_ret_from_syscall |
| 702 |
;; |
706 |
;; |
| 703 |
mov r3=NR_syscalls - 1 |
|
|
| 704 |
movl r16=sys_call_table |
707 |
movl r16=sys_call_table |
| 705 |
|
708 |
|
| 706 |
adds r15=-1024,r15 // r15 contains the syscall number---subtract 1024 |
709 |
adds r15=-1024,r15 // r15 contains the syscall number---subtract 1024 |
|
Lines 799-806
END(interrupt)
Link Here
|
| 799 |
* On exit: |
802 |
* On exit: |
| 800 |
* - executing on bank 1 registers |
803 |
* - executing on bank 1 registers |
| 801 |
* - psr.ic enabled, interrupts restored |
804 |
* - psr.ic enabled, interrupts restored |
|
|
805 |
* - p10: TRUE if syscall is invoked with more than 8 out |
| 806 |
* registers or r15's Nat is true |
| 802 |
* - r1: kernel's gp |
807 |
* - r1: kernel's gp |
| 803 |
* - r3: preserved (same as on entry) |
808 |
* - r3: preserved (same as on entry) |
|
|
809 |
* - r8: -EINVAL if p10 is true |
| 804 |
* - r12: points to kernel stack |
810 |
* - r12: points to kernel stack |
| 805 |
* - r13: points to current task |
811 |
* - r13: points to current task |
| 806 |
* - p15: TRUE if interrupts need to be re-enabled |
812 |
* - p15: TRUE if interrupts need to be re-enabled |
|
Lines 826-836
GLOBAL_ENTRY(ia64_syscall_setup)
Link Here
|
| 826 |
st8 [r17]=r28,PT(AR_UNAT)-PT(CR_IIP) // save cr.iip |
832 |
st8 [r17]=r28,PT(AR_UNAT)-PT(CR_IIP) // save cr.iip |
| 827 |
mov r28=b0 // save b0 (2 cyc) |
833 |
mov r28=b0 // save b0 (2 cyc) |
| 828 |
(p8) mov in0=-1 |
834 |
(p8) mov in0=-1 |
| 829 |
;; |
|
|
| 830 |
|
835 |
|
| 831 |
st8 [r16]=r0,PT(AR_PFS)-PT(CR_IFS) // clear cr.ifs |
836 |
st8 [r16]=r0,PT(AR_PFS)-PT(CR_IFS) // clear cr.ifs |
|
|
837 |
extr.u r11=r19,7,7 // get sol of ar.pfs |
| 838 |
and r8=0x7f,r19 // get sof of ar.pfs |
| 839 |
;; |
| 832 |
st8 [r17]=r25,PT(AR_RSC)-PT(AR_UNAT) // save ar.unat |
840 |
st8 [r17]=r25,PT(AR_RSC)-PT(AR_UNAT) // save ar.unat |
| 833 |
(p9) mov in1=-1 |
841 |
(p9) mov in1=-1 |
|
|
842 |
add r11=8,r11 |
| 834 |
;; |
843 |
;; |
| 835 |
|
844 |
|
| 836 |
st8 [r16]=r26,PT(AR_RNAT)-PT(AR_PFS) // save ar.pfs |
845 |
st8 [r16]=r26,PT(AR_RNAT)-PT(AR_PFS) // save ar.pfs |
|
Lines 850-865
GLOBAL_ENTRY(ia64_syscall_setup)
Link Here
|
| 850 |
tnat.nz p13,p0=in5 |
859 |
tnat.nz p13,p0=in5 |
| 851 |
;; |
860 |
;; |
| 852 |
(pUStk) st8 [r16]=r24,PT(PR)-PT(AR_RNAT) // save ar.rnat |
861 |
(pUStk) st8 [r16]=r24,PT(PR)-PT(AR_RNAT) // save ar.rnat |
| 853 |
(pUStk) st8 [r17]=r23,PT(B0)-PT(AR_BSPSTORE) // save ar.bspstore |
862 |
cmp.lt p10,p9=r11,r8 // frame size can't be more than local+8 |
| 854 |
shl r18=r18,16 // compute ar.rsc to be used for "loadrs" |
863 |
shl r18=r18,16 // compute ar.rsc to be used for "loadrs" |
|
|
864 |
(pUStk) st8 [r17]=r23,PT(B0)-PT(AR_BSPSTORE) // save ar.bspstore |
| 855 |
;; |
865 |
;; |
|
|
866 |
(p12) mov in4=-1 |
| 867 |
(p9) tnat.nz p10,p0=r15 |
| 856 |
st8 [r16]=r31,PT(LOADRS)-PT(PR) // save predicates |
868 |
st8 [r16]=r31,PT(LOADRS)-PT(PR) // save predicates |
| 857 |
st8 [r17]=r28,PT(R1)-PT(B0) // save b0 |
869 |
st8 [r17]=r28,PT(R1)-PT(B0) // save b0 |
| 858 |
(p12) mov in4=-1 |
870 |
(p13) mov in5=-1 |
| 859 |
;; |
871 |
;; |
| 860 |
st8 [r16]=r18,PT(R12)-PT(LOADRS) // save ar.rsc value for "loadrs" |
872 |
st8 [r16]=r18,PT(R12)-PT(LOADRS) // save ar.rsc value for "loadrs" |
| 861 |
st8.spill [r17]=r20,PT(R13)-PT(R1) // save original r1 |
873 |
st8.spill [r17]=r20,PT(R13)-PT(R1) // save original r1 |
| 862 |
(p13) mov in5=-1 |
874 |
(p10) mov r8=-EINVAL |
| 863 |
;; |
875 |
;; |
| 864 |
|
876 |
|
| 865 |
.mem.offset 0,0; st8.spill [r16]=r12,PT(AR_FPSR)-PT(R12) // save r12 |
877 |
.mem.offset 0,0; st8.spill [r16]=r12,PT(AR_FPSR)-PT(R12) // save r12 |
|
Lines 876-890
GLOBAL_ENTRY(ia64_syscall_setup)
Link Here
|
| 876 |
|
888 |
|
| 877 |
mov r13=r2 // establish `current' |
889 |
mov r13=r2 // establish `current' |
| 878 |
movl r1=__gp // establish kernel global pointer |
890 |
movl r1=__gp // establish kernel global pointer |
| 879 |
;; |
|
|
| 880 |
(p8) mov in7=-1 |
891 |
(p8) mov in7=-1 |
| 881 |
tnat.nz p9,p0=r15 |
|
|
| 882 |
|
| 883 |
cmp.eq pSys,pNonSys=r0,r0 // set pSys=1, pNonSys=0 |
| 884 |
movl r17=FPSR_DEFAULT |
892 |
movl r17=FPSR_DEFAULT |
| 885 |
;; |
893 |
;; |
| 886 |
mov.m ar.fpsr=r17 // set ar.fpsr to kernel default value |
894 |
mov.m ar.fpsr=r17 // set ar.fpsr to kernel default value |
| 887 |
(p9) mov r15=-1 |
895 |
cmp.eq pSys,pNonSys=r0,r0 // set pSys=1, pNonSys=0 |
| 888 |
br.ret.sptk.many b7 |
896 |
br.ret.sptk.many b7 |
| 889 |
END(ia64_syscall_setup) |
897 |
END(ia64_syscall_setup) |
| 890 |
|
898 |
|