[SPARC64]: %l6 trap return handling no longer necessary.
Now that we indicate the "restart system call" in the trap type field of pt_regs->magic, we don't need to set the %l6 boolean in all of the trap return paths. And we therefore don't need to pass it to do_notify_resume(). Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
238468b2ac
Коммит
7697daaa89
|
@ -47,7 +47,7 @@ do_fpdis:
|
||||||
ba,pt %xcc, etrap
|
ba,pt %xcc, etrap
|
||||||
109: or %g7, %lo(109b), %g7
|
109: or %g7, %lo(109b), %g7
|
||||||
add %g0, %g0, %g0
|
add %g0, %g0, %g0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
1: TRAP_LOAD_THREAD_REG(%g6, %g1)
|
1: TRAP_LOAD_THREAD_REG(%g6, %g1)
|
||||||
ldub [%g6 + TI_FPSAVED], %g5
|
ldub [%g6 + TI_FPSAVED], %g5
|
||||||
|
@ -226,7 +226,7 @@ fp_other_bounce:
|
||||||
call do_fpother
|
call do_fpother
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
.globl do_fpother_check_fitos
|
.globl do_fpother_check_fitos
|
||||||
.align 32
|
.align 32
|
||||||
|
@ -489,7 +489,7 @@ utrap_trap: /* %g3=handler,%g4=level */
|
||||||
call bad_trap
|
call bad_trap
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
invoke_utrap:
|
invoke_utrap:
|
||||||
sllx %g3, 3, %g3
|
sllx %g3, 3, %g3
|
||||||
|
@ -607,7 +607,7 @@ __spitfire_cee_trap_continue:
|
||||||
call spitfire_access_error
|
call spitfire_access_error
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
/* This is the trap handler entry point for ECC correctable
|
/* This is the trap handler entry point for ECC correctable
|
||||||
* errors. They are corrected, but we listen for the trap
|
* errors. They are corrected, but we listen for the trap
|
||||||
|
@ -686,7 +686,7 @@ __spitfire_data_access_exception_tl1:
|
||||||
call spitfire_data_access_exception_tl1
|
call spitfire_data_access_exception_tl1
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
__spitfire_data_access_exception:
|
__spitfire_data_access_exception:
|
||||||
rdpr %pstate, %g4
|
rdpr %pstate, %g4
|
||||||
|
@ -705,7 +705,7 @@ __spitfire_data_access_exception:
|
||||||
call spitfire_data_access_exception
|
call spitfire_data_access_exception
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
.globl __spitfire_insn_access_exception
|
.globl __spitfire_insn_access_exception
|
||||||
.globl __spitfire_insn_access_exception_tl1
|
.globl __spitfire_insn_access_exception_tl1
|
||||||
|
@ -725,7 +725,7 @@ __spitfire_insn_access_exception_tl1:
|
||||||
call spitfire_insn_access_exception_tl1
|
call spitfire_insn_access_exception_tl1
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
__spitfire_insn_access_exception:
|
__spitfire_insn_access_exception:
|
||||||
rdpr %pstate, %g4
|
rdpr %pstate, %g4
|
||||||
|
@ -743,7 +743,7 @@ __spitfire_insn_access_exception:
|
||||||
call spitfire_insn_access_exception
|
call spitfire_insn_access_exception
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
/* These get patched into the trap table at boot time
|
/* These get patched into the trap table at boot time
|
||||||
* once we know we have a cheetah processor.
|
* once we know we have a cheetah processor.
|
||||||
|
@ -937,7 +937,7 @@ do_dcpe_tl1_fatal:
|
||||||
call cheetah_plus_parity_error
|
call cheetah_plus_parity_error
|
||||||
add %sp, PTREGS_OFF, %o1
|
add %sp, PTREGS_OFF, %o1
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
do_icpe_tl1:
|
do_icpe_tl1:
|
||||||
rdpr %tl, %g1 ! Save original trap level
|
rdpr %tl, %g1 ! Save original trap level
|
||||||
|
@ -979,7 +979,7 @@ do_icpe_tl1_fatal:
|
||||||
call cheetah_plus_parity_error
|
call cheetah_plus_parity_error
|
||||||
add %sp, PTREGS_OFF, %o1
|
add %sp, PTREGS_OFF, %o1
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
dcpe_icpe_tl1_common:
|
dcpe_icpe_tl1_common:
|
||||||
/* Flush D-cache, re-enable D/I caches in DCU and finally
|
/* Flush D-cache, re-enable D/I caches in DCU and finally
|
||||||
|
@ -1281,7 +1281,7 @@ __do_privact:
|
||||||
call do_privact
|
call do_privact
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
.globl do_mna
|
.globl do_mna
|
||||||
do_mna:
|
do_mna:
|
||||||
|
@ -1308,7 +1308,7 @@ do_mna:
|
||||||
call mem_address_unaligned
|
call mem_address_unaligned
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
.globl do_lddfmna
|
.globl do_lddfmna
|
||||||
do_lddfmna:
|
do_lddfmna:
|
||||||
|
@ -1326,7 +1326,7 @@ do_lddfmna:
|
||||||
call handle_lddfmna
|
call handle_lddfmna
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
.globl do_stdfmna
|
.globl do_stdfmna
|
||||||
do_stdfmna:
|
do_stdfmna:
|
||||||
|
@ -1344,7 +1344,7 @@ do_stdfmna:
|
||||||
call handle_stdfmna
|
call handle_stdfmna
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
.globl breakpoint_trap
|
.globl breakpoint_trap
|
||||||
breakpoint_trap:
|
breakpoint_trap:
|
||||||
|
@ -1424,13 +1424,13 @@ sys32_rt_sigreturn:
|
||||||
1: ldx [%curptr + TI_FLAGS], %l5
|
1: ldx [%curptr + TI_FLAGS], %l5
|
||||||
andcc %l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0
|
andcc %l5, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT), %g0
|
||||||
be,pt %icc, rtrap
|
be,pt %icc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
call syscall_trace
|
call syscall_trace
|
||||||
mov 1, %o1
|
mov 1, %o1
|
||||||
|
|
||||||
ba,pt %xcc, rtrap
|
ba,pt %xcc, rtrap
|
||||||
clr %l6
|
nop
|
||||||
|
|
||||||
/* This is how fork() was meant to be done, 8 instruction entry.
|
/* This is how fork() was meant to be done, 8 instruction entry.
|
||||||
*
|
*
|
||||||
|
@ -1605,7 +1605,7 @@ ret_sys_call:
|
||||||
bne,pn %icc, linux_syscall_trace2
|
bne,pn %icc, linux_syscall_trace2
|
||||||
add %l1, 0x4, %l2 ! npc = npc+4
|
add %l1, 0x4, %l2 ! npc = npc+4
|
||||||
stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
|
stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]
|
||||||
ba,pt %xcc, rtrap_clr_l6
|
ba,pt %xcc, rtrap
|
||||||
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
|
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC]
|
||||||
|
|
||||||
1:
|
1:
|
||||||
|
@ -1616,7 +1616,6 @@ ret_sys_call:
|
||||||
sub %g0, %o0, %o0
|
sub %g0, %o0, %o0
|
||||||
or %g3, %g2, %g3
|
or %g3, %g2, %g3
|
||||||
stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
|
stx %o0, [%sp + PTREGS_OFF + PT_V9_I0]
|
||||||
mov 1, %l6
|
|
||||||
stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
|
stx %g3, [%sp + PTREGS_OFF + PT_V9_TSTATE]
|
||||||
bne,pn %icc, linux_syscall_trace2
|
bne,pn %icc, linux_syscall_trace2
|
||||||
add %l1, 0x4, %l2 ! npc = npc+4
|
add %l1, 0x4, %l2 ! npc = npc+4
|
||||||
|
|
|
@ -20,7 +20,6 @@ extern void timer_interrupt(int irq, struct pt_regs *regs);
|
||||||
|
|
||||||
extern void do_notify_resume(struct pt_regs *regs,
|
extern void do_notify_resume(struct pt_regs *regs,
|
||||||
unsigned long orig_i0,
|
unsigned long orig_i0,
|
||||||
int restart_syscall,
|
|
||||||
unsigned long thread_info_flags);
|
unsigned long thread_info_flags);
|
||||||
|
|
||||||
extern asmlinkage void syscall_trace(struct pt_regs *regs,
|
extern asmlinkage void syscall_trace(struct pt_regs *regs,
|
||||||
|
|
|
@ -18,12 +18,6 @@
|
||||||
#define RTRAP_PSTATE_IRQOFF (PSTATE_RMO|PSTATE_PEF|PSTATE_PRIV)
|
#define RTRAP_PSTATE_IRQOFF (PSTATE_RMO|PSTATE_PEF|PSTATE_PRIV)
|
||||||
#define RTRAP_PSTATE_AG_IRQOFF (PSTATE_RMO|PSTATE_PEF|PSTATE_PRIV|PSTATE_AG)
|
#define RTRAP_PSTATE_AG_IRQOFF (PSTATE_RMO|PSTATE_PEF|PSTATE_PRIV|PSTATE_AG)
|
||||||
|
|
||||||
/* Register %l6 keeps track of whether we are returning
|
|
||||||
* from a system call or not. It is cleared if we call
|
|
||||||
* do_notify_resume, and it must not be otherwise modified
|
|
||||||
* until we fully commit to returning to userspace.
|
|
||||||
*/
|
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 32
|
.align 32
|
||||||
__handle_softirq:
|
__handle_softirq:
|
||||||
|
@ -56,14 +50,12 @@ __handle_user_windows:
|
||||||
be,pt %xcc, __handle_user_windows_continue
|
be,pt %xcc, __handle_user_windows_continue
|
||||||
nop
|
nop
|
||||||
mov %l5, %o1
|
mov %l5, %o1
|
||||||
mov %l6, %o2
|
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
mov %l0, %o3
|
mov %l0, %o2
|
||||||
|
|
||||||
call do_notify_resume
|
call do_notify_resume
|
||||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
wrpr %g0, RTRAP_PSTATE, %pstate
|
||||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
||||||
clr %l6
|
|
||||||
/* Signal delivery can modify pt_regs tstate, so we must
|
/* Signal delivery can modify pt_regs tstate, so we must
|
||||||
* reload it.
|
* reload it.
|
||||||
*/
|
*/
|
||||||
|
@ -99,14 +91,12 @@ __handle_perfctrs:
|
||||||
be,pt %xcc, __handle_perfctrs_continue
|
be,pt %xcc, __handle_perfctrs_continue
|
||||||
sethi %hi(TSTATE_PEF), %o0
|
sethi %hi(TSTATE_PEF), %o0
|
||||||
mov %l5, %o1
|
mov %l5, %o1
|
||||||
mov %l6, %o2
|
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
mov %l0, %o3
|
mov %l0, %o2
|
||||||
call do_notify_resume
|
call do_notify_resume
|
||||||
|
|
||||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
wrpr %g0, RTRAP_PSTATE, %pstate
|
||||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
||||||
clr %l6
|
|
||||||
/* Signal delivery can modify pt_regs tstate, so we must
|
/* Signal delivery can modify pt_regs tstate, so we must
|
||||||
* reload it.
|
* reload it.
|
||||||
*/
|
*/
|
||||||
|
@ -127,13 +117,11 @@ __handle_userfpu:
|
||||||
|
|
||||||
__handle_signal:
|
__handle_signal:
|
||||||
mov %l5, %o1
|
mov %l5, %o1
|
||||||
mov %l6, %o2
|
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
mov %l0, %o3
|
mov %l0, %o2
|
||||||
call do_notify_resume
|
call do_notify_resume
|
||||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
wrpr %g0, RTRAP_PSTATE, %pstate
|
||||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
||||||
clr %l6
|
|
||||||
|
|
||||||
/* Signal delivery can modify pt_regs tstate, so we must
|
/* Signal delivery can modify pt_regs tstate, so we must
|
||||||
* reload it.
|
* reload it.
|
||||||
|
@ -145,9 +133,8 @@ __handle_signal:
|
||||||
andn %l1, %l4, %l1
|
andn %l1, %l4, %l1
|
||||||
|
|
||||||
.align 64
|
.align 64
|
||||||
.globl rtrap_irq, rtrap_clr_l6, rtrap, irqsz_patchme, rtrap_xcall
|
.globl rtrap_irq, rtrap, irqsz_patchme, rtrap_xcall
|
||||||
rtrap_irq:
|
rtrap_irq:
|
||||||
rtrap_clr_l6: clr %l6
|
|
||||||
rtrap:
|
rtrap:
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
sethi %hi(per_cpu____cpu_data), %l0
|
sethi %hi(per_cpu____cpu_data), %l0
|
||||||
|
|
|
@ -580,8 +580,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, int restart_syscall,
|
void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags)
|
||||||
unsigned long thread_info_flags)
|
|
||||||
{
|
{
|
||||||
if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
|
if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
|
||||||
do_signal(regs, orig_i0);
|
do_signal(regs, orig_i0);
|
||||||
|
|
|
@ -262,7 +262,7 @@ sun4v_iacc:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call sun4v_insn_access_exception
|
call sun4v_insn_access_exception
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
/* Instruction Access Exception, tl1. */
|
/* Instruction Access Exception, tl1. */
|
||||||
sun4v_iacc_tl1:
|
sun4v_iacc_tl1:
|
||||||
|
@ -278,7 +278,7 @@ sun4v_iacc_tl1:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call sun4v_insn_access_exception_tl1
|
call sun4v_insn_access_exception_tl1
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
/* Data Access Exception, tl0. */
|
/* Data Access Exception, tl0. */
|
||||||
sun4v_dacc:
|
sun4v_dacc:
|
||||||
|
@ -294,7 +294,7 @@ sun4v_dacc:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call sun4v_data_access_exception
|
call sun4v_data_access_exception
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
/* Data Access Exception, tl1. */
|
/* Data Access Exception, tl1. */
|
||||||
sun4v_dacc_tl1:
|
sun4v_dacc_tl1:
|
||||||
|
@ -310,7 +310,7 @@ sun4v_dacc_tl1:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call sun4v_data_access_exception_tl1
|
call sun4v_data_access_exception_tl1
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
/* Memory Address Unaligned. */
|
/* Memory Address Unaligned. */
|
||||||
sun4v_mna:
|
sun4v_mna:
|
||||||
|
@ -344,7 +344,7 @@ sun4v_mna:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call sun4v_do_mna
|
call sun4v_do_mna
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
/* Privileged Action. */
|
/* Privileged Action. */
|
||||||
sun4v_privact:
|
sun4v_privact:
|
||||||
|
@ -352,7 +352,7 @@ sun4v_privact:
|
||||||
rd %pc, %g7
|
rd %pc, %g7
|
||||||
call do_privact
|
call do_privact
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
/* Unaligned ldd float, tl0. */
|
/* Unaligned ldd float, tl0. */
|
||||||
sun4v_lddfmna:
|
sun4v_lddfmna:
|
||||||
|
@ -368,7 +368,7 @@ sun4v_lddfmna:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call handle_lddfmna
|
call handle_lddfmna
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
/* Unaligned std float, tl0. */
|
/* Unaligned std float, tl0. */
|
||||||
sun4v_stdfmna:
|
sun4v_stdfmna:
|
||||||
|
@ -384,7 +384,7 @@ sun4v_stdfmna:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call handle_stdfmna
|
call handle_stdfmna
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
#define BRANCH_ALWAYS 0x10680000
|
#define BRANCH_ALWAYS 0x10680000
|
||||||
#define NOP 0x01000000
|
#define NOP 0x01000000
|
||||||
|
|
|
@ -275,7 +275,7 @@ sparc64_realfault_common:
|
||||||
stx %l5, [%g6 + TI_FAULT_ADDR] ! Save fault address
|
stx %l5, [%g6 + TI_FAULT_ADDR] ! Save fault address
|
||||||
call do_sparc64_fault ! Call fault handler
|
call do_sparc64_fault ! Call fault handler
|
||||||
add %sp, PTREGS_OFF, %o0 ! Compute pt_regs arg
|
add %sp, PTREGS_OFF, %o0 ! Compute pt_regs arg
|
||||||
ba,pt %xcc, rtrap_clr_l6 ! Restore cpu state
|
ba,pt %xcc, rtrap ! Restore cpu state
|
||||||
nop ! Delay slot (fill me)
|
nop ! Delay slot (fill me)
|
||||||
|
|
||||||
winfix_trampoline:
|
winfix_trampoline:
|
||||||
|
|
|
@ -32,7 +32,7 @@ fill_fixup:
|
||||||
rd %pc, %g7
|
rd %pc, %g7
|
||||||
call do_sparc64_fault
|
call do_sparc64_fault
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap_clr_l6
|
ba,pt %xcc, rtrap
|
||||||
nop
|
nop
|
||||||
|
|
||||||
/* Be very careful about usage of the trap globals here.
|
/* Be very careful about usage of the trap globals here.
|
||||||
|
@ -100,7 +100,7 @@ spill_fixup_dax:
|
||||||
rd %pc, %g7
|
rd %pc, %g7
|
||||||
call do_sparc64_fault
|
call do_sparc64_fault
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
winfix_mna:
|
winfix_mna:
|
||||||
andn %g3, 0x7f, %g3
|
andn %g3, 0x7f, %g3
|
||||||
|
@ -122,12 +122,12 @@ fill_fixup_mna:
|
||||||
mov %l4, %o2
|
mov %l4, %o2
|
||||||
call sun4v_do_mna
|
call sun4v_do_mna
|
||||||
mov %l5, %o1
|
mov %l5, %o1
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
1: mov %l4, %o1
|
1: mov %l4, %o1
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call mem_address_unaligned
|
call mem_address_unaligned
|
||||||
nop
|
nop
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
winfix_dax:
|
winfix_dax:
|
||||||
andn %g3, 0x7f, %g3
|
andn %g3, 0x7f, %g3
|
||||||
|
@ -150,7 +150,7 @@ fill_fixup_dax:
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
call sun4v_data_access_exception
|
call sun4v_data_access_exception
|
||||||
nop
|
nop
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
1: call spitfire_data_access_exception
|
1: call spitfire_data_access_exception
|
||||||
nop
|
nop
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
|
@ -476,7 +476,6 @@ xcall_sync_tick:
|
||||||
#endif
|
#endif
|
||||||
call smp_synchronize_tick_client
|
call smp_synchronize_tick_client
|
||||||
nop
|
nop
|
||||||
clr %l6
|
|
||||||
b rtrap_xcall
|
b rtrap_xcall
|
||||||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
||||||
|
|
||||||
|
@ -511,7 +510,6 @@ xcall_report_regs:
|
||||||
#endif
|
#endif
|
||||||
call __show_regs
|
call __show_regs
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
clr %l6
|
|
||||||
/* Has to be a non-v9 branch due to the large distance. */
|
/* Has to be a non-v9 branch due to the large distance. */
|
||||||
b rtrap_xcall
|
b rtrap_xcall
|
||||||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
||||||
|
@ -576,7 +574,7 @@ __hypervisor_tlb_xcall_error:
|
||||||
mov %l4, %o0
|
mov %l4, %o0
|
||||||
call hypervisor_tlbop_error_xcall
|
call hypervisor_tlbop_error_xcall
|
||||||
mov %l5, %o1
|
mov %l5, %o1
|
||||||
ba,a,pt %xcc, rtrap_clr_l6
|
ba,a,pt %xcc, rtrap
|
||||||
|
|
||||||
.globl __hypervisor_xcall_flush_tlb_mm
|
.globl __hypervisor_xcall_flush_tlb_mm
|
||||||
__hypervisor_xcall_flush_tlb_mm: /* 21 insns */
|
__hypervisor_xcall_flush_tlb_mm: /* 21 insns */
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
call routine; \
|
call routine; \
|
||||||
add %sp, PTREGS_OFF, %o0; \
|
add %sp, PTREGS_OFF, %o0; \
|
||||||
ba,pt %xcc, rtrap; \
|
ba,pt %xcc, rtrap; \
|
||||||
clr %l6; \
|
nop; \
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
#define TRAP_7INSNS(routine) \
|
#define TRAP_7INSNS(routine) \
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
call routine; \
|
call routine; \
|
||||||
add %sp, PTREGS_OFF, %o0; \
|
add %sp, PTREGS_OFF, %o0; \
|
||||||
ba,pt %xcc, rtrap; \
|
ba,pt %xcc, rtrap; \
|
||||||
clr %l6;
|
nop;
|
||||||
|
|
||||||
#define TRAP_SAVEFPU(routine) \
|
#define TRAP_SAVEFPU(routine) \
|
||||||
sethi %hi(109f), %g7; \
|
sethi %hi(109f), %g7; \
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
call routine; \
|
call routine; \
|
||||||
add %sp, PTREGS_OFF, %o0; \
|
add %sp, PTREGS_OFF, %o0; \
|
||||||
ba,pt %xcc, rtrap; \
|
ba,pt %xcc, rtrap; \
|
||||||
clr %l6; \
|
nop; \
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
#define TRAP_NOSAVE(routine) \
|
#define TRAP_NOSAVE(routine) \
|
||||||
|
@ -67,7 +67,7 @@
|
||||||
call routine; \
|
call routine; \
|
||||||
add %sp, PTREGS_OFF, %o0; \
|
add %sp, PTREGS_OFF, %o0; \
|
||||||
ba,pt %xcc, rtrap; \
|
ba,pt %xcc, rtrap; \
|
||||||
clr %l6; \
|
nop; \
|
||||||
nop;
|
nop;
|
||||||
|
|
||||||
#define TRAP_ARG(routine, arg) \
|
#define TRAP_ARG(routine, arg) \
|
||||||
|
@ -78,7 +78,7 @@
|
||||||
call routine; \
|
call routine; \
|
||||||
mov arg, %o1; \
|
mov arg, %o1; \
|
||||||
ba,pt %xcc, rtrap; \
|
ba,pt %xcc, rtrap; \
|
||||||
clr %l6;
|
nop;
|
||||||
|
|
||||||
#define TRAPTL1_ARG(routine, arg) \
|
#define TRAPTL1_ARG(routine, arg) \
|
||||||
sethi %hi(109f), %g7; \
|
sethi %hi(109f), %g7; \
|
||||||
|
@ -88,7 +88,7 @@
|
||||||
call routine; \
|
call routine; \
|
||||||
mov arg, %o1; \
|
mov arg, %o1; \
|
||||||
ba,pt %xcc, rtrap; \
|
ba,pt %xcc, rtrap; \
|
||||||
clr %l6;
|
nop;
|
||||||
|
|
||||||
#define SYSCALL_TRAP(routine, systbl) \
|
#define SYSCALL_TRAP(routine, systbl) \
|
||||||
sethi %hi(109f), %g7; \
|
sethi %hi(109f), %g7; \
|
||||||
|
@ -166,7 +166,7 @@
|
||||||
ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1; \
|
ldx [%sp + PTREGS_OFF + PT_V9_TNPC], %l1; \
|
||||||
add %l1, 4, %l2; \
|
add %l1, 4, %l2; \
|
||||||
stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]; \
|
stx %l1, [%sp + PTREGS_OFF + PT_V9_TPC]; \
|
||||||
ba,pt %xcc, rtrap_clr_l6; \
|
ba,pt %xcc, rtrap; \
|
||||||
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC];
|
stx %l2, [%sp + PTREGS_OFF + PT_V9_TNPC];
|
||||||
|
|
||||||
#ifdef CONFIG_KPROBES
|
#ifdef CONFIG_KPROBES
|
||||||
|
|
Загрузка…
Ссылка в новой задаче