summaryrefslogtreecommitdiffstats
path: root/arch/sparc64/mm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64/mm')
-rw-r--r--arch/sparc64/mm/ultra.S20
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/sparc64/mm/ultra.S b/arch/sparc64/mm/ultra.S
index 90cc898ff..e954b24c8 100644
--- a/arch/sparc64/mm/ultra.S
+++ b/arch/sparc64/mm/ultra.S
@@ -432,4 +432,24 @@ xcall_flush_cache_all:
nop
flush %g6
retry
+
+ .globl xcall_call_function
+xcall_call_function:
+ mov TLB_TAG_ACCESS, %g5 ! wheee...
+ stxa %g1, [%g5] ASI_IMMU ! save call_data here for a bit
+ membar #Sync
+ rdpr %pstate, %g2
+ wrpr %g2, PSTATE_IG | PSTATE_AG, %pstate
+ mov TLB_TAG_ACCESS, %g2
+ ldxa [%g2] ASI_IMMU, %g5
+ rdpr %pil, %g2
+ wrpr %g0, 15, %pil
+ sethi %hi(109f), %g7
+ b,pt %xcc, etrap_irq
+109: or %g7, %lo(109b), %g7
+ call smp_call_function_client
+ mov %l5, %o0
+ b,pt %xcc, rtrap
+ clr %l6
+
#endif /* CONFIG_SMP */