~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/sparc/mm/ultra.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/sparc/mm/ultra.S (Architecture mips) and /arch/ppc/mm/ultra.S (Architecture ppc)


  1 /* SPDX-License-Identifier: GPL-2.0 */            
  2 /*                                                
  3  * ultra.S: Don't expand these all over the pl    
  4  *                                                
  5  * Copyright (C) 1997, 2000, 2008 David S. Mil    
  6  */                                               
  7                                                   
  8 #include <linux/pgtable.h>                        
  9 #include <asm/asi.h>                              
 10 #include <asm/page.h>                             
 11 #include <asm/spitfire.h>                         
 12 #include <asm/mmu_context.h>                      
 13 #include <asm/mmu.h>                              
 14 #include <asm/pil.h>                              
 15 #include <asm/head.h>                             
 16 #include <asm/thread_info.h>                      
 17 #include <asm/cacheflush.h>                       
 18 #include <asm/hypervisor.h>                       
 19 #include <asm/cpudata.h>                          
 20                                                   
 21         /* Basically, most of the Spitfire vs.    
 22          * has to do with the fact that Cheeta    
 23          * IMMU flushes out of the secondary c    
 24          * to throw a south lake birthday part    
 25          * in Microelectronics who refused to     
 26          */                                       
 27                                                   
 28         /* This file is meant to be read effic    
 29          * Staraj sie tego nikomu nie pierdoln    
 30          */                                       
 31         .text                                     
 32         .align          32                        
 33         .globl          __flush_tlb_mm            
 34 __flush_tlb_mm:         /* 19 insns */            
 35         /* %o0=(ctx & TAG_CONTEXT_BITS), %o1=S    
 36         ldxa            [%o1] ASI_DMMU, %g2       
 37         cmp             %g2, %o0                  
 38         bne,pn          %icc, __spitfire_flush    
 39          mov            0x50, %g3                 
 40         stxa            %g0, [%g3] ASI_DMMU_DE    
 41         stxa            %g0, [%g3] ASI_IMMU_DE    
 42         sethi           %hi(KERNBASE), %g3        
 43         flush           %g3                       
 44         retl                                      
 45          nop                                      
 46         nop                                       
 47         nop                                       
 48         nop                                       
 49         nop                                       
 50         nop                                       
 51         nop                                       
 52         nop                                       
 53         nop                                       
 54         nop                                       
 55                                                   
 56         .align          32                        
 57         .globl          __flush_tlb_page          
 58 __flush_tlb_page:       /* 22 insns */            
 59         /* %o0 = context, %o1 = vaddr */          
 60         rdpr            %pstate, %g7              
 61         andn            %g7, PSTATE_IE, %g2       
 62         wrpr            %g2, %pstate              
 63         mov             SECONDARY_CONTEXT, %o4    
 64         ldxa            [%o4] ASI_DMMU, %g2       
 65         stxa            %o0, [%o4] ASI_DMMU       
 66         andcc           %o1, 1, %g0               
 67         andn            %o1, 1, %o3               
 68         be,pn           %icc, 1f                  
 69          or             %o3, 0x10, %o3            
 70         stxa            %g0, [%o3] ASI_IMMU_DE    
 71 1:      stxa            %g0, [%o3] ASI_DMMU_DE    
 72         membar          #Sync                     
 73         stxa            %g2, [%o4] ASI_DMMU       
 74         sethi           %hi(KERNBASE), %o4        
 75         flush           %o4                       
 76         retl                                      
 77          wrpr           %g7, 0x0, %pstate         
 78         nop                                       
 79         nop                                       
 80         nop                                       
 81         nop                                       
 82                                                   
 83         .align          32                        
 84         .globl          __flush_tlb_pending       
 85 __flush_tlb_pending:    /* 27 insns */            
 86         /* %o0 = context, %o1 = nr, %o2 = vadd    
 87         rdpr            %pstate, %g7              
 88         sllx            %o1, 3, %o1               
 89         andn            %g7, PSTATE_IE, %g2       
 90         wrpr            %g2, %pstate              
 91         mov             SECONDARY_CONTEXT, %o4    
 92         ldxa            [%o4] ASI_DMMU, %g2       
 93         stxa            %o0, [%o4] ASI_DMMU       
 94 1:      sub             %o1, (1 << 3), %o1        
 95         ldx             [%o2 + %o1], %o3          
 96         andcc           %o3, 1, %g0               
 97         andn            %o3, 1, %o3               
 98         be,pn           %icc, 2f                  
 99          or             %o3, 0x10, %o3            
100         stxa            %g0, [%o3] ASI_IMMU_DE    
101 2:      stxa            %g0, [%o3] ASI_DMMU_DE    
102         membar          #Sync                     
103         brnz,pt         %o1, 1b                   
104          nop                                      
105         stxa            %g2, [%o4] ASI_DMMU       
106         sethi           %hi(KERNBASE), %o4        
107         flush           %o4                       
108         retl                                      
109          wrpr           %g7, 0x0, %pstate         
110         nop                                       
111         nop                                       
112         nop                                       
113         nop                                       
114                                                   
115         .align          32                        
116         .globl          __flush_tlb_kernel_ran    
117 __flush_tlb_kernel_range:       /* 31 insns */    
118         /* %o0=start, %o1=end */                  
119         cmp             %o0, %o1                  
120         be,pn           %xcc, 2f                  
121          sub            %o1, %o0, %o3             
122         srlx            %o3, 18, %o4              
123         brnz,pn         %o4, __spitfire_flush_    
124          sethi          %hi(PAGE_SIZE), %o4       
125         sub             %o3, %o4, %o3             
126         or              %o0, 0x20, %o0            
127 1:      stxa            %g0, [%o0 + %o3] ASI_D    
128         stxa            %g0, [%o0 + %o3] ASI_I    
129         membar          #Sync                     
130         brnz,pt         %o3, 1b                   
131          sub            %o3, %o4, %o3             
132 2:      sethi           %hi(KERNBASE), %o3        
133         flush           %o3                       
134         retl                                      
135          nop                                      
136         nop                                       
137         nop                                       
138         nop                                       
139         nop                                       
140         nop                                       
141         nop                                       
142         nop                                       
143         nop                                       
144         nop                                       
145         nop                                       
146         nop                                       
147         nop                                       
148         nop                                       
149         nop                                       
150                                                   
151 __spitfire_flush_tlb_kernel_range_slow:           
152         mov             63 * 8, %o4               
153 1:      ldxa            [%o4] ASI_ITLB_DATA_AC    
154         andcc           %o3, 0x40, %g0            
155         bne,pn          %xcc, 2f                  
156          mov            TLB_TAG_ACCESS, %o3       
157         stxa            %g0, [%o3] ASI_IMMU       
158         stxa            %g0, [%o4] ASI_ITLB_DA    
159         membar          #Sync                     
160 2:      ldxa            [%o4] ASI_DTLB_DATA_AC    
161         andcc           %o3, 0x40, %g0            
162         bne,pn          %xcc, 2f                  
163          mov            TLB_TAG_ACCESS, %o3       
164         stxa            %g0, [%o3] ASI_DMMU       
165         stxa            %g0, [%o4] ASI_DTLB_DA    
166         membar          #Sync                     
167 2:      sub             %o4, 8, %o4               
168         brgez,pt        %o4, 1b                   
169          nop                                      
170         retl                                      
171          nop                                      
172                                                   
173 __spitfire_flush_tlb_mm_slow:                     
174         rdpr            %pstate, %g1              
175         wrpr            %g1, PSTATE_IE, %pstat    
176         stxa            %o0, [%o1] ASI_DMMU       
177         stxa            %g0, [%g3] ASI_DMMU_DE    
178         stxa            %g0, [%g3] ASI_IMMU_DE    
179         flush           %g6                       
180         stxa            %g2, [%o1] ASI_DMMU       
181         sethi           %hi(KERNBASE), %o1        
182         flush           %o1                       
183         retl                                      
184          wrpr           %g1, 0, %pstate           
185                                                   
186 /*                                                
187  * The following code flushes one page_size wo    
188  */                                               
189         .section .kprobes.text, "ax"              
190         .align          32                        
191         .globl          __flush_icache_page       
192 __flush_icache_page:    /* %o0 = phys_page */     
193         srlx            %o0, PAGE_SHIFT, %o0      
194         sethi           %hi(PAGE_OFFSET), %g1     
195         sllx            %o0, PAGE_SHIFT, %o0      
196         sethi           %hi(PAGE_SIZE), %g2       
197         ldx             [%g1 + %lo(PAGE_OFFSET    
198         add             %o0, %g1, %o0             
199 1:      subcc           %g2, 32, %g2              
200         bne,pt          %icc, 1b                  
201          flush          %o0 + %g2                 
202         retl                                      
203          nop                                      
204                                                   
205 #ifdef DCACHE_ALIASING_POSSIBLE                   
206                                                   
207 #if (PAGE_SHIFT != 13)                            
208 #error only page shift of 13 is supported by d    
209 #endif                                            
210                                                   
211 #define DTAG_MASK 0x3                             
212                                                   
213         /* This routine is Spitfire specific s    
214          * D-cache size and line-size are OK.     
215          */                                       
216         .align          64                        
217         .globl          __flush_dcache_page       
218 __flush_dcache_page:    /* %o0=kaddr, %o1=flus    
219         sethi           %hi(PAGE_OFFSET), %g1     
220         ldx             [%g1 + %lo(PAGE_OFFSET    
221         sub             %o0, %g1, %o0             
222         srlx            %o0, 11, %o0              
223         sethi           %hi(1 << 14), %o2         
224         sub             %o2, (1 << 5), %o2        
225 1:      ldxa            [%o2] ASI_DCACHE_TAG,     
226         andcc           %o3, DTAG_MASK, %g0       
227         be,pn           %xcc, 2f                  
228          andn           %o3, DTAG_MASK, %o3       
229         cmp             %o3, %o0                  
230         bne,pt          %xcc, 2f                  
231          nop                                      
232         stxa            %g0, [%o2] ASI_DCACHE_    
233         membar          #Sync                     
234 2:      brnz,pt         %o2, 1b                   
235          sub            %o2, (1 << 5), %o2        
236                                                   
237         /* The I-cache does not snoop local st    
238          * better flush that too when necessar    
239          */                                       
240         brnz,pt         %o1, __flush_icache_pa    
241          sllx           %o0, 11, %o0              
242         retl                                      
243          nop                                      
244                                                   
245 #endif /* DCACHE_ALIASING_POSSIBLE */             
246                                                   
247         .previous                                 
248                                                   
249         /* Cheetah specific versions, patched     
250 __cheetah_flush_tlb_mm: /* 19 insns */            
251         rdpr            %pstate, %g7              
252         andn            %g7, PSTATE_IE, %g2       
253         wrpr            %g2, 0x0, %pstate         
254         wrpr            %g0, 1, %tl               
255         mov             PRIMARY_CONTEXT, %o2      
256         mov             0x40, %g3                 
257         ldxa            [%o2] ASI_DMMU, %g2       
258         srlx            %g2, CTX_PGSZ1_NUC_SHI    
259         sllx            %o1, CTX_PGSZ1_NUC_SHI    
260         or              %o0, %o1, %o0   /* Pre    
261         stxa            %o0, [%o2] ASI_DMMU       
262         stxa            %g0, [%g3] ASI_DMMU_DE    
263         stxa            %g0, [%g3] ASI_IMMU_DE    
264         stxa            %g2, [%o2] ASI_DMMU       
265         sethi           %hi(KERNBASE), %o2        
266         flush           %o2                       
267         wrpr            %g0, 0, %tl               
268         retl                                      
269          wrpr           %g7, 0x0, %pstate         
270                                                   
271 __cheetah_flush_tlb_page:       /* 22 insns */    
272         /* %o0 = context, %o1 = vaddr */          
273         rdpr            %pstate, %g7              
274         andn            %g7, PSTATE_IE, %g2       
275         wrpr            %g2, 0x0, %pstate         
276         wrpr            %g0, 1, %tl               
277         mov             PRIMARY_CONTEXT, %o4      
278         ldxa            [%o4] ASI_DMMU, %g2       
279         srlx            %g2, CTX_PGSZ1_NUC_SHI    
280         sllx            %o3, CTX_PGSZ1_NUC_SHI    
281         or              %o0, %o3, %o0   /* Pre    
282         stxa            %o0, [%o4] ASI_DMMU       
283         andcc           %o1, 1, %g0               
284         be,pn           %icc, 1f                  
285          andn           %o1, 1, %o3               
286         stxa            %g0, [%o3] ASI_IMMU_DE    
287 1:      stxa            %g0, [%o3] ASI_DMMU_DE    
288         membar          #Sync                     
289         stxa            %g2, [%o4] ASI_DMMU       
290         sethi           %hi(KERNBASE), %o4        
291         flush           %o4                       
292         wrpr            %g0, 0, %tl               
293         retl                                      
294          wrpr           %g7, 0x0, %pstate         
295                                                   
296 __cheetah_flush_tlb_pending:    /* 27 insns */    
297         /* %o0 = context, %o1 = nr, %o2 = vadd    
298         rdpr            %pstate, %g7              
299         sllx            %o1, 3, %o1               
300         andn            %g7, PSTATE_IE, %g2       
301         wrpr            %g2, 0x0, %pstate         
302         wrpr            %g0, 1, %tl               
303         mov             PRIMARY_CONTEXT, %o4      
304         ldxa            [%o4] ASI_DMMU, %g2       
305         srlx            %g2, CTX_PGSZ1_NUC_SHI    
306         sllx            %o3, CTX_PGSZ1_NUC_SHI    
307         or              %o0, %o3, %o0   /* Pre    
308         stxa            %o0, [%o4] ASI_DMMU       
309 1:      sub             %o1, (1 << 3), %o1        
310         ldx             [%o2 + %o1], %o3          
311         andcc           %o3, 1, %g0               
312         be,pn           %icc, 2f                  
313          andn           %o3, 1, %o3               
314         stxa            %g0, [%o3] ASI_IMMU_DE    
315 2:      stxa            %g0, [%o3] ASI_DMMU_DE    
316         membar          #Sync                     
317         brnz,pt         %o1, 1b                   
318          nop                                      
319         stxa            %g2, [%o4] ASI_DMMU       
320         sethi           %hi(KERNBASE), %o4        
321         flush           %o4                       
322         wrpr            %g0, 0, %tl               
323         retl                                      
324          wrpr           %g7, 0x0, %pstate         
325                                                   
326 __cheetah_flush_tlb_kernel_range:       /* 31     
327         /* %o0=start, %o1=end */                  
328         cmp             %o0, %o1                  
329         be,pn           %xcc, 2f                  
330          sub            %o1, %o0, %o3             
331         srlx            %o3, 18, %o4              
332         brnz,pn         %o4, 3f                   
333          sethi          %hi(PAGE_SIZE), %o4       
334         sub             %o3, %o4, %o3             
335         or              %o0, 0x20, %o0            
336 1:      stxa            %g0, [%o0 + %o3] ASI_D    
337         stxa            %g0, [%o0 + %o3] ASI_I    
338         membar          #Sync                     
339         brnz,pt         %o3, 1b                   
340          sub            %o3, %o4, %o3             
341 2:      sethi           %hi(KERNBASE), %o3        
342         flush           %o3                       
343         retl                                      
344          nop                                      
345 3:      mov             0x80, %o4                 
346         stxa            %g0, [%o4] ASI_DMMU_DE    
347         membar          #Sync                     
348         stxa            %g0, [%o4] ASI_IMMU_DE    
349         membar          #Sync                     
350         retl                                      
351          nop                                      
352         nop                                       
353         nop                                       
354         nop                                       
355         nop                                       
356         nop                                       
357         nop                                       
358         nop                                       
359                                                   
360 #ifdef DCACHE_ALIASING_POSSIBLE                   
361 __cheetah_flush_dcache_page: /* 11 insns */       
362         sethi           %hi(PAGE_OFFSET), %g1     
363         ldx             [%g1 + %lo(PAGE_OFFSET    
364         sub             %o0, %g1, %o0             
365         sethi           %hi(PAGE_SIZE), %o4       
366 1:      subcc           %o4, (1 << 5), %o4        
367         stxa            %g0, [%o0 + %o4] ASI_D    
368         membar          #Sync                     
369         bne,pt          %icc, 1b                  
370          nop                                      
371         retl            /* I-cache flush never    
372          nop                                      
373 #endif /* DCACHE_ALIASING_POSSIBLE */             
374                                                   
375         /* Hypervisor specific versions, patch    
376 __hypervisor_tlb_tl0_error:                       
377         save            %sp, -192, %sp            
378         mov             %i0, %o0                  
379         call            hypervisor_tlbop_error    
380          mov            %i1, %o1                  
381         ret                                       
382          restore                                  
383                                                   
384 __hypervisor_flush_tlb_mm: /* 19 insns */         
385         mov             %o0, %o2        /* ARG    
386         mov             0, %o0          /* ARG    
387         mov             0, %o1          /* ARG    
388         mov             HV_MMU_ALL, %o3 /* ARG    
389         mov             HV_FAST_MMU_DEMAP_CTX,    
390         ta              HV_FAST_TRAP              
391         brnz,pn         %o0, 1f                   
392          mov            HV_FAST_MMU_DEMAP_CTX,    
393         retl                                      
394          nop                                      
395 1:      sethi           %hi(__hypervisor_tlb_t    
396         jmpl            %o5 + %lo(__hypervisor    
397          nop                                      
398         nop                                       
399         nop                                       
400         nop                                       
401         nop                                       
402         nop                                       
403         nop                                       
404                                                   
405 __hypervisor_flush_tlb_page: /* 22 insns */       
406         /* %o0 = context, %o1 = vaddr */          
407         mov             %o0, %g2                  
408         mov             %o1, %o0                  
409         mov             %g2, %o1                  
410         mov             HV_MMU_ALL, %o2           
411         srlx            %o0, PAGE_SHIFT, %o0      
412         sllx            %o0, PAGE_SHIFT, %o0      
413         ta              HV_MMU_UNMAP_ADDR_TRAP    
414         brnz,pn         %o0, 1f                   
415          mov            HV_MMU_UNMAP_ADDR_TRAP    
416         retl                                      
417          nop                                      
418 1:      sethi           %hi(__hypervisor_tlb_t    
419         jmpl            %o2 + %lo(__hypervisor    
420          nop                                      
421         nop                                       
422         nop                                       
423         nop                                       
424         nop                                       
425         nop                                       
426         nop                                       
427         nop                                       
428         nop                                       
429                                                   
430 __hypervisor_flush_tlb_pending: /* 27 insns */    
431         /* %o0 = context, %o1 = nr, %o2 = vadd    
432         sllx            %o1, 3, %g1               
433         mov             %o2, %g2                  
434         mov             %o0, %g3                  
435 1:      sub             %g1, (1 << 3), %g1        
436         ldx             [%g2 + %g1], %o0          
437         mov             %g3, %o1                  
438         mov             HV_MMU_ALL, %o2           
439         srlx            %o0, PAGE_SHIFT, %o0      
440         sllx            %o0, PAGE_SHIFT, %o0      
441         ta              HV_MMU_UNMAP_ADDR_TRAP    
442         brnz,pn         %o0, 1f                   
443          mov            HV_MMU_UNMAP_ADDR_TRAP    
444         brnz,pt         %g1, 1b                   
445          nop                                      
446         retl                                      
447          nop                                      
448 1:      sethi           %hi(__hypervisor_tlb_t    
449         jmpl            %o2 + %lo(__hypervisor    
450          nop                                      
451         nop                                       
452         nop                                       
453         nop                                       
454         nop                                       
455         nop                                       
456         nop                                       
457         nop                                       
458         nop                                       
459                                                   
460 __hypervisor_flush_tlb_kernel_range: /* 31 ins    
461         /* %o0=start, %o1=end */                  
462         cmp             %o0, %o1                  
463         be,pn           %xcc, 2f                  
464          sub            %o1, %o0, %g2             
465         srlx            %g2, 18, %g3              
466         brnz,pn         %g3, 4f                   
467          mov            %o0, %g1                  
468         sethi           %hi(PAGE_SIZE), %g3       
469         sub             %g2, %g3, %g2             
470 1:      add             %g1, %g2, %o0   /* ARG    
471         mov             0, %o1          /* ARG    
472         mov             HV_MMU_ALL, %o2 /* ARG    
473         ta              HV_MMU_UNMAP_ADDR_TRAP    
474         brnz,pn         %o0, 3f                   
475          mov            HV_MMU_UNMAP_ADDR_TRAP    
476         brnz,pt         %g2, 1b                   
477          sub            %g2, %g3, %g2             
478 2:      retl                                      
479          nop                                      
480 3:      sethi           %hi(__hypervisor_tlb_t    
481         jmpl            %o2 + %lo(__hypervisor    
482          nop                                      
483 4:      mov             0, %o0          /* ARG    
484         mov             0, %o1          /* ARG    
485         mov             0, %o2          /* ARG    
486         mov             HV_MMU_ALL, %o3 /* ARG    
487         mov             HV_FAST_MMU_DEMAP_CTX,    
488         ta              HV_FAST_TRAP              
489         brnz,pn         %o0, 3b                   
490          mov            HV_FAST_MMU_DEMAP_CTX,    
491         retl                                      
492          nop                                      
493                                                   
494 #ifdef DCACHE_ALIASING_POSSIBLE                   
495         /* XXX Niagara and friends have an 8K     
496          * XXX possible, but nothing explicit     
497          * XXX guarantees this.                   
498          */                                       
499 __hypervisor_flush_dcache_page: /* 2 insns */     
500         retl                                      
501          nop                                      
502 #endif                                            
503                                                   
504 tlb_patch_one:                                    
505 1:      lduw            [%o1], %g1                
506         stw             %g1, [%o0]                
507         flush           %o0                       
508         subcc           %o2, 1, %o2               
509         add             %o1, 4, %o1               
510         bne,pt          %icc, 1b                  
511          add            %o0, 4, %o0               
512         retl                                      
513          nop                                      
514                                                   
515 #ifdef CONFIG_SMP                                 
516         /* These are all called by the slaves     
517          * trap level 1, with interrupts fully    
518          *                                        
519          * Register usage:                        
520          *   %g5        mm->context     (all t    
521          *   %g1        address arg 1   (tlb p    
522          *   %g7        address arg 2   (tlb r    
523          *                                        
524          *   %g6        scratch 1                 
525          *   %g2        scratch 2                 
526          *   %g3        scratch 3                 
527          *   %g4        scratch 4                 
528          */                                       
529         .align          32                        
530         .globl          xcall_flush_tlb_mm        
531 xcall_flush_tlb_mm:     /* 24 insns */            
532         mov             PRIMARY_CONTEXT, %g2      
533         ldxa            [%g2] ASI_DMMU, %g3       
534         srlx            %g3, CTX_PGSZ1_NUC_SHI    
535         sllx            %g4, CTX_PGSZ1_NUC_SHI    
536         or              %g5, %g4, %g5   /* Pre    
537         stxa            %g5, [%g2] ASI_DMMU       
538         mov             0x40, %g4                 
539         stxa            %g0, [%g4] ASI_DMMU_DE    
540         stxa            %g0, [%g4] ASI_IMMU_DE    
541         stxa            %g3, [%g2] ASI_DMMU       
542         retry                                     
543         nop                                       
544         nop                                       
545         nop                                       
546         nop                                       
547         nop                                       
548         nop                                       
549         nop                                       
550         nop                                       
551         nop                                       
552         nop                                       
553         nop                                       
554         nop                                       
555         nop                                       
556                                                   
557         .globl          xcall_flush_tlb_page      
558 xcall_flush_tlb_page:   /* 20 insns */            
559         /* %g5=context, %g1=vaddr */              
560         mov             PRIMARY_CONTEXT, %g4      
561         ldxa            [%g4] ASI_DMMU, %g2       
562         srlx            %g2, CTX_PGSZ1_NUC_SHI    
563         sllx            %g4, CTX_PGSZ1_NUC_SHI    
564         or              %g5, %g4, %g5             
565         mov             PRIMARY_CONTEXT, %g4      
566         stxa            %g5, [%g4] ASI_DMMU       
567         andcc           %g1, 0x1, %g0             
568         be,pn           %icc, 2f                  
569          andn           %g1, 0x1, %g5             
570         stxa            %g0, [%g5] ASI_IMMU_DE    
571 2:      stxa            %g0, [%g5] ASI_DMMU_DE    
572         membar          #Sync                     
573         stxa            %g2, [%g4] ASI_DMMU       
574         retry                                     
575         nop                                       
576         nop                                       
577         nop                                       
578         nop                                       
579         nop                                       
580                                                   
581         .globl          xcall_flush_tlb_kernel    
582 xcall_flush_tlb_kernel_range:   /* 44 insns */    
583         sethi           %hi(PAGE_SIZE - 1), %g    
584         or              %g2, %lo(PAGE_SIZE - 1    
585         andn            %g1, %g2, %g1             
586         andn            %g7, %g2, %g7             
587         sub             %g7, %g1, %g3             
588         srlx            %g3, 18, %g2              
589         brnz,pn         %g2, 2f                   
590          sethi          %hi(PAGE_SIZE), %g2       
591         sub             %g3, %g2, %g3             
592         or              %g1, 0x20, %g1            
593 1:      stxa            %g0, [%g1 + %g3] ASI_D    
594         stxa            %g0, [%g1 + %g3] ASI_I    
595         membar          #Sync                     
596         brnz,pt         %g3, 1b                   
597          sub            %g3, %g2, %g3             
598         retry                                     
599 2:      mov             63 * 8, %g1               
600 1:      ldxa            [%g1] ASI_ITLB_DATA_AC    
601         andcc           %g2, 0x40, %g0            
602         bne,pn          %xcc, 2f                  
603          mov            TLB_TAG_ACCESS, %g2       
604         stxa            %g0, [%g2] ASI_IMMU       
605         stxa            %g0, [%g1] ASI_ITLB_DA    
606         membar          #Sync                     
607 2:      ldxa            [%g1] ASI_DTLB_DATA_AC    
608         andcc           %g2, 0x40, %g0            
609         bne,pn          %xcc, 2f                  
610          mov            TLB_TAG_ACCESS, %g2       
611         stxa            %g0, [%g2] ASI_DMMU       
612         stxa            %g0, [%g1] ASI_DTLB_DA    
613         membar          #Sync                     
614 2:      sub             %g1, 8, %g1               
615         brgez,pt        %g1, 1b                   
616          nop                                      
617         retry                                     
618         nop                                       
619         nop                                       
620         nop                                       
621         nop                                       
622         nop                                       
623         nop                                       
624         nop                                       
625         nop                                       
626         nop                                       
627                                                   
628         /* This runs in a very controlled envi    
629          * not need to worry about BH races et    
630          */                                       
631         .globl          xcall_sync_tick           
632 xcall_sync_tick:                                  
633                                                   
634 661:    rdpr            %pstate, %g2              
635         wrpr            %g2, PSTATE_IG | PSTAT    
636         .section        .sun4v_2insn_patch, "a    
637         .word           661b                      
638         nop                                       
639         nop                                       
640         .previous                                 
641                                                   
642         rdpr            %pil, %g2                 
643         wrpr            %g0, PIL_NORMAL_MAX, %    
644         sethi           %hi(109f), %g7            
645         b,pt            %xcc, etrap_irq           
646 109:     or             %g7, %lo(109b), %g7       
647 #ifdef CONFIG_TRACE_IRQFLAGS                      
648         call            trace_hardirqs_off        
649          nop                                      
650 #endif                                            
651         call            smp_synchronize_tick_c    
652          nop                                      
653         b               rtrap_xcall               
654          ldx            [%sp + PTREGS_OFF + PT    
655                                                   
656         .globl          xcall_fetch_glob_regs     
657 xcall_fetch_glob_regs:                            
658         sethi           %hi(global_cpu_snapsho    
659         or              %g1, %lo(global_cpu_sn    
660         __GET_CPUID(%g2)                          
661         sllx            %g2, 6, %g3               
662         add             %g1, %g3, %g1             
663         rdpr            %tstate, %g7              
664         stx             %g7, [%g1 + GR_SNAP_TS    
665         rdpr            %tpc, %g7                 
666         stx             %g7, [%g1 + GR_SNAP_TP    
667         rdpr            %tnpc, %g7                
668         stx             %g7, [%g1 + GR_SNAP_TN    
669         stx             %o7, [%g1 + GR_SNAP_O7    
670         stx             %i7, [%g1 + GR_SNAP_I7    
671         /* Don't try this at home kids... */      
672         rdpr            %cwp, %g3                 
673         sub             %g3, 1, %g7               
674         wrpr            %g7, %cwp                 
675         mov             %i7, %g7                  
676         wrpr            %g3, %cwp                 
677         stx             %g7, [%g1 + GR_SNAP_RP    
678         sethi           %hi(trap_block), %g7      
679         or              %g7, %lo(trap_block),     
680         sllx            %g2, TRAP_BLOCK_SZ_SHI    
681         add             %g7, %g2, %g7             
682         ldx             [%g7 + TRAP_PER_CPU_TH    
683         stx             %g3, [%g1 + GR_SNAP_TH    
684         retry                                     
685                                                   
686         .globl          xcall_fetch_glob_pmu      
687 xcall_fetch_glob_pmu:                             
688         sethi           %hi(global_cpu_snapsho    
689         or              %g1, %lo(global_cpu_sn    
690         __GET_CPUID(%g2)                          
691         sllx            %g2, 6, %g3               
692         add             %g1, %g3, %g1             
693         rd              %pic, %g7                 
694         stx             %g7, [%g1 + (4 * 8)]      
695         rd              %pcr, %g7                 
696         stx             %g7, [%g1 + (0 * 8)]      
697         retry                                     
698                                                   
699         .globl          xcall_fetch_glob_pmu_n    
700 xcall_fetch_glob_pmu_n4:                          
701         sethi           %hi(global_cpu_snapsho    
702         or              %g1, %lo(global_cpu_sn    
703         __GET_CPUID(%g2)                          
704         sllx            %g2, 6, %g3               
705         add             %g1, %g3, %g1             
706                                                   
707         ldxa            [%g0] ASI_PIC, %g7        
708         stx             %g7, [%g1 + (4 * 8)]      
709         mov             0x08, %g3                 
710         ldxa            [%g3] ASI_PIC, %g7        
711         stx             %g7, [%g1 + (5 * 8)]      
712         mov             0x10, %g3                 
713         ldxa            [%g3] ASI_PIC, %g7        
714         stx             %g7, [%g1 + (6 * 8)]      
715         mov             0x18, %g3                 
716         ldxa            [%g3] ASI_PIC, %g7        
717         stx             %g7, [%g1 + (7 * 8)]      
718                                                   
719         mov             %o0, %g2                  
720         mov             %o1, %g3                  
721         mov             %o5, %g7                  
722                                                   
723         mov             HV_FAST_VT_GET_PERFREG    
724         mov             3, %o0                    
725         ta              HV_FAST_TRAP              
726         stx             %o1, [%g1 + (3 * 8)]      
727         mov             HV_FAST_VT_GET_PERFREG    
728         mov             2, %o0                    
729         ta              HV_FAST_TRAP              
730         stx             %o1, [%g1 + (2 * 8)]      
731         mov             HV_FAST_VT_GET_PERFREG    
732         mov             1, %o0                    
733         ta              HV_FAST_TRAP              
734         stx             %o1, [%g1 + (1 * 8)]      
735         mov             HV_FAST_VT_GET_PERFREG    
736         mov             0, %o0                    
737         ta              HV_FAST_TRAP              
738         stx             %o1, [%g1 + (0 * 8)]      
739                                                   
740         mov             %g2, %o0                  
741         mov             %g3, %o1                  
742         mov             %g7, %o5                  
743                                                   
744         retry                                     
745                                                   
746 __cheetah_xcall_flush_tlb_kernel_range: /* 44     
747         sethi           %hi(PAGE_SIZE - 1), %g    
748         or              %g2, %lo(PAGE_SIZE - 1    
749         andn            %g1, %g2, %g1             
750         andn            %g7, %g2, %g7             
751         sub             %g7, %g1, %g3             
752         srlx            %g3, 18, %g2              
753         brnz,pn         %g2, 2f                   
754          sethi          %hi(PAGE_SIZE), %g2       
755         sub             %g3, %g2, %g3             
756         or              %g1, 0x20, %g1            
757 1:      stxa            %g0, [%g1 + %g3] ASI_D    
758         stxa            %g0, [%g1 + %g3] ASI_I    
759         membar          #Sync                     
760         brnz,pt         %g3, 1b                   
761          sub            %g3, %g2, %g3             
762         retry                                     
763 2:      mov             0x80, %g2                 
764         stxa            %g0, [%g2] ASI_DMMU_DE    
765         membar          #Sync                     
766         stxa            %g0, [%g2] ASI_IMMU_DE    
767         membar          #Sync                     
768         retry                                     
769         nop                                       
770         nop                                       
771         nop                                       
772         nop                                       
773         nop                                       
774         nop                                       
775         nop                                       
776         nop                                       
777         nop                                       
778         nop                                       
779         nop                                       
780         nop                                       
781         nop                                       
782         nop                                       
783         nop                                       
784         nop                                       
785         nop                                       
786         nop                                       
787         nop                                       
788         nop                                       
789         nop                                       
790         nop                                       
791                                                   
792 #ifdef DCACHE_ALIASING_POSSIBLE                   
793         .align          32                        
794         .globl          xcall_flush_dcache_pag    
795 xcall_flush_dcache_page_cheetah: /* %g1 == phy    
796         sethi           %hi(PAGE_SIZE), %g3       
797 1:      subcc           %g3, (1 << 5), %g3        
798         stxa            %g0, [%g1 + %g3] ASI_D    
799         membar          #Sync                     
800         bne,pt          %icc, 1b                  
801          nop                                      
802         retry                                     
803         nop                                       
804 #endif /* DCACHE_ALIASING_POSSIBLE */             
805                                                   
806         .globl          xcall_flush_dcache_pag    
807 xcall_flush_dcache_page_spitfire: /* %g1 == ph    
808                                      %g7 == ke    
809                                      %g5 == (p    
810 #ifdef DCACHE_ALIASING_POSSIBLE                   
811         srlx            %g1, (13 - 2), %g1        
812         sethi           %hi(L1DCACHE_SIZE), %g    
813         sub             %g3, (1 << 5), %g3        
814 1:      ldxa            [%g3] ASI_DCACHE_TAG,     
815         andcc           %g2, 0x3, %g0             
816         be,pn           %xcc, 2f                  
817          andn           %g2, 0x3, %g2             
818         cmp             %g2, %g1                  
819                                                   
820         bne,pt          %xcc, 2f                  
821          nop                                      
822         stxa            %g0, [%g3] ASI_DCACHE_    
823         membar          #Sync                     
824 2:      cmp             %g3, 0                    
825         bne,pt          %xcc, 1b                  
826          sub            %g3, (1 << 5), %g3        
827                                                   
828         brz,pn          %g5, 2f                   
829 #endif /* DCACHE_ALIASING_POSSIBLE */             
830          sethi          %hi(PAGE_SIZE), %g3       
831                                                   
832 1:      flush           %g7                       
833         subcc           %g3, (1 << 5), %g3        
834         bne,pt          %icc, 1b                  
835          add            %g7, (1 << 5), %g7        
836                                                   
837 2:      retry                                     
838         nop                                       
839         nop                                       
840                                                   
841         /* %g5: error                             
842          * %g6: tlb op                            
843          */                                       
844 __hypervisor_tlb_xcall_error:                     
845         mov     %g5, %g4                          
846         mov     %g6, %g5                          
847         ba,pt   %xcc, etrap                       
848          rd     %pc, %g7                          
849         mov     %l4, %o0                          
850         call    hypervisor_tlbop_error_xcall      
851          mov    %l5, %o1                          
852         ba,a,pt %xcc, rtrap                       
853                                                   
854         .globl          __hypervisor_xcall_flu    
855 __hypervisor_xcall_flush_tlb_mm: /* 24 insns *    
856         /* %g5=ctx, g1,g2,g3,g4,g7=scratch, %g    
857         mov             %o0, %g2                  
858         mov             %o1, %g3                  
859         mov             %o2, %g4                  
860         mov             %o3, %g1                  
861         mov             %o5, %g7                  
862         clr             %o0             /* ARG    
863         clr             %o1             /* ARG    
864         mov             %g5, %o2        /* ARG    
865         mov             HV_MMU_ALL, %o3 /* ARG    
866         mov             HV_FAST_MMU_DEMAP_CTX,    
867         ta              HV_FAST_TRAP              
868         mov             HV_FAST_MMU_DEMAP_CTX,    
869         brnz,pn         %o0, 1f                   
870          mov            %o0, %g5                  
871         mov             %g2, %o0                  
872         mov             %g3, %o1                  
873         mov             %g4, %o2                  
874         mov             %g1, %o3                  
875         mov             %g7, %o5                  
876         membar          #Sync                     
877         retry                                     
878 1:      sethi           %hi(__hypervisor_tlb_x    
879         jmpl            %g4 + %lo(__hypervisor    
880          nop                                      
881                                                   
882         .globl          __hypervisor_xcall_flu    
883 __hypervisor_xcall_flush_tlb_page: /* 20 insns    
884         /* %g5=ctx, %g1=vaddr */                  
885         mov             %o0, %g2                  
886         mov             %o1, %g3                  
887         mov             %o2, %g4                  
888         mov             %g1, %o0                  
889         mov             %g5, %o1                  
890         mov             HV_MMU_ALL, %o2           
891         srlx            %o0, PAGE_SHIFT, %o0      
892         sllx            %o0, PAGE_SHIFT, %o0      
893         ta              HV_MMU_UNMAP_ADDR_TRAP    
894         mov             HV_MMU_UNMAP_ADDR_TRAP    
895         brnz,a,pn       %o0, 1f                   
896          mov            %o0, %g5                  
897         mov             %g2, %o0                  
898         mov             %g3, %o1                  
899         mov             %g4, %o2                  
900         membar          #Sync                     
901         retry                                     
902 1:      sethi           %hi(__hypervisor_tlb_x    
903         jmpl            %g4 + %lo(__hypervisor    
904          nop                                      
905                                                   
906         .globl          __hypervisor_xcall_flu    
907 __hypervisor_xcall_flush_tlb_kernel_range: /*     
908         /* %g1=start, %g7=end, g2,g3,g4,g5,g6=    
909         sethi           %hi(PAGE_SIZE - 1), %g    
910         or              %g2, %lo(PAGE_SIZE - 1    
911         andn            %g1, %g2, %g1             
912         andn            %g7, %g2, %g7             
913         sub             %g7, %g1, %g3             
914         srlx            %g3, 18, %g7              
915         add             %g2, 1, %g2               
916         sub             %g3, %g2, %g3             
917         mov             %o0, %g2                  
918         mov             %o1, %g4                  
919         brnz,pn         %g7, 2f                   
920          mov            %o2, %g7                  
921 1:      add             %g1, %g3, %o0   /* ARG    
922         mov             0, %o1          /* ARG    
923         mov             HV_MMU_ALL, %o2 /* ARG    
924         ta              HV_MMU_UNMAP_ADDR_TRAP    
925         mov             HV_MMU_UNMAP_ADDR_TRAP    
926         brnz,pn         %o0, 1f                   
927          mov            %o0, %g5                  
928         sethi           %hi(PAGE_SIZE), %o2       
929         brnz,pt         %g3, 1b                   
930          sub            %g3, %o2, %g3             
931 5:      mov             %g2, %o0                  
932         mov             %g4, %o1                  
933         mov             %g7, %o2                  
934         membar          #Sync                     
935         retry                                     
936 1:      sethi           %hi(__hypervisor_tlb_x    
937         jmpl            %g4 + %lo(__hypervisor    
938          nop                                      
939 2:      mov             %o3, %g1                  
940         mov             %o5, %g3                  
941         mov             0, %o0          /* ARG    
942         mov             0, %o1          /* ARG    
943         mov             0, %o2          /* ARG    
944         mov             HV_MMU_ALL, %o3 /* ARG    
945         mov             HV_FAST_MMU_DEMAP_CTX,    
946         ta              HV_FAST_TRAP              
947         mov             %g1, %o3                  
948         brz,pt          %o0, 5b                   
949          mov            %g3, %o5                  
950         mov             HV_FAST_MMU_DEMAP_CTX,    
951         ba,pt           %xcc, 1b                  
952          clr            %g5                       
953                                                   
954         /* These just get rescheduled to PIL v    
955         .globl          xcall_call_function       
956 xcall_call_function:                              
957         wr              %g0, (1 << PIL_SMP_CAL    
958         retry                                     
959                                                   
960         .globl          xcall_call_function_si    
961 xcall_call_function_single:                       
962         wr              %g0, (1 << PIL_SMP_CAL    
963         retry                                     
964                                                   
965         .globl          xcall_receive_signal      
966 xcall_receive_signal:                             
967         wr              %g0, (1 << PIL_SMP_REC    
968         retry                                     
969                                                   
970         .globl          xcall_capture             
971 xcall_capture:                                    
972         wr              %g0, (1 << PIL_SMP_CAP    
973         retry                                     
974                                                   
975 #ifdef CONFIG_KGDB                                
976         .globl          xcall_kgdb_capture        
977 xcall_kgdb_capture:                               
978         wr              %g0, (1 << PIL_KGDB_CA    
979         retry                                     
980 #endif                                            
981                                                   
982 #endif /* CONFIG_SMP */                           
983                                                   
984         .globl          cheetah_patch_cachetlb    
985 cheetah_patch_cachetlbops:                        
986         save            %sp, -128, %sp            
987                                                   
988         sethi           %hi(__flush_tlb_mm), %    
989         or              %o0, %lo(__flush_tlb_m    
990         sethi           %hi(__cheetah_flush_tl    
991         or              %o1, %lo(__cheetah_flu    
992         call            tlb_patch_one             
993          mov            19, %o2                   
994                                                   
995         sethi           %hi(__flush_tlb_page),    
996         or              %o0, %lo(__flush_tlb_p    
997         sethi           %hi(__cheetah_flush_tl    
998         or              %o1, %lo(__cheetah_flu    
999         call            tlb_patch_one             
1000          mov            22, %o2                  
1001                                                  
1002         sethi           %hi(__flush_tlb_pendi    
1003         or              %o0, %lo(__flush_tlb_    
1004         sethi           %hi(__cheetah_flush_t    
1005         or              %o1, %lo(__cheetah_fl    
1006         call            tlb_patch_one            
1007          mov            27, %o2                  
1008                                                  
1009         sethi           %hi(__flush_tlb_kerne    
1010         or              %o0, %lo(__flush_tlb_    
1011         sethi           %hi(__cheetah_flush_t    
1012         or              %o1, %lo(__cheetah_fl    
1013         call            tlb_patch_one            
1014          mov            31, %o2                  
1015                                                  
1016 #ifdef DCACHE_ALIASING_POSSIBLE                  
1017         sethi           %hi(__flush_dcache_pa    
1018         or              %o0, %lo(__flush_dcac    
1019         sethi           %hi(__cheetah_flush_d    
1020         or              %o1, %lo(__cheetah_fl    
1021         call            tlb_patch_one            
1022          mov            11, %o2                  
1023 #endif /* DCACHE_ALIASING_POSSIBLE */            
1024                                                  
1025 #ifdef CONFIG_SMP                                
1026         sethi           %hi(xcall_flush_tlb_k    
1027         or              %o0, %lo(xcall_flush_    
1028         sethi           %hi(__cheetah_xcall_f    
1029         or              %o1, %lo(__cheetah_xc    
1030         call            tlb_patch_one            
1031          mov            44, %o2                  
1032 #endif /* CONFIG_SMP */                          
1033                                                  
1034         ret                                      
1035          restore                                 
1036                                                  
1037         .globl          hypervisor_patch_cach    
1038 hypervisor_patch_cachetlbops:                    
1039         save            %sp, -128, %sp           
1040                                                  
1041         sethi           %hi(__flush_tlb_mm),     
1042         or              %o0, %lo(__flush_tlb_    
1043         sethi           %hi(__hypervisor_flus    
1044         or              %o1, %lo(__hypervisor    
1045         call            tlb_patch_one            
1046          mov            19, %o2                  
1047                                                  
1048         sethi           %hi(__flush_tlb_page)    
1049         or              %o0, %lo(__flush_tlb_    
1050         sethi           %hi(__hypervisor_flus    
1051         or              %o1, %lo(__hypervisor    
1052         call            tlb_patch_one            
1053          mov            22, %o2                  
1054                                                  
1055         sethi           %hi(__flush_tlb_pendi    
1056         or              %o0, %lo(__flush_tlb_    
1057         sethi           %hi(__hypervisor_flus    
1058         or              %o1, %lo(__hypervisor    
1059         call            tlb_patch_one            
1060          mov            27, %o2                  
1061                                                  
1062         sethi           %hi(__flush_tlb_kerne    
1063         or              %o0, %lo(__flush_tlb_    
1064         sethi           %hi(__hypervisor_flus    
1065         or              %o1, %lo(__hypervisor    
1066         call            tlb_patch_one            
1067          mov            31, %o2                  
1068                                                  
1069 #ifdef DCACHE_ALIASING_POSSIBLE                  
1070         sethi           %hi(__flush_dcache_pa    
1071         or              %o0, %lo(__flush_dcac    
1072         sethi           %hi(__hypervisor_flus    
1073         or              %o1, %lo(__hypervisor    
1074         call            tlb_patch_one            
1075          mov            2, %o2                   
1076 #endif /* DCACHE_ALIASING_POSSIBLE */            
1077                                                  
1078 #ifdef CONFIG_SMP                                
1079         sethi           %hi(xcall_flush_tlb_m    
1080         or              %o0, %lo(xcall_flush_    
1081         sethi           %hi(__hypervisor_xcal    
1082         or              %o1, %lo(__hypervisor    
1083         call            tlb_patch_one            
1084          mov            24, %o2                  
1085                                                  
1086         sethi           %hi(xcall_flush_tlb_p    
1087         or              %o0, %lo(xcall_flush_    
1088         sethi           %hi(__hypervisor_xcal    
1089         or              %o1, %lo(__hypervisor    
1090         call            tlb_patch_one            
1091          mov            20, %o2                  
1092                                                  
1093         sethi           %hi(xcall_flush_tlb_k    
1094         or              %o0, %lo(xcall_flush_    
1095         sethi           %hi(__hypervisor_xcal    
1096         or              %o1, %lo(__hypervisor    
1097         call            tlb_patch_one            
1098          mov            44, %o2                  
1099 #endif /* CONFIG_SMP */                          
1100                                                  
1101         ret                                      
1102          restore                                 
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php