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