diff options
| -rw-r--r-- | arch/ia64/kernel/gate.S | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/arch/ia64/kernel/gate.S b/arch/ia64/kernel/gate.S index facf75acdc85..3cd3f2e971f6 100644 --- a/arch/ia64/kernel/gate.S +++ b/arch/ia64/kernel/gate.S | |||
| @@ -79,31 +79,34 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc) | |||
| 79 | ;; | 79 | ;; |
| 80 | rsm psr.be // note: on McKinley "rsm psr.be/srlz.d" is slightly faster than "rum psr.be" | 80 | rsm psr.be // note: on McKinley "rsm psr.be/srlz.d" is slightly faster than "rum psr.be" |
| 81 | LOAD_FSYSCALL_TABLE(r14) | 81 | LOAD_FSYSCALL_TABLE(r14) |
| 82 | 82 | ;; | |
| 83 | mov r16=IA64_KR(CURRENT) // 12 cycle read latency | 83 | mov r16=IA64_KR(CURRENT) // 12 cycle read latency |
| 84 | tnat.nz p10,p9=r15 | 84 | shladd r18=r17,3,r14 |
| 85 | mov r19=NR_syscalls-1 | 85 | mov r19=NR_syscalls-1 |
| 86 | ;; | 86 | ;; |
| 87 | shladd r18=r17,3,r14 | 87 | lfetch [r18] // M0|1 |
| 88 | 88 | mov r29=psr // read psr (12 cyc load latency) | |
| 89 | srlz.d | ||
| 90 | cmp.ne p8,p0=r0,r0 // p8 <- FALSE | ||
| 91 | /* Note: if r17 is a NaT, p6 will be set to zero. */ | 89 | /* Note: if r17 is a NaT, p6 will be set to zero. */ |
| 92 | cmp.geu p6,p7=r19,r17 // (syscall > 0 && syscall < 1024+NR_syscalls)? | 90 | cmp.geu p6,p7=r19,r17 // (syscall > 0 && syscall < 1024+NR_syscalls)? |
| 93 | ;; | 91 | ;; |
| 94 | (p6) ld8 r18=[r18] | ||
| 95 | mov r21=ar.fpsr | 92 | mov r21=ar.fpsr |
| 96 | add r14=-8,r14 // r14 <- addr of fsys_bubble_down entry | 93 | tnat.nz p10,p9=r15 |
| 94 | mov r26=ar.pfs | ||
| 97 | ;; | 95 | ;; |
| 96 | srlz.d | ||
| 97 | (p6) ld8 r18=[r18] | ||
| 98 | nop.i 0 | ||
| 99 | ;; | ||
| 100 | nop.m 0 | ||
| 98 | (p6) mov b7=r18 | 101 | (p6) mov b7=r18 |
| 99 | (p6) tbit.z p8,p0=r18,0 | 102 | (p6) tbit.z.unc p8,p0=r18,0 |
| 103 | |||
| 104 | nop.m 0 | ||
| 105 | nop.i 0 | ||
| 100 | (p8) br.dptk.many b7 | 106 | (p8) br.dptk.many b7 |
| 101 | 107 | ||
| 102 | (p6) rsm psr.i | ||
| 103 | mov r27=ar.rsc | 108 | mov r27=ar.rsc |
| 104 | mov r26=ar.pfs | 109 | (p6) rsm psr.i |
| 105 | ;; | ||
| 106 | mov r29=psr // read psr (12 cyc load latency) | ||
| 107 | /* | 110 | /* |
| 108 | * brl.cond doesn't work as intended because the linker would convert this branch | 111 | * brl.cond doesn't work as intended because the linker would convert this branch |
| 109 | * into a branch to a PLT. Perhaps there will be a way to avoid this with some | 112 | * into a branch to a PLT. Perhaps there will be a way to avoid this with some |
| @@ -111,6 +114,8 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc) | |||
| 111 | * instead. | 114 | * instead. |
| 112 | */ | 115 | */ |
| 113 | #ifdef CONFIG_ITANIUM | 116 | #ifdef CONFIG_ITANIUM |
| 117 | add r14=-8,r14 // r14 <- addr of fsys_bubble_down entry | ||
| 118 | ;; | ||
| 114 | (p6) ld8 r14=[r14] // r14 <- fsys_bubble_down | 119 | (p6) ld8 r14=[r14] // r14 <- fsys_bubble_down |
| 115 | ;; | 120 | ;; |
| 116 | (p6) mov b7=r14 | 121 | (p6) mov b7=r14 |
