18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci	.align	32
38c2ecf20Sopenharmony_ci	.globl	__flushw_user
48c2ecf20Sopenharmony_ci	.type	__flushw_user,#function
58c2ecf20Sopenharmony_ci__flushw_user:
68c2ecf20Sopenharmony_ci	rdpr	%otherwin, %g1
78c2ecf20Sopenharmony_ci	brz,pn	%g1, 2f
88c2ecf20Sopenharmony_ci	 clr	%g2
98c2ecf20Sopenharmony_ci1:	save	%sp, -128, %sp
108c2ecf20Sopenharmony_ci	rdpr	%otherwin, %g1
118c2ecf20Sopenharmony_ci	brnz,pt	%g1, 1b
128c2ecf20Sopenharmony_ci	 add	%g2, 1, %g2
138c2ecf20Sopenharmony_ci1:	sub	%g2, 1, %g2
148c2ecf20Sopenharmony_ci	brnz,pt	%g2, 1b
158c2ecf20Sopenharmony_ci	 restore %g0, %g0, %g0
168c2ecf20Sopenharmony_ci2:	retl
178c2ecf20Sopenharmony_ci	 nop
188c2ecf20Sopenharmony_ci	.size	__flushw_user,.-__flushw_user
198c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__flushw_user)
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	/* Flush %fp and %i7 to the stack for all register
228c2ecf20Sopenharmony_ci	 * windows active inside of the cpu.  This allows
238c2ecf20Sopenharmony_ci	 * show_stack_trace() to avoid using an expensive
248c2ecf20Sopenharmony_ci	 * 'flushw'.
258c2ecf20Sopenharmony_ci	 */
268c2ecf20Sopenharmony_ci	.globl		stack_trace_flush
278c2ecf20Sopenharmony_ci	.type		stack_trace_flush,#function
288c2ecf20Sopenharmony_cistack_trace_flush:
298c2ecf20Sopenharmony_ci	rdpr		%pstate, %o0
308c2ecf20Sopenharmony_ci	wrpr		%o0, PSTATE_IE, %pstate
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	rdpr		%cwp, %g1
338c2ecf20Sopenharmony_ci	rdpr		%canrestore, %g2
348c2ecf20Sopenharmony_ci	sub		%g1, 1, %g3
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci1:	brz,pn		%g2, 2f
378c2ecf20Sopenharmony_ci	 sub		%g2, 1, %g2
388c2ecf20Sopenharmony_ci	wrpr		%g3, %cwp
398c2ecf20Sopenharmony_ci	stx		%fp, [%sp + STACK_BIAS + RW_V9_I6]
408c2ecf20Sopenharmony_ci	stx		%i7, [%sp + STACK_BIAS + RW_V9_I7]
418c2ecf20Sopenharmony_ci	ba,pt		%xcc, 1b
428c2ecf20Sopenharmony_ci	 sub		%g3, 1, %g3
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci2:	wrpr		%g1, %cwp
458c2ecf20Sopenharmony_ci	wrpr		%o0, %pstate
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	retl
488c2ecf20Sopenharmony_ci	 nop
498c2ecf20Sopenharmony_ci	.size		stack_trace_flush,.-stack_trace_flush
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
528c2ecf20Sopenharmony_ci	.globl		hard_smp_processor_id
538c2ecf20Sopenharmony_ci	.type		hard_smp_processor_id,#function
548c2ecf20Sopenharmony_cihard_smp_processor_id:
558c2ecf20Sopenharmony_ci#endif
568c2ecf20Sopenharmony_ci	.globl		real_hard_smp_processor_id
578c2ecf20Sopenharmony_ci	.type		real_hard_smp_processor_id,#function
588c2ecf20Sopenharmony_cireal_hard_smp_processor_id:
598c2ecf20Sopenharmony_ci	__GET_CPUID(%o0)
608c2ecf20Sopenharmony_ci	retl
618c2ecf20Sopenharmony_ci	 nop
628c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
638c2ecf20Sopenharmony_ci	.size		hard_smp_processor_id,.-hard_smp_processor_id
648c2ecf20Sopenharmony_ci#endif
658c2ecf20Sopenharmony_ci	.size		real_hard_smp_processor_id,.-real_hard_smp_processor_id
668c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(real_hard_smp_processor_id)
67