xref: /openbmc/linux/arch/sparc/kernel/helpers.S (revision 58e16d792a6a8c6b750f637a4649967fcac853dc)
1*457c8996SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
2a88b5ba8SSam Ravnborg	.align	32
3a88b5ba8SSam Ravnborg	.globl	__flushw_user
4a88b5ba8SSam Ravnborg	.type	__flushw_user,#function
5a88b5ba8SSam Ravnborg__flushw_user:
6a88b5ba8SSam Ravnborg	rdpr	%otherwin, %g1
7a88b5ba8SSam Ravnborg	brz,pn	%g1, 2f
8a88b5ba8SSam Ravnborg	 clr	%g2
9a88b5ba8SSam Ravnborg1:	save	%sp, -128, %sp
10a88b5ba8SSam Ravnborg	rdpr	%otherwin, %g1
11a88b5ba8SSam Ravnborg	brnz,pt	%g1, 1b
12a88b5ba8SSam Ravnborg	 add	%g2, 1, %g2
13a88b5ba8SSam Ravnborg1:	sub	%g2, 1, %g2
14a88b5ba8SSam Ravnborg	brnz,pt	%g2, 1b
15a88b5ba8SSam Ravnborg	 restore %g0, %g0, %g0
16a88b5ba8SSam Ravnborg2:	retl
17a88b5ba8SSam Ravnborg	 nop
18a88b5ba8SSam Ravnborg	.size	__flushw_user,.-__flushw_user
19d3867f04SAl ViroEXPORT_SYMBOL(__flushw_user)
20a88b5ba8SSam Ravnborg
21a88b5ba8SSam Ravnborg	/* Flush %fp and %i7 to the stack for all register
22a88b5ba8SSam Ravnborg	 * windows active inside of the cpu.  This allows
23a88b5ba8SSam Ravnborg	 * show_stack_trace() to avoid using an expensive
24a88b5ba8SSam Ravnborg	 * 'flushw'.
25a88b5ba8SSam Ravnborg	 */
26a88b5ba8SSam Ravnborg	.globl		stack_trace_flush
27a88b5ba8SSam Ravnborg	.type		stack_trace_flush,#function
28a88b5ba8SSam Ravnborgstack_trace_flush:
29a88b5ba8SSam Ravnborg	rdpr		%pstate, %o0
30a88b5ba8SSam Ravnborg	wrpr		%o0, PSTATE_IE, %pstate
31a88b5ba8SSam Ravnborg
32a88b5ba8SSam Ravnborg	rdpr		%cwp, %g1
33a88b5ba8SSam Ravnborg	rdpr		%canrestore, %g2
34a88b5ba8SSam Ravnborg	sub		%g1, 1, %g3
35a88b5ba8SSam Ravnborg
36a88b5ba8SSam Ravnborg1:	brz,pn		%g2, 2f
37a88b5ba8SSam Ravnborg	 sub		%g2, 1, %g2
38a88b5ba8SSam Ravnborg	wrpr		%g3, %cwp
39a88b5ba8SSam Ravnborg	stx		%fp, [%sp + STACK_BIAS + RW_V9_I6]
40a88b5ba8SSam Ravnborg	stx		%i7, [%sp + STACK_BIAS + RW_V9_I7]
41a88b5ba8SSam Ravnborg	ba,pt		%xcc, 1b
42a88b5ba8SSam Ravnborg	 sub		%g3, 1, %g3
43a88b5ba8SSam Ravnborg
44a88b5ba8SSam Ravnborg2:	wrpr		%g1, %cwp
45a88b5ba8SSam Ravnborg	wrpr		%o0, %pstate
46a88b5ba8SSam Ravnborg
47a88b5ba8SSam Ravnborg	retl
48a88b5ba8SSam Ravnborg	 nop
49a88b5ba8SSam Ravnborg	.size		stack_trace_flush,.-stack_trace_flush
50a88b5ba8SSam Ravnborg
51a88b5ba8SSam Ravnborg#ifdef CONFIG_SMP
52a88b5ba8SSam Ravnborg	.globl		hard_smp_processor_id
53a88b5ba8SSam Ravnborg	.type		hard_smp_processor_id,#function
54a88b5ba8SSam Ravnborghard_smp_processor_id:
55a88b5ba8SSam Ravnborg#endif
56a88b5ba8SSam Ravnborg	.globl		real_hard_smp_processor_id
57a88b5ba8SSam Ravnborg	.type		real_hard_smp_processor_id,#function
58a88b5ba8SSam Ravnborgreal_hard_smp_processor_id:
59a88b5ba8SSam Ravnborg	__GET_CPUID(%o0)
60a88b5ba8SSam Ravnborg	retl
61a88b5ba8SSam Ravnborg	 nop
62a88b5ba8SSam Ravnborg#ifdef CONFIG_SMP
63a88b5ba8SSam Ravnborg	.size		hard_smp_processor_id,.-hard_smp_processor_id
64a88b5ba8SSam Ravnborg#endif
65a88b5ba8SSam Ravnborg	.size		real_hard_smp_processor_id,.-real_hard_smp_processor_id
66d3867f04SAl ViroEXPORT_SYMBOL_GPL(real_hard_smp_processor_id)
67