VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / arch / sparc64 / mm / ultra.S
1 /* $Id: ultra.S,v 1.72 2002/02/09 19:49:31 davem Exp $
2  * ultra.S: Don't expand these all over the place...
3  *
4  * Copyright (C) 1997, 2000 David S. Miller (davem@redhat.com)
5  */
6
7 #include <linux/config.h>
8 #include <asm/asi.h>
9 #include <asm/pgtable.h>
10 #include <asm/page.h>
11 #include <asm/spitfire.h>
12 #include <asm/mmu_context.h>
13 #include <asm/pil.h>
14 #include <asm/head.h>
15 #include <asm/thread_info.h>
16
17         /* Basically, most of the Spitfire vs. Cheetah madness
18          * has to do with the fact that Cheetah does not support
19          * IMMU flushes out of the secondary context.  Someone needs
20          * to throw a south lake birthday party for the folks
21          * in Microelectronics who refused to fix this shit.
22          */
23
24         /* This file is meant to be read efficiently by the CPU, not humans.
25          * Staraj sie tego nikomu nie pierdolnac...
26          */
27         .text
28         .align          32
29         .globl          __flush_tlb_mm
30 __flush_tlb_mm: /* %o0=(ctx & TAG_CONTEXT_BITS), %o1=SECONDARY_CONTEXT */
31         ldxa            [%o1] ASI_DMMU, %g2
32         cmp             %g2, %o0
33         bne,pn          %icc, __spitfire_flush_tlb_mm_slow
34          mov            0x50, %g3
35         stxa            %g0, [%g3] ASI_DMMU_DEMAP
36         stxa            %g0, [%g3] ASI_IMMU_DEMAP
37         retl
38          flush          %g6
39         nop
40         nop
41         nop
42         nop
43         nop
44         nop
45         nop
46         nop
47
48         .align          32
49         .globl          __flush_tlb_pending
50 __flush_tlb_pending:
51         /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
52         rdpr            %pstate, %g5
53         sllx            %o1, 3, %o1
54         andn            %g5, PSTATE_IE, %g2
55         wrpr            %g2, %pstate
56         mov             SECONDARY_CONTEXT, %o4
57         ldxa            [%o4] ASI_DMMU, %g2
58         stxa            %o0, [%o4] ASI_DMMU
59 1:      sub             %o1, (1 << 3), %o1
60         ldx             [%o2 + %o1], %o3
61         andcc           %o3, 1, %g0
62         andn            %o3, 1, %o3
63         be,pn           %icc, 2f
64          or             %o3, 0x10, %o3
65         stxa            %g0, [%o3] ASI_IMMU_DEMAP
66 2:      stxa            %g0, [%o3] ASI_DMMU_DEMAP
67         membar          #Sync
68         brnz,pt         %o1, 1b
69          nop
70         stxa            %g2, [%o4] ASI_DMMU
71         flush           %g6
72         retl
73          wrpr           %g5, 0x0, %pstate
74
75         .align          32
76         .globl          __flush_tlb_kernel_range
77 __flush_tlb_kernel_range:       /* %o0=start, %o1=end */
78         cmp             %o0, %o1
79         be,pn           %xcc, 2f
80          sethi          %hi(PAGE_SIZE), %o4
81         sub             %o1, %o0, %o3
82         sub             %o3, %o4, %o3
83         or              %o0, 0x20, %o0          ! Nucleus
84 1:      stxa            %g0, [%o0 + %o3] ASI_DMMU_DEMAP
85         stxa            %g0, [%o0 + %o3] ASI_IMMU_DEMAP
86         membar          #Sync
87         brnz,pt         %o3, 1b
88          sub            %o3, %o4, %o3
89 2:      retl
90          flush          %g6
91
92 __spitfire_flush_tlb_mm_slow:
93         rdpr            %pstate, %g1
94         wrpr            %g1, PSTATE_IE, %pstate
95         stxa            %o0, [%o1] ASI_DMMU
96         stxa            %g0, [%g3] ASI_DMMU_DEMAP
97         stxa            %g0, [%g3] ASI_IMMU_DEMAP
98         flush           %g6
99         stxa            %g2, [%o1] ASI_DMMU
100         flush           %g6
101         retl
102          wrpr           %g1, 0, %pstate
103
104 /*
105  * The following code flushes one page_size worth.
106  */
107 #if (PAGE_SHIFT == 13)
108 #define ITAG_MASK 0xfe
109 #elif (PAGE_SHIFT == 16)
110 #define ITAG_MASK 0x7fe
111 #else
112 #error unsupported PAGE_SIZE
113 #endif
114         .align          32
115         .globl          __flush_icache_page
116 __flush_icache_page:    /* %o0 = phys_page */
117         sethi           %hi(1 << 13), %o2       ! IC_set bit
118         mov             1, %g1
119         srlx            %o0, 5, %o0
120         clr             %o1                     ! IC_addr
121         sllx            %g1, 36, %g1
122         ldda            [%o1] ASI_IC_TAG, %o4
123         sub             %g1, 1, %g2
124         or              %o0, %g1, %o0           ! VALID+phys-addr comparitor
125
126         sllx            %g2, 1, %g2
127         andn            %g2, ITAG_MASK, %g2     ! IC_tag mask
128         nop
129         nop
130         nop
131         nop
132         nop
133         nop
134
135 1:      addx            %g0, %g0, %g0
136         ldda            [%o1 + %o2] ASI_IC_TAG, %g4
137         addx            %g0, %g0, %g0
138         and             %o5, %g2, %g3
139         cmp             %g3, %o0
140         add             %o1, 0x20, %o1
141         ldda            [%o1] ASI_IC_TAG, %o4
142         be,pn           %xcc, iflush1
143
144 2:       nop
145         and             %g5, %g2, %g5
146         cmp             %g5, %o0
147         be,pn           %xcc, iflush2
148 3:       cmp            %o1, %o2
149         bne,pt          %xcc, 1b
150          addx           %g0, %g0, %g0
151         nop
152
153         retl
154          ldx            [%g6 + TI_TASK], %g4
155
156 iflush1:sub             %o1, 0x20, %g3
157         stxa            %g0, [%g3] ASI_IC_TAG
158         flush           %g6
159         ba,a,pt         %xcc, 2b
160 iflush2:sub             %o1, 0x20, %g3
161         stxa            %g0, [%o1 + %o2] ASI_IC_TAG
162         flush           %g6
163         ba,a,pt         %xcc, 3b
164
165 #if (PAGE_SHIFT == 13)
166 #define DTAG_MASK 0x3
167 #elif (PAGE_SHIFT == 16)
168 #define DTAG_MASK 0x1f
169 #elif (PAGE_SHIFT == 19)
170 #define DTAG_MASK 0xff
171 #elif (PAGE_SHIFT == 22)
172 #define DTAG_MASK 0x3ff
173 #endif
174
175         .align          64
176         .globl          __flush_dcache_page
177 __flush_dcache_page:    /* %o0=kaddr, %o1=flush_icache */
178         sethi           %uhi(PAGE_OFFSET), %g1
179         sllx            %g1, 32, %g1
180         sub             %o0, %g1, %o0
181         clr             %o4
182         srlx            %o0, 11, %o0
183         sethi           %hi(1 << 14), %o2
184 1:      ldxa            [%o4] ASI_DCACHE_TAG, %o3       ! LSU   Group
185         add             %o4, (1 << 5), %o4              ! IEU0
186         ldxa            [%o4] ASI_DCACHE_TAG, %g1       ! LSU   Group
187         add             %o4, (1 << 5), %o4              ! IEU0
188         ldxa            [%o4] ASI_DCACHE_TAG, %g2       ! LSU   Group   o3 available
189         add             %o4, (1 << 5), %o4              ! IEU0
190         andn            %o3, DTAG_MASK, %o3             ! IEU1
191         ldxa            [%o4] ASI_DCACHE_TAG, %g3       ! LSU   Group
192         add             %o4, (1 << 5), %o4              ! IEU0
193         andn            %g1, DTAG_MASK, %g1             ! IEU1
194         cmp             %o0, %o3                        ! IEU1  Group
195         be,a,pn         %xcc, dflush1                   ! CTI
196          sub            %o4, (4 << 5), %o4              ! IEU0  (Group)
197         cmp             %o0, %g1                        ! IEU1  Group
198         andn            %g2, DTAG_MASK, %g2             ! IEU0
199         be,a,pn         %xcc, dflush2                   ! CTI
200          sub            %o4, (3 << 5), %o4              ! IEU0  (Group)
201         cmp             %o0, %g2                        ! IEU1  Group
202         andn            %g3, DTAG_MASK, %g3             ! IEU0
203         be,a,pn         %xcc, dflush3                   ! CTI
204          sub            %o4, (2 << 5), %o4              ! IEU0  (Group)
205         cmp             %o0, %g3                        ! IEU1  Group
206         be,a,pn         %xcc, dflush4                   ! CTI
207          sub            %o4, (1 << 5), %o4              ! IEU0
208 2:      cmp             %o4, %o2                        ! IEU1  Group
209         bne,pt          %xcc, 1b                        ! CTI
210          nop                                            ! IEU0
211
212         /* The I-cache does not snoop local stores so we
213          * better flush that too when necessary.
214          */
215         brnz,pt         %o1, __flush_icache_page
216          sllx           %o0, 11, %o0
217         retl
218          nop
219
220 dflush1:stxa            %g0, [%o4] ASI_DCACHE_TAG
221         add             %o4, (1 << 5), %o4
222 dflush2:stxa            %g0, [%o4] ASI_DCACHE_TAG
223         add             %o4, (1 << 5), %o4
224 dflush3:stxa            %g0, [%o4] ASI_DCACHE_TAG
225         add             %o4, (1 << 5), %o4
226 dflush4:stxa            %g0, [%o4] ASI_DCACHE_TAG
227         add             %o4, (1 << 5), %o4
228         membar          #Sync
229         ba,pt           %xcc, 2b
230          nop
231
232         .align          32
233 __prefill_dtlb:
234         rdpr            %pstate, %g7
235         wrpr            %g7, PSTATE_IE, %pstate
236         mov             TLB_TAG_ACCESS, %g1
237         stxa            %o5, [%g1] ASI_DMMU
238         stxa            %o2, [%g0] ASI_DTLB_DATA_IN
239         flush           %g6
240         retl
241          wrpr           %g7, %pstate
242 __prefill_itlb:
243         rdpr            %pstate, %g7
244         wrpr            %g7, PSTATE_IE, %pstate
245         mov             TLB_TAG_ACCESS, %g1
246         stxa            %o5, [%g1] ASI_IMMU
247         stxa            %o2, [%g0] ASI_ITLB_DATA_IN
248         flush           %g6
249         retl
250          wrpr           %g7, %pstate
251
252         .globl          __update_mmu_cache
253 __update_mmu_cache:     /* %o0=hw_context, %o1=address, %o2=pte, %o3=fault_code */
254         srlx            %o1, PAGE_SHIFT, %o1
255         andcc           %o3, FAULT_CODE_DTLB, %g0
256         sllx            %o1, PAGE_SHIFT, %o5
257         bne,pt          %xcc, __prefill_dtlb
258          or             %o5, %o0, %o5
259         ba,a,pt         %xcc, __prefill_itlb
260
261         /* Cheetah specific versions, patched at boot time.  */
262 __cheetah_flush_tlb_mm: /* 15 insns */
263         rdpr            %pstate, %g5
264         andn            %g5, PSTATE_IE, %g2
265         wrpr            %g2, 0x0, %pstate
266         wrpr            %g0, 1, %tl
267         mov             PRIMARY_CONTEXT, %o2
268         mov             0x40, %g3
269         ldxa            [%o2] ASI_DMMU, %g2
270         stxa            %o0, [%o2] ASI_DMMU
271         stxa            %g0, [%g3] ASI_DMMU_DEMAP
272         stxa            %g0, [%g3] ASI_IMMU_DEMAP
273         stxa            %g2, [%o2] ASI_DMMU
274         flush           %g6
275         wrpr            %g0, 0, %tl
276         retl
277          wrpr           %g5, 0x0, %pstate
278
279 __cheetah_flush_tlb_pending:    /* 22 insns */
280         /* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
281         rdpr            %pstate, %g5
282         sllx            %o1, 3, %o1
283         andn            %g5, PSTATE_IE, %g2
284         wrpr            %g2, 0x0, %pstate
285         wrpr            %g0, 1, %tl
286         mov             PRIMARY_CONTEXT, %o4
287         ldxa            [%o4] ASI_DMMU, %g2
288         stxa            %o0, [%o4] ASI_DMMU
289 1:      sub             %o1, (1 << 3), %o1
290         ldx             [%o2 + %o1], %o3
291         andcc           %o3, 1, %g0
292         be,pn           %icc, 2f
293          andn           %o3, 1, %o3
294         stxa            %g0, [%o3] ASI_IMMU_DEMAP
295 2:      stxa            %g0, [%o3] ASI_DMMU_DEMAP       
296         brnz,pt         %o1, 1b
297          membar         #Sync
298         stxa            %g2, [%o4] ASI_DMMU
299         flush           %g6
300         wrpr            %g0, 0, %tl
301         retl
302          wrpr           %g5, 0x0, %pstate
303
304 flush_dcpage_cheetah: /* 11 insns */
305         sethi           %uhi(PAGE_OFFSET), %g1
306         sllx            %g1, 32, %g1
307         sub             %o0, %g1, %o0
308         sethi           %hi(PAGE_SIZE), %o4
309 1:      subcc           %o4, (1 << 5), %o4
310         stxa            %g0, [%o0 + %o4] ASI_DCACHE_INVALIDATE
311         membar          #Sync
312         bne,pt          %icc, 1b
313          nop
314         retl            /* I-cache flush never needed on Cheetah, see callers. */
315          nop
316
317 cheetah_patch_one:
318 1:      lduw            [%o1], %g1
319         stw             %g1, [%o0]
320         flush           %o0
321         subcc           %o2, 1, %o2
322         add             %o1, 4, %o1
323         bne,pt          %icc, 1b
324          add            %o0, 4, %o0
325         retl
326          nop
327
328         .globl          cheetah_patch_cachetlbops
329 cheetah_patch_cachetlbops:
330         save            %sp, -128, %sp
331
332         sethi           %hi(__flush_tlb_mm), %o0
333         or              %o0, %lo(__flush_tlb_mm), %o0
334         sethi           %hi(__cheetah_flush_tlb_mm), %o1
335         or              %o1, %lo(__cheetah_flush_tlb_mm), %o1
336         call            cheetah_patch_one
337          mov            15, %o2
338
339         sethi           %hi(__flush_tlb_pending), %o0
340         or              %o0, %lo(__flush_tlb_pending), %o0
341         sethi           %hi(__cheetah_flush_tlb_pending), %o1
342         or              %o1, %lo(__cheetah_flush_tlb_pending), %o1
343         call            cheetah_patch_one
344          mov            22, %o2
345
346         sethi           %hi(__flush_dcache_page), %o0
347         or              %o0, %lo(__flush_dcache_page), %o0
348         sethi           %hi(flush_dcpage_cheetah), %o1
349         or              %o1, %lo(flush_dcpage_cheetah), %o1
350         call            cheetah_patch_one
351          mov            11, %o2
352
353         ret
354          restore
355
356 #ifdef CONFIG_SMP
357         /* These are all called by the slaves of a cross call, at
358          * trap level 1, with interrupts fully disabled.
359          *
360          * Register usage:
361          *   %g5        mm->context     (all tlb flushes)
362          *   %g1        address arg 1   (tlb page and range flushes)
363          *   %g7        address arg 2   (tlb range flush only)
364          *
365          *   %g6        ivector table, don't touch
366          *   %g2        scratch 1
367          *   %g3        scratch 2
368          *   %g4        scratch 3
369          *
370          * TODO: Make xcall TLB range flushes use the tricks above... -DaveM
371          */
372         .align          32
373         .globl          xcall_flush_tlb_mm
374 xcall_flush_tlb_mm:
375         mov             PRIMARY_CONTEXT, %g2
376         mov             0x40, %g4
377         ldxa            [%g2] ASI_DMMU, %g3
378         stxa            %g5, [%g2] ASI_DMMU
379         stxa            %g0, [%g4] ASI_DMMU_DEMAP
380         stxa            %g0, [%g4] ASI_IMMU_DEMAP
381         stxa            %g3, [%g2] ASI_DMMU
382         retry
383
384         .globl          xcall_flush_tlb_pending
385 xcall_flush_tlb_pending:
386         /* %g5=context, %g1=nr, %g7=vaddrs[] */
387         sllx            %g1, 3, %g1
388         mov             PRIMARY_CONTEXT, %g4
389         ldxa            [%g4] ASI_DMMU, %g2
390         stxa            %g5, [%g4] ASI_DMMU
391 1:      sub             %g1, (1 << 3), %g1
392         ldx             [%g7 + %g1], %g5
393         andcc           %g5, 0x1, %g0
394         be,pn           %icc, 2f
395
396          andn           %g5, 0x1, %g5
397         stxa            %g0, [%g5] ASI_IMMU_DEMAP
398 2:      stxa            %g0, [%g5] ASI_DMMU_DEMAP
399         membar          #Sync
400         brnz,pt         %g1, 1b
401          nop
402         stxa            %g2, [%g4] ASI_DMMU
403         retry
404
405         .globl          xcall_flush_tlb_kernel_range
406 xcall_flush_tlb_kernel_range:
407         sethi           %hi(PAGE_SIZE - 1), %g2
408         or              %g2, %lo(PAGE_SIZE - 1), %g2
409         andn            %g1, %g2, %g1
410         andn            %g7, %g2, %g7
411         sub             %g7, %g1, %g3
412         add             %g2, 1, %g2
413         sub             %g3, %g2, %g3
414         or              %g1, 0x20, %g1          ! Nucleus
415 1:      stxa            %g0, [%g1 + %g3] ASI_DMMU_DEMAP
416         stxa            %g0, [%g1 + %g3] ASI_IMMU_DEMAP
417         membar          #Sync
418         brnz,pt         %g3, 1b
419          sub            %g3, %g2, %g3
420         retry
421         nop
422         nop
423
424         /* This runs in a very controlled environment, so we do
425          * not need to worry about BH races etc.
426          */
427         .globl          xcall_sync_tick
428 xcall_sync_tick:
429         rdpr            %pstate, %g2
430         wrpr            %g2, PSTATE_IG | PSTATE_AG, %pstate
431         rdpr            %pil, %g2
432         wrpr            %g0, 15, %pil
433         sethi           %hi(109f), %g7
434         b,pt            %xcc, etrap_irq
435 109:     or             %g7, %lo(109b), %g7
436         call            smp_synchronize_tick_client
437          nop
438         clr             %l6
439         b               rtrap_xcall
440          ldx            [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
441
442         /* NOTE: This is SPECIAL!!  We do etrap/rtrap however
443          *       we choose to deal with the "BH's run with
444          *       %pil==15" problem (described in asm/pil.h)
445          *       by just invoking rtrap directly past where
446          *       BH's are checked for.
447          *
448          *       We do it like this because we do not want %pil==15
449          *       lockups to prevent regs being reported.
450          */
451         .globl          xcall_report_regs
452 xcall_report_regs:
453         rdpr            %pstate, %g2
454         wrpr            %g2, PSTATE_IG | PSTATE_AG, %pstate
455         rdpr            %pil, %g2
456         wrpr            %g0, 15, %pil
457         sethi           %hi(109f), %g7
458         b,pt            %xcc, etrap_irq
459 109:     or             %g7, %lo(109b), %g7
460         call            __show_regs
461          add            %sp, PTREGS_OFF, %o0
462         clr             %l6
463         /* Has to be a non-v9 branch due to the large distance. */
464         b               rtrap_xcall
465          ldx            [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
466
467         .align          32
468         .globl          xcall_flush_dcache_page_cheetah
469 xcall_flush_dcache_page_cheetah: /* %g1 == physical page address */
470         sethi           %hi(PAGE_SIZE), %g3
471 1:      subcc           %g3, (1 << 5), %g3
472         stxa            %g0, [%g1 + %g3] ASI_DCACHE_INVALIDATE
473         membar          #Sync
474         bne,pt          %icc, 1b
475          nop
476         retry
477         nop
478
479         .globl          xcall_flush_dcache_page_spitfire
480 xcall_flush_dcache_page_spitfire: /* %g1 == physical page address
481                                      %g7 == kernel page virtual address
482                                      %g5 == (page->mapping != NULL)  */
483 #if (L1DCACHE_SIZE > PAGE_SIZE)
484         srlx            %g1, (13 - 2), %g1      ! Form tag comparitor
485         sethi           %hi(L1DCACHE_SIZE), %g3 ! D$ size == 16K
486         sub             %g3, (1 << 5), %g3      ! D$ linesize == 32
487 1:      ldxa            [%g3] ASI_DCACHE_TAG, %g2
488         andcc           %g2, 0x3, %g0
489         be,pn           %xcc, 2f
490          andn           %g2, 0x3, %g2
491         cmp             %g2, %g1
492
493         bne,pt          %xcc, 2f
494          nop
495         stxa            %g0, [%g3] ASI_DCACHE_TAG
496         membar          #Sync
497 2:      cmp             %g3, 0
498         bne,pt          %xcc, 1b
499          sub            %g3, (1 << 5), %g3
500
501         brz,pn          %g5, 2f
502 #endif /* L1DCACHE_SIZE > PAGE_SIZE */
503          sethi          %hi(PAGE_SIZE), %g3
504
505 1:      flush           %g7
506         subcc           %g3, (1 << 5), %g3
507         bne,pt          %icc, 1b
508          add            %g7, (1 << 5), %g7
509
510 2:      retry
511         nop
512         nop
513
514         .globl          xcall_promstop
515 xcall_promstop:
516         rdpr            %pstate, %g2
517         wrpr            %g2, PSTATE_IG | PSTATE_AG, %pstate
518         rdpr            %pil, %g2
519         wrpr            %g0, 15, %pil
520         sethi           %hi(109f), %g7
521         b,pt            %xcc, etrap_irq
522 109:     or             %g7, %lo(109b), %g7
523         flushw
524         call            prom_stopself
525          nop
526         /* We should not return, just spin if we do... */
527 1:      b,a,pt          %xcc, 1b
528         nop
529
530         .data
531
532 errata32_hwbug:
533         .xword  0
534
535         .text
536
537         /* These two are not performance critical... */
538         .globl          xcall_flush_tlb_all_spitfire
539 xcall_flush_tlb_all_spitfire:
540         /* Spitfire Errata #32 workaround. */
541         sethi           %hi(errata32_hwbug), %g4
542         stx             %g0, [%g4 + %lo(errata32_hwbug)]
543
544         clr             %g2
545         clr             %g3
546 1:      ldxa            [%g3] ASI_DTLB_DATA_ACCESS, %g4
547         and             %g4, _PAGE_L, %g5
548         brnz,pn         %g5, 2f
549          mov            TLB_TAG_ACCESS, %g7
550
551         stxa            %g0, [%g7] ASI_DMMU
552         membar          #Sync
553         stxa            %g0, [%g3] ASI_DTLB_DATA_ACCESS
554         membar          #Sync
555
556         /* Spitfire Errata #32 workaround. */
557         sethi           %hi(errata32_hwbug), %g4
558         stx             %g0, [%g4 + %lo(errata32_hwbug)]
559
560 2:      ldxa            [%g3] ASI_ITLB_DATA_ACCESS, %g4
561         and             %g4, _PAGE_L, %g5
562         brnz,pn         %g5, 2f
563          mov            TLB_TAG_ACCESS, %g7
564
565         stxa            %g0, [%g7] ASI_IMMU
566         membar          #Sync
567         stxa            %g0, [%g3] ASI_ITLB_DATA_ACCESS
568         membar          #Sync
569
570         /* Spitfire Errata #32 workaround. */
571         sethi           %hi(errata32_hwbug), %g4
572         stx             %g0, [%g4 + %lo(errata32_hwbug)]
573
574 2:      add             %g2, 1, %g2
575         cmp             %g2, SPITFIRE_HIGHEST_LOCKED_TLBENT
576         ble,pt          %icc, 1b
577          sll            %g2, 3, %g3
578         flush           %g6
579         retry
580
581         .globl          xcall_flush_tlb_all_cheetah
582 xcall_flush_tlb_all_cheetah:
583         mov             0x80, %g2
584         stxa            %g0, [%g2] ASI_DMMU_DEMAP
585         stxa            %g0, [%g2] ASI_IMMU_DEMAP
586         retry
587
588         /* These just get rescheduled to PIL vectors. */
589         .globl          xcall_call_function
590 xcall_call_function:
591         wr              %g0, (1 << PIL_SMP_CALL_FUNC), %set_softint
592         retry
593
594         .globl          xcall_receive_signal
595 xcall_receive_signal:
596         wr              %g0, (1 << PIL_SMP_RECEIVE_SIGNAL), %set_softint
597         retry
598
599         .globl          xcall_capture
600 xcall_capture:
601         wr              %g0, (1 << PIL_SMP_CAPTURE), %set_softint
602         retry
603
604 #endif /* CONFIG_SMP */