diff options
Diffstat (limited to 'arch/sparc64/kernel/entry.S')
| -rw-r--r-- | arch/sparc64/kernel/entry.S | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index 6be4d2d2904e..49eca4b1cf25 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
| @@ -1705,6 +1705,36 @@ __flushw_user: | |||
| 1705 | 2: retl | 1705 | 2: retl |
| 1706 | nop | 1706 | nop |
| 1707 | 1707 | ||
| 1708 | /* Flush %fp and %i7 to the stack for all register | ||
| 1709 | * windows active inside of the cpu. This allows | ||
| 1710 | * show_stack_trace() to avoid using an expensive | ||
| 1711 | * 'flushw'. | ||
| 1712 | */ | ||
| 1713 | .globl stack_trace_flush | ||
| 1714 | .type stack_trace_flush,#function | ||
| 1715 | stack_trace_flush: | ||
| 1716 | rdpr %pstate, %o0 | ||
| 1717 | wrpr %o0, PSTATE_IE, %pstate | ||
| 1718 | |||
| 1719 | rdpr %cwp, %g1 | ||
| 1720 | rdpr %canrestore, %g2 | ||
| 1721 | sub %g1, 1, %g3 | ||
| 1722 | |||
| 1723 | 1: brz,pn %g2, 2f | ||
| 1724 | sub %g2, 1, %g2 | ||
| 1725 | wrpr %g3, %cwp | ||
| 1726 | stx %fp, [%sp + STACK_BIAS + RW_V9_I6] | ||
| 1727 | stx %i7, [%sp + STACK_BIAS + RW_V9_I7] | ||
| 1728 | ba,pt %xcc, 1b | ||
| 1729 | sub %g3, 1, %g3 | ||
| 1730 | |||
| 1731 | 2: wrpr %g1, %cwp | ||
| 1732 | wrpr %o0, %pstate | ||
| 1733 | |||
| 1734 | retl | ||
| 1735 | nop | ||
| 1736 | .size stack_trace_flush,.-stack_trace_flush | ||
| 1737 | |||
| 1708 | #ifdef CONFIG_SMP | 1738 | #ifdef CONFIG_SMP |
| 1709 | .globl hard_smp_processor_id | 1739 | .globl hard_smp_processor_id |
| 1710 | hard_smp_processor_id: | 1740 | hard_smp_processor_id: |
