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

TOMOYO Linux Cross Reference
Linux/arch/sparc/kernel/wof.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/kernel/wof.S (Version linux-6.12-rc7) and /arch/m68k/kernel/wof.S (Version linux-6.9.12)


  1 /* SPDX-License-Identifier: GPL-2.0 */            
  2 /*                                                
  3  * wof.S: Sparc window overflow handler.          
  4  *                                                
  5  * Copyright (C) 1995 David S. Miller (davem@c    
  6  */                                               
  7                                                   
  8 #include <asm/contregs.h>                         
  9 #include <asm/page.h>                             
 10 #include <asm/ptrace.h>                           
 11 #include <asm/psr.h>                              
 12 #include <asm/smp.h>                              
 13 #include <asm/asi.h>                              
 14 #include <asm/winmacro.h>                         
 15 #include <asm/asmmacro.h>                         
 16 #include <asm/thread_info.h>                      
 17                                                   
 18 /* WARNING: This routine is hairy and _very_ c    
 19  *          must be as fast as possible as it     
 20  *          of register windows to the user an    
 21  *          this code be _very_ careful as man    
 22  *          kernel depend upon how this code b    
 23  *          duly warned...                        
 24  */                                               
 25                                                   
 26 /* We define macro's for registers which have     
 27  * meaning throughout this entire routine.  Th    
 28  * the comments mean that the register can onl    
 29  * accessed when in the 'trap' window, 'G' mea    
 30  * accessible in any window.  Do not change th    
 31  * after they have been set, until you are rea    
 32  * from the trap.                                 
 33  */                                               
 34 #define t_psr       l0 /* %psr at trap time       
 35 #define t_pc        l1 /* PC for trap return      
 36 #define t_npc       l2 /* NPC for trap return     
 37 #define t_wim       l3 /* %wim at trap time       
 38 #define saved_g5    l5 /* Global save register    
 39 #define saved_g6    l6 /* Global save register    
 40 #define curptr      g6 /* Gets set to 'current    
 41                                                   
 42 /* Now registers whose values can change withi    
 43 #define twin_tmp    l4 /* Temp reg, only usabl    
 44 #define glob_tmp    g5 /* Global temporary reg    
 45                                                   
 46         .text                                     
 47         .align  4                                 
 48         /* BEGINNING OF PATCH INSTRUCTIONS */     
 49         /* On a 7-window Sparc the boot code p    
 50          * instructions with the following one    
 51          */                                       
 52         .globl  spnwin_patch1_7win, spnwin_pat    
 53 spnwin_patch1_7win:     sll     %t_wim, 6, %gl    
 54 spnwin_patch2_7win:     and     %glob_tmp, 0x7    
 55 spnwin_patch3_7win:     and     %twin_tmp, 0x7    
 56         /* END OF PATCH INSTRUCTIONS */           
 57                                                   
 58         /* The trap entry point has done the f    
 59          *                                        
 60          * rd    %psr, %l0                        
 61          * rd    %wim, %l3                        
 62          * b     spill_window_entry               
 63          * andcc %l0, PSR_PS, %g0                 
 64          */                                       
 65                                                   
 66         /* Datum current_thread_info->uwinmask    
 67          * where if any user windows are activ    
 68          * be set in to mask.  If no user wind    
 69          * will be all zeroes.                    
 70          */                                       
 71         .globl  spill_window_entry                
 72         .globl  spnwin_patch1, spnwin_patch2,     
 73 spill_window_entry:                               
 74         /* LOCATION: Trap Window */               
 75                                                   
 76         mov     %g5, %saved_g5          ! save    
 77         mov     %g6, %saved_g6          ! save    
 78                                                   
 79         /* Compute what the new %wim will be i    
 80          * window properly in this trap handle    
 81          *                                        
 82          * newwim = ((%wim>>1) | (%wim<<(nwind    
 83          */                                       
 84                 srl     %t_wim, 0x1, %twin_tmp    
 85 spnwin_patch1:  sll     %t_wim, 7, %glob_tmp      
 86                 or      %glob_tmp, %twin_tmp,     
 87 spnwin_patch2:  and     %glob_tmp, 0xff, %glob    
 88                                                   
 89         /* The trap entry point has set the co    
 90          * up for us to see if this is from us    
 91          * Get the load of 'curptr' out of the    
 92          */                                       
 93         LOAD_CURRENT(curptr, twin_tmp)            
 94                                                   
 95         andcc   %t_psr, PSR_PS, %g0               
 96         be,a    spwin_fromuser                    
 97          save   %g0, %g0, %g0                     
 98                                                   
 99         /* See if any user windows are active     
100         ld      [%curptr + TI_UWINMASK], %twin    
101         orcc    %g0, %twin_tmp, %g0               
102         bne     spwin_exist_uwins                 
103          andn   %twin_tmp, %glob_tmp, %twin_tm    
104                                                   
105         /* Save into the window which must be     
106          * Basically if we are here, this mean    
107          * from kernel mode with only kernel w    
108          * file.                                  
109          */                                       
110         save    %g0, %g0, %g0           ! save    
111         wr      %glob_tmp, 0x0, %wim    ! set     
112                                                   
113 spwin_no_userwins_from_kernel:                    
114         /* LOCATION: Window to be saved */        
115                                                   
116         STORE_WINDOW(sp)                ! stas    
117         restore %g0, %g0, %g0           ! go b    
118                                                   
119         /* LOCATION: Trap window */               
120         mov     %saved_g5, %g5          ! rest    
121         mov     %saved_g6, %g6          ! rest    
122         wr      %t_psr, 0x0, %psr       ! rest    
123         WRITE_PAUSE                     ! wast    
124         jmp     %t_pc                   ! Retu    
125         rett    %t_npc                  ! we a    
126                                                   
127 spwin_exist_uwins:                                
128         /* LOCATION: Trap window */               
129                                                   
130         /* Wow, user windows have to be dealt     
131          * and messy as all hell.  And difficu    
132          * are approaching the infamous regist    
133          * problem for the first time. DON'T L    
134          *                                        
135          * Note that how the execution path wo    
136          * will be left for us in the global t    
137          * %glob_tmp.  We cannot set the new %    
138          * need to save into the appropriate w    
139          * a trap (traps are off, we'd get a w    
140          * But first, store the new user windo    
141          * above.                                 
142          */                                       
143         st      %twin_tmp, [%curptr + TI_UWINM    
144         save    %g0, %g0, %g0           ! Go t    
145                                                   
146 spwin_fromuser:                                   
147         /* LOCATION: Window to be saved */        
148         wr      %glob_tmp, 0x0, %wim    ! Now     
149                                                   
150         /* LOCATION: Window to be saved */        
151                                                   
152         /* This instruction branches to a rout    
153          * to validity of the users stack poin    
154          * are necessary.  This means that thi    
155          * specific and thus this branch instr    
156          * be patched at boot time once the ma    
157          * This routine _shall not_ touch %cur    
158          * circumstances whatsoever!  It will     
159          * label 'spwin_good_ustack' if the st    
160          * needs to be dumped (SRMMU for insta    
161          * do this) or 'spwin_finish_up' if th    
162          * registers have already been saved.     
163          * to be bogus for some reason the rou    
164          * the label 'spwin_user_stack_is_boli    
165          * care of things at that point.          
166          */                                       
167         b       spwin_srmmu_stackchk              
168          andcc  %sp, 0x7, %g0                     
169                                                   
170 spwin_good_ustack:                                
171         /* LOCATION: Window to be saved */        
172                                                   
173         /* The users stack is ok and we can sa    
174          * %sp.                                   
175          */                                       
176         STORE_WINDOW(sp)                          
177                                                   
178 spwin_finish_up:                                  
179         restore %g0, %g0, %g0           /* Bac    
180                                                   
181         /* LOCATION: Trap window */               
182                                                   
183         /* We have spilled successfully, and w    
184          * the appropriate window onto the sta    
185          */                                       
186                                                   
187         /* Restore saved globals */               
188         mov     %saved_g5, %g5                    
189         mov     %saved_g6, %g6                    
190                                                   
191         wr      %t_psr, 0x0, %psr                 
192         WRITE_PAUSE                               
193         jmp     %t_pc                             
194         rett    %t_npc                            
195                                                   
196 spwin_user_stack_is_bolixed:                      
197         /* LOCATION: Window to be saved */        
198                                                   
199         /* Wheee, user has trashed his/her sta    
200          * how to proceed based upon whether w    
201          * or not.  If we came from kernel mod    
202          * a special buffer and proceed, the k    
203          * and we could be in an interrupt han    
204          * If we came from user land we build     
205          * c-code to gun down the process.        
206          */                                       
207         rd      %psr, %glob_tmp                   
208         andcc   %glob_tmp, PSR_PS, %g0            
209         bne     spwin_bad_ustack_from_kernel      
210          nop                                      
211                                                   
212         /* Oh well, throw this one window into    
213          * buffer, the first one.                 
214          */                                       
215         st      %sp, [%curptr + TI_RWIN_SPTRS]    
216         STORE_WINDOW(curptr + TI_REG_WINDOW)      
217         restore %g0, %g0, %g0                     
218                                                   
219         /* LOCATION: Trap Window */               
220                                                   
221         /* Back in the trap window, update win    
222         mov     1, %twin_tmp                      
223         st      %twin_tmp, [%curptr + TI_W_SAV    
224                                                   
225                 /* Compute new user window mas    
226                  * doing is taking two windows    
227                  * time and the one we attempt    
228                  * stack, and saying that ever    
229                  * window.  umask = ((~(%t_wim    
230                  */                               
231                 rd      %wim, %twin_tmp           
232                 or      %twin_tmp, %t_wim, %tw    
233                 not     %twin_tmp                 
234 spnwin_patch3:  and     %twin_tmp, 0xff, %twin    
235                 st      %twin_tmp, [%curptr +     
236                                                   
237 #define STACK_OFFSET (THREAD_SIZE - TRACEREG_S    
238                                                   
239         sethi   %hi(STACK_OFFSET), %sp            
240         or      %sp, %lo(STACK_OFFSET), %sp       
241         add     %curptr, %sp, %sp                 
242                                                   
243         /* Restore the saved globals and build    
244         mov     %saved_g5, %g5                    
245         mov     %saved_g6, %g6                    
246         STORE_PT_ALL(sp, t_psr, t_pc, t_npc, g    
247                                                   
248         sethi   %hi(STACK_OFFSET), %g6            
249         or      %g6, %lo(STACK_OFFSET), %g6       
250         sub     %sp, %g6, %g6           ! curp    
251                                                   
252         /* Turn on traps and call c-code to de    
253         wr      %t_psr, PSR_ET, %psr              
254         nop                                       
255         call    window_overflow_fault             
256          nop                                      
257                                                   
258         /* Return from trap if C-code actually    
259          * doesn't then we never get this far     
260          * be given the look of death from Com    
261          */                                       
262         b       ret_trap_entry                    
263          clr    %l6                               
264                                                   
265 spwin_bad_ustack_from_kernel:                     
266         /* LOCATION: Window to be saved */        
267                                                   
268         /* The kernel provoked a spill window     
269          * need to save is a user one and the     
270          * stack pointer.  We need to be quick    
271          * a per-process window buffer until w    
272          * this later on.                         
273          */                                       
274         SAVE_BOLIXED_USER_STACK(curptr, glob_t    
275         restore %g0, %g0, %g0                     
276                                                   
277         /* LOCATION: Trap window */               
278                                                   
279         /* Restore globals, condition codes in    
280          * return from trap.  Note, restoring     
281          * to kernel mode is not necessarily t    
282          */                                       
283         mov     %saved_g5, %g5                    
284         mov     %saved_g6, %g6                    
285                                                   
286         wr      %t_psr, 0x0, %psr                 
287         WRITE_PAUSE                               
288                                                   
289         jmp     %t_pc                             
290         rett    %t_npc                            
291                                                   
292 /* Undefine the register macros which would on    
293  * if used below.  This helps find 'stupid' co    
294  * produce 'odd' behavior.  The routines below    
295  * make usage of glob_tmp and t_psr so we leav    
296  */                                               
297 #undef twin_tmp                                   
298 #undef curptr                                     
299 #undef t_pc                                       
300 #undef t_npc                                      
301 #undef t_wim                                      
302 #undef saved_g5                                   
303 #undef saved_g6                                   
304                                                   
305 /* Now come the per-architecture window overfl    
306  * As noted above %curptr cannot be touched by    
307  */                                               
308                                                   
309         /* This is a generic SRMMU routine.  A    
310          * works for all current v8/srmmu impl    
311          * see...                                 
312          */                                       
313         .globl  spwin_srmmu_stackchk              
314 spwin_srmmu_stackchk:                             
315         /* LOCATION: Window to be saved on the    
316                                                   
317         /* Because of SMP concerns and speed w    
318          * We disable fault traps in the MMU c    
319          * Execute the stores, then check the     
320          * to see what happens.  I can hear Li    
321          * "disgusting... broken hardware...".    
322          *                                        
323          * But first, check to see if the user    
324          * up in kernel vma, then we would suc    
325          * reason... ;(  Note that the 'sethi'    
326          * kernel is page aligned, which shoul    
327          */                                       
328         /* Check results of callers andcc %sp,    
329         bne     spwin_user_stack_is_bolixed       
330          sethi   %hi(PAGE_OFFSET), %glob_tmp      
331         cmp     %glob_tmp, %sp                    
332         bleu    spwin_user_stack_is_bolixed       
333          mov    AC_M_SFSR, %glob_tmp              
334                                                   
335         /* Clear the fault status and turn on     
336 LEON_PI(lda     [%glob_tmp] ASI_LEON_MMUREGS,     
337 SUN_PI_(lda     [%glob_tmp] ASI_M_MMUREGS, %g0    
338                                                   
339 LEON_PI(lda     [%g0] ASI_LEON_MMUREGS, %glob_    
340 SUN_PI_(lda     [%g0] ASI_M_MMUREGS, %glob_tmp    
341         or      %glob_tmp, 0x2, %glob_tmp         
342 LEON_PI(sta     %glob_tmp, [%g0] ASI_LEON_MMUR    
343 SUN_PI_(sta     %glob_tmp, [%g0] ASI_M_MMUREGS    
344                                                   
345         /* Dump the registers and cross finger    
346         STORE_WINDOW(sp)                          
347                                                   
348         /* Clear the no_fault bit and check th    
349         andn    %glob_tmp, 0x2, %glob_tmp         
350 LEON_PI(sta     %glob_tmp, [%g0] ASI_LEON_MMUR    
351 SUN_PI_(sta     %glob_tmp, [%g0] ASI_M_MMUREGS    
352                                                   
353         mov     AC_M_SFAR, %glob_tmp              
354 LEON_PI(lda     [%glob_tmp] ASI_LEON_MMUREGS,     
355 SUN_PI_(lda     [%glob_tmp] ASI_M_MMUREGS, %g0    
356                                                   
357         mov     AC_M_SFSR, %glob_tmp              
358 LEON_PI(lda     [%glob_tmp] ASI_LEON_MMUREGS,     
359 SUN_PI_(lda     [%glob_tmp] ASI_M_MMUREGS, %gl    
360         andcc   %glob_tmp, 0x2, %g0               
361         be,a    spwin_finish_up + 0x4             
362          restore %g0, %g0, %g0                    
363                                                   
364         rd      %psr, %glob_tmp                   
365         b       spwin_user_stack_is_bolixed +     
366          nop                                      
                                                      

~ [ 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