2008-04-28 09:47:20 +02:00
|
|
|
.align 32
|
|
|
|
.globl __flushw_user
|
|
|
|
.type __flushw_user,#function
|
|
|
|
__flushw_user:
|
|
|
|
rdpr %otherwin, %g1
|
|
|
|
brz,pn %g1, 2f
|
|
|
|
clr %g2
|
|
|
|
1: save %sp, -128, %sp
|
|
|
|
rdpr %otherwin, %g1
|
|
|
|
brnz,pt %g1, 1b
|
|
|
|
add %g2, 1, %g2
|
|
|
|
1: sub %g2, 1, %g2
|
|
|
|
brnz,pt %g2, 1b
|
|
|
|
restore %g0, %g0, %g0
|
|
|
|
2: retl
|
|
|
|
nop
|
|
|
|
.size __flushw_user,.-__flushw_user
|
2016-01-17 03:39:30 +01:00
|
|
|
EXPORT_SYMBOL(__flushw_user)
|
2008-04-28 09:47:20 +02:00
|
|
|
|
|
|
|
/* Flush %fp and %i7 to the stack for all register
|
|
|
|
* windows active inside of the cpu. This allows
|
|
|
|
* show_stack_trace() to avoid using an expensive
|
|
|
|
* 'flushw'.
|
|
|
|
*/
|
|
|
|
.globl stack_trace_flush
|
|
|
|
.type stack_trace_flush,#function
|
|
|
|
stack_trace_flush:
|
|
|
|
rdpr %pstate, %o0
|
|
|
|
wrpr %o0, PSTATE_IE, %pstate
|
|
|
|
|
|
|
|
rdpr %cwp, %g1
|
|
|
|
rdpr %canrestore, %g2
|
|
|
|
sub %g1, 1, %g3
|
|
|
|
|
|
|
|
1: brz,pn %g2, 2f
|
|
|
|
sub %g2, 1, %g2
|
|
|
|
wrpr %g3, %cwp
|
|
|
|
stx %fp, [%sp + STACK_BIAS + RW_V9_I6]
|
|
|
|
stx %i7, [%sp + STACK_BIAS + RW_V9_I7]
|
|
|
|
ba,pt %xcc, 1b
|
|
|
|
sub %g3, 1, %g3
|
|
|
|
|
|
|
|
2: wrpr %g1, %cwp
|
|
|
|
wrpr %o0, %pstate
|
|
|
|
|
|
|
|
retl
|
|
|
|
nop
|
|
|
|
.size stack_trace_flush,.-stack_trace_flush
|
|
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
.globl hard_smp_processor_id
|
|
|
|
.type hard_smp_processor_id,#function
|
|
|
|
hard_smp_processor_id:
|
|
|
|
#endif
|
|
|
|
.globl real_hard_smp_processor_id
|
|
|
|
.type real_hard_smp_processor_id,#function
|
|
|
|
real_hard_smp_processor_id:
|
|
|
|
__GET_CPUID(%o0)
|
|
|
|
retl
|
|
|
|
nop
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
.size hard_smp_processor_id,.-hard_smp_processor_id
|
|
|
|
#endif
|
|
|
|
.size real_hard_smp_processor_id,.-real_hard_smp_processor_id
|
2016-01-17 03:39:30 +01:00
|
|
|
EXPORT_SYMBOL_GPL(real_hard_smp_processor_id)
|