diff options
author | David Mosberger-Tang <davidm@hpl.hp.com> | 2005-04-28 00:22:40 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-04-28 00:22:40 -0400 |
commit | 8e3e50168c8537807b7a6f78588cd72e21363262 (patch) | |
tree | a63eb89df905efd86a58940286a63c5f670b1c05 /arch/ia64/kernel/gate.S | |
parent | e7e965fa1961a8ce32cbbb1bd436c655ad03973e (diff) |
[IA64] need r29=psr *after* rsm psr.i
Yanmin Zhang pointed out a sequence problem when saving the psr. David
Mosberger provided this patch (which gave up a cycle).
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64/kernel/gate.S')
-rw-r--r-- | arch/ia64/kernel/gate.S | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/arch/ia64/kernel/gate.S b/arch/ia64/kernel/gate.S index 272e64c0e21b..86948ce63e43 100644 --- a/arch/ia64/kernel/gate.S +++ b/arch/ia64/kernel/gate.S | |||
@@ -77,7 +77,7 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc) | |||
77 | epc // B causes split-issue | 77 | epc // B causes split-issue |
78 | } | 78 | } |
79 | ;; | 79 | ;; |
80 | rsm psr.be // M2 (5 cyc to srlz.d) | 80 | rsm psr.be | psr.i // M2 (5 cyc to srlz.d) |
81 | LOAD_FSYSCALL_TABLE(r14) // X | 81 | LOAD_FSYSCALL_TABLE(r14) // X |
82 | ;; | 82 | ;; |
83 | mov r16=IA64_KR(CURRENT) // M2 (12 cyc) | 83 | mov r16=IA64_KR(CURRENT) // M2 (12 cyc) |
@@ -98,15 +98,14 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc) | |||
98 | nop.i 0 | 98 | nop.i 0 |
99 | ;; | 99 | ;; |
100 | nop.m 0 | 100 | nop.m 0 |
101 | (p6) mov b7=r18 // I0 | ||
102 | (p6) tbit.z.unc p8,p0=r18,0 // I0 (dual-issues with "mov b7=r18"!) | 101 | (p6) tbit.z.unc p8,p0=r18,0 // I0 (dual-issues with "mov b7=r18"!) |
103 | |||
104 | nop.m 0 | ||
105 | nop.i 0 | 102 | nop.i 0 |
103 | ;; | ||
104 | (p8) ssm psr.i | ||
105 | (p6) mov b7=r18 // I0 | ||
106 | (p8) br.dptk.many b7 // B | 106 | (p8) br.dptk.many b7 // B |
107 | 107 | ||
108 | mov r27=ar.rsc // M2 (12 cyc) | 108 | mov r27=ar.rsc // M2 (12 cyc) |
109 | (p6) rsm psr.i // M2 | ||
110 | /* | 109 | /* |
111 | * brl.cond doesn't work as intended because the linker would convert this branch | 110 | * brl.cond doesn't work as intended because the linker would convert this branch |
112 | * into a branch to a PLT. Perhaps there will be a way to avoid this with some | 111 | * into a branch to a PLT. Perhaps there will be a way to avoid this with some |
@@ -123,7 +122,7 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc) | |||
123 | #else | 122 | #else |
124 | BRL_COND_FSYS_BUBBLE_DOWN(p6) | 123 | BRL_COND_FSYS_BUBBLE_DOWN(p6) |
125 | #endif | 124 | #endif |
126 | 125 | ssm psr.i | |
127 | mov r10=-1 | 126 | mov r10=-1 |
128 | (p10) mov r8=EINVAL | 127 | (p10) mov r8=EINVAL |
129 | (p9) mov r8=ENOSYS | 128 | (p9) mov r8=ENOSYS |