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

TOMOYO Linux Cross Reference
Linux/arch/powerpc/kvm/booke_interrupts.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/powerpc/kvm/booke_interrupts.S (Architecture m68k) and /arch/mips/kvm/booke_interrupts.S (Architecture mips)


  1 /* SPDX-License-Identifier: GPL-2.0-only */       
  2 /*                                                
  3  *                                                
  4  * Copyright IBM Corp. 2007                       
  5  * Copyright 2011 Freescale Semiconductor, Inc    
  6  *                                                
  7  * Authors: Hollis Blanchard <hollisb@us.ibm.co    
  8  */                                               
  9                                                   
 10 #include <asm/ppc_asm.h>                          
 11 #include <asm/kvm_asm.h>                          
 12 #include <asm/reg.h>                              
 13 #include <asm/page.h>                             
 14 #include <asm/asm-offsets.h>                      
 15                                                   
 16 /* The host stack layout: */                      
 17 #define HOST_R1         0 /* Implied by stwu.     
 18 #define HOST_CALLEE_LR  4                         
 19 #define HOST_RUN        8                         
 20 /* r2 is special: it holds 'current', and it m    
 21  * kernel with the -ffixed-r2 gcc option. */      
 22 #define HOST_R2         12                        
 23 #define HOST_CR         16                        
 24 #define HOST_NV_GPRS    20                        
 25 #define __HOST_NV_GPR(n)  (HOST_NV_GPRS + ((n     
 26 #define HOST_NV_GPR(n)  __HOST_NV_GPR(__REG_##    
 27 #define HOST_MIN_STACK_SIZE (HOST_NV_GPR(R31)     
 28 #define HOST_STACK_SIZE (((HOST_MIN_STACK_SIZE    
 29 #define HOST_STACK_LR   (HOST_STACK_SIZE + 4)     
 30                                                   
 31 #define NEED_INST_MASK ((1<<BOOKE_INTERRUPT_PR    
 32                         (1<<BOOKE_INTERRUPT_DT    
 33                         (1<<BOOKE_INTERRUPT_DE    
 34                                                   
 35 #define NEED_DEAR_MASK ((1<<BOOKE_INTERRUPT_DA    
 36                         (1<<BOOKE_INTERRUPT_DT    
 37                         (1<<BOOKE_INTERRUPT_AL    
 38                                                   
 39 #define NEED_ESR_MASK ((1<<BOOKE_INTERRUPT_DAT    
 40                        (1<<BOOKE_INTERRUPT_INS    
 41                        (1<<BOOKE_INTERRUPT_PRO    
 42                        (1<<BOOKE_INTERRUPT_DTL    
 43                        (1<<BOOKE_INTERRUPT_ALI    
 44                                                   
 45 .macro __KVM_HANDLER ivor_nr scratch srr0         
 46         /* Get pointer to vcpu and record exit    
 47         mtspr   \scratch , r4                     
 48         mfspr   r4, SPRN_SPRG_THREAD              
 49         lwz     r4, THREAD_KVM_VCPU(r4)           
 50         stw     r3, VCPU_GPR(R3)(r4)              
 51         stw     r5, VCPU_GPR(R5)(r4)              
 52         stw     r6, VCPU_GPR(R6)(r4)              
 53         mfspr   r3, \scratch                      
 54         mfctr   r5                                
 55         stw     r3, VCPU_GPR(R4)(r4)              
 56         stw     r5, VCPU_CTR(r4)                  
 57         mfspr   r3, \srr0                         
 58         lis     r6, kvmppc_resume_host@h          
 59         stw     r3, VCPU_PC(r4)                   
 60         li      r5, \ivor_nr                      
 61         ori     r6, r6, kvmppc_resume_host@l      
 62         mtctr   r6                                
 63         bctr                                      
 64 .endm                                             
 65                                                   
 66 .macro KVM_HANDLER ivor_nr scratch srr0           
 67 _GLOBAL(kvmppc_handler_\ivor_nr)                  
 68         __KVM_HANDLER \ivor_nr \scratch \srr0     
 69 .endm                                             
 70                                                   
 71 .macro KVM_DBG_HANDLER ivor_nr scratch srr0       
 72 _GLOBAL(kvmppc_handler_\ivor_nr)                  
 73         mtspr   \scratch, r4                      
 74         mfspr   r4, SPRN_SPRG_THREAD              
 75         lwz     r4, THREAD_KVM_VCPU(r4)           
 76         stw     r3, VCPU_CRIT_SAVE(r4)            
 77         mfcr    r3                                
 78         mfspr   r4, SPRN_CSRR1                    
 79         andi.   r4, r4, MSR_PR                    
 80         bne     1f                                
 81         /* debug interrupt happened in enter/e    
 82         mfspr   r4, SPRN_CSRR1                    
 83         rlwinm  r4, r4, 0, ~MSR_DE                
 84         mtspr   SPRN_CSRR1, r4                    
 85         lis     r4, 0xffff                        
 86         ori     r4, r4, 0xffff                    
 87         mtspr   SPRN_DBSR, r4                     
 88         mfspr   r4, SPRN_SPRG_THREAD              
 89         lwz     r4, THREAD_KVM_VCPU(r4)           
 90         mtcr    r3                                
 91         lwz     r3, VCPU_CRIT_SAVE(r4)            
 92         mfspr   r4, \scratch                      
 93         rfci                                      
 94 1:      /* debug interrupt happened in guest *    
 95         mtcr    r3                                
 96         mfspr   r4, SPRN_SPRG_THREAD              
 97         lwz     r4, THREAD_KVM_VCPU(r4)           
 98         lwz     r3, VCPU_CRIT_SAVE(r4)            
 99         mfspr   r4, \scratch                      
100         __KVM_HANDLER \ivor_nr \scratch \srr0     
101 .endm                                             
102                                                   
103 .macro KVM_HANDLER_ADDR ivor_nr                   
104         .long   kvmppc_handler_\ivor_nr           
105 .endm                                             
106                                                   
107 .macro KVM_HANDLER_END                            
108         .long   kvmppc_handlers_end               
109 .endm                                             
110                                                   
111 _GLOBAL(kvmppc_handlers_start)                    
112 KVM_HANDLER BOOKE_INTERRUPT_CRITICAL SPRN_SPRG    
113 KVM_HANDLER BOOKE_INTERRUPT_MACHINE_CHECK  SPR    
114 KVM_HANDLER BOOKE_INTERRUPT_DATA_STORAGE SPRN_    
115 KVM_HANDLER BOOKE_INTERRUPT_INST_STORAGE SPRN_    
116 KVM_HANDLER BOOKE_INTERRUPT_EXTERNAL SPRN_SPRG    
117 KVM_HANDLER BOOKE_INTERRUPT_ALIGNMENT SPRN_SPR    
118 KVM_HANDLER BOOKE_INTERRUPT_PROGRAM SPRN_SPRG_    
119 KVM_HANDLER BOOKE_INTERRUPT_FP_UNAVAIL SPRN_SP    
120 KVM_HANDLER BOOKE_INTERRUPT_SYSCALL SPRN_SPRG_    
121 KVM_HANDLER BOOKE_INTERRUPT_AP_UNAVAIL SPRN_SP    
122 KVM_HANDLER BOOKE_INTERRUPT_DECREMENTER SPRN_S    
123 KVM_HANDLER BOOKE_INTERRUPT_FIT SPRN_SPRG_RSCR    
124 KVM_HANDLER BOOKE_INTERRUPT_WATCHDOG SPRN_SPRG    
125 KVM_HANDLER BOOKE_INTERRUPT_DTLB_MISS SPRN_SPR    
126 KVM_HANDLER BOOKE_INTERRUPT_ITLB_MISS SPRN_SPR    
127 KVM_DBG_HANDLER BOOKE_INTERRUPT_DEBUG SPRN_SPR    
128 KVM_HANDLER BOOKE_INTERRUPT_SPE_UNAVAIL SPRN_S    
129 KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_DATA SPRN_S    
130 KVM_HANDLER BOOKE_INTERRUPT_SPE_FP_ROUND SPRN_    
131 _GLOBAL(kvmppc_handlers_end)                      
132                                                   
133 /* Registers:                                     
134  *  SPRG_SCRATCH0: guest r4                       
135  *  r4: vcpu pointer                              
136  *  r5: KVM exit number                           
137  */                                               
138 _GLOBAL(kvmppc_resume_host)                       
139         mfcr    r3                                
140         stw     r3, VCPU_CR(r4)                   
141         stw     r7, VCPU_GPR(R7)(r4)              
142         stw     r8, VCPU_GPR(R8)(r4)              
143         stw     r9, VCPU_GPR(R9)(r4)              
144                                                   
145         li      r6, 1                             
146         slw     r6, r6, r5                        
147                                                   
148 #ifdef CONFIG_KVM_EXIT_TIMING                     
149         /* save exit time */                      
150 1:                                                
151         mfspr   r7, SPRN_TBRU                     
152         mfspr   r8, SPRN_TBRL                     
153         mfspr   r9, SPRN_TBRU                     
154         cmpw    r9, r7                            
155         bne     1b                                
156         stw     r8, VCPU_TIMING_EXIT_TBL(r4)      
157         stw     r9, VCPU_TIMING_EXIT_TBU(r4)      
158 #endif                                            
159                                                   
160         /* Save the faulting instruction and a    
161         andi.   r7, r6, NEED_INST_MASK            
162         beq     ..skip_inst_copy                  
163         mfspr   r9, SPRN_SRR0                     
164         mfmsr   r8                                
165         ori     r7, r8, MSR_DS                    
166         mtmsr   r7                                
167         isync                                     
168         lwz     r9, 0(r9)                         
169         mtmsr   r8                                
170         isync                                     
171         stw     r9, VCPU_LAST_INST(r4)            
172                                                   
173         stw     r15, VCPU_GPR(R15)(r4)            
174         stw     r16, VCPU_GPR(R16)(r4)            
175         stw     r17, VCPU_GPR(R17)(r4)            
176         stw     r18, VCPU_GPR(R18)(r4)            
177         stw     r19, VCPU_GPR(R19)(r4)            
178         stw     r20, VCPU_GPR(R20)(r4)            
179         stw     r21, VCPU_GPR(R21)(r4)            
180         stw     r22, VCPU_GPR(R22)(r4)            
181         stw     r23, VCPU_GPR(R23)(r4)            
182         stw     r24, VCPU_GPR(R24)(r4)            
183         stw     r25, VCPU_GPR(R25)(r4)            
184         stw     r26, VCPU_GPR(R26)(r4)            
185         stw     r27, VCPU_GPR(R27)(r4)            
186         stw     r28, VCPU_GPR(R28)(r4)            
187         stw     r29, VCPU_GPR(R29)(r4)            
188         stw     r30, VCPU_GPR(R30)(r4)            
189         stw     r31, VCPU_GPR(R31)(r4)            
190 ..skip_inst_copy:                                 
191                                                   
192         /* Also grab DEAR and ESR before the h    
193                                                   
194         andi.   r7, r6, NEED_DEAR_MASK            
195         beq     ..skip_dear                       
196         mfspr   r9, SPRN_DEAR                     
197         stw     r9, VCPU_FAULT_DEAR(r4)           
198 ..skip_dear:                                      
199                                                   
200         andi.   r7, r6, NEED_ESR_MASK             
201         beq     ..skip_esr                        
202         mfspr   r9, SPRN_ESR                      
203         stw     r9, VCPU_FAULT_ESR(r4)            
204 ..skip_esr:                                       
205                                                   
206         /* Save remaining volatile guest regis    
207         stw     r0, VCPU_GPR(R0)(r4)              
208         stw     r1, VCPU_GPR(R1)(r4)              
209         stw     r2, VCPU_GPR(R2)(r4)              
210         stw     r10, VCPU_GPR(R10)(r4)            
211         stw     r11, VCPU_GPR(R11)(r4)            
212         stw     r12, VCPU_GPR(R12)(r4)            
213         stw     r13, VCPU_GPR(R13)(r4)            
214         stw     r14, VCPU_GPR(R14)(r4) /* We n    
215         mflr    r3                                
216         stw     r3, VCPU_LR(r4)                   
217         mfxer   r3                                
218         stw     r3, VCPU_XER(r4)                  
219                                                   
220         /* Restore host stack pointer and PID     
221          * exception handlers use them. */        
222         lwz     r1, VCPU_HOST_STACK(r4)           
223         lwz     r3, VCPU_HOST_PID(r4)             
224         mtspr   SPRN_PID, r3                      
225                                                   
226 #ifdef CONFIG_PPC_85xx                            
227         /* we cheat and know that Linux doesn'    
228         lis     r3, 0                             
229         mtspr   SPRN_PID1, r3                     
230 #endif                                            
231                                                   
232         /* Restore host IVPR before re-enablin    
233          * that Linux IVPR is always 0xc000000    
234         lis     r3, 0xc000                        
235         mtspr   SPRN_IVPR, r3                     
236                                                   
237         /* Switch to kernel stack and jump to     
238         LOAD_REG_ADDR(r3, kvmppc_handle_exit)     
239         mtctr   r3                                
240         mr      r3, r4                            
241         lwz     r2, HOST_R2(r1)                   
242         mr      r14, r4 /* Save vcpu pointer.     
243                                                   
244         bctrl   /* kvmppc_handle_exit() */        
245                                                   
246         /* Restore vcpu pointer and the nonvol    
247         mr      r4, r14                           
248         lwz     r14, VCPU_GPR(R14)(r4)            
249                                                   
250         /* Sometimes instruction emulation mus    
251         andi.   r5, r3, RESUME_FLAG_NV            
252         beq     ..skip_nv_load                    
253         lwz     r15, VCPU_GPR(R15)(r4)            
254         lwz     r16, VCPU_GPR(R16)(r4)            
255         lwz     r17, VCPU_GPR(R17)(r4)            
256         lwz     r18, VCPU_GPR(R18)(r4)            
257         lwz     r19, VCPU_GPR(R19)(r4)            
258         lwz     r20, VCPU_GPR(R20)(r4)            
259         lwz     r21, VCPU_GPR(R21)(r4)            
260         lwz     r22, VCPU_GPR(R22)(r4)            
261         lwz     r23, VCPU_GPR(R23)(r4)            
262         lwz     r24, VCPU_GPR(R24)(r4)            
263         lwz     r25, VCPU_GPR(R25)(r4)            
264         lwz     r26, VCPU_GPR(R26)(r4)            
265         lwz     r27, VCPU_GPR(R27)(r4)            
266         lwz     r28, VCPU_GPR(R28)(r4)            
267         lwz     r29, VCPU_GPR(R29)(r4)            
268         lwz     r30, VCPU_GPR(R30)(r4)            
269         lwz     r31, VCPU_GPR(R31)(r4)            
270 ..skip_nv_load:                                   
271                                                   
272         /* Should we return to the guest? */      
273         andi.   r5, r3, RESUME_FLAG_HOST          
274         beq     lightweight_exit                  
275                                                   
276         srawi   r3, r3, 2 /* Shift -ERR back d    
277                                                   
278 heavyweight_exit:                                 
279         /* Not returning to guest. */             
280                                                   
281 #ifdef CONFIG_SPE                                 
282         /* save guest SPEFSCR and load host SP    
283         mfspr   r9, SPRN_SPEFSCR                  
284         stw     r9, VCPU_SPEFSCR(r4)              
285         lwz     r9, VCPU_HOST_SPEFSCR(r4)         
286         mtspr   SPRN_SPEFSCR, r9                  
287 #endif                                            
288                                                   
289         /* We already saved guest volatile reg    
290          * non-volatiles. */                      
291         stw     r15, VCPU_GPR(R15)(r4)            
292         stw     r16, VCPU_GPR(R16)(r4)            
293         stw     r17, VCPU_GPR(R17)(r4)            
294         stw     r18, VCPU_GPR(R18)(r4)            
295         stw     r19, VCPU_GPR(R19)(r4)            
296         stw     r20, VCPU_GPR(R20)(r4)            
297         stw     r21, VCPU_GPR(R21)(r4)            
298         stw     r22, VCPU_GPR(R22)(r4)            
299         stw     r23, VCPU_GPR(R23)(r4)            
300         stw     r24, VCPU_GPR(R24)(r4)            
301         stw     r25, VCPU_GPR(R25)(r4)            
302         stw     r26, VCPU_GPR(R26)(r4)            
303         stw     r27, VCPU_GPR(R27)(r4)            
304         stw     r28, VCPU_GPR(R28)(r4)            
305         stw     r29, VCPU_GPR(R29)(r4)            
306         stw     r30, VCPU_GPR(R30)(r4)            
307         stw     r31, VCPU_GPR(R31)(r4)            
308                                                   
309         /* Load host non-volatile register sta    
310         lwz     r14, HOST_NV_GPR(R14)(r1)         
311         lwz     r15, HOST_NV_GPR(R15)(r1)         
312         lwz     r16, HOST_NV_GPR(R16)(r1)         
313         lwz     r17, HOST_NV_GPR(R17)(r1)         
314         lwz     r18, HOST_NV_GPR(R18)(r1)         
315         lwz     r19, HOST_NV_GPR(R19)(r1)         
316         lwz     r20, HOST_NV_GPR(R20)(r1)         
317         lwz     r21, HOST_NV_GPR(R21)(r1)         
318         lwz     r22, HOST_NV_GPR(R22)(r1)         
319         lwz     r23, HOST_NV_GPR(R23)(r1)         
320         lwz     r24, HOST_NV_GPR(R24)(r1)         
321         lwz     r25, HOST_NV_GPR(R25)(r1)         
322         lwz     r26, HOST_NV_GPR(R26)(r1)         
323         lwz     r27, HOST_NV_GPR(R27)(r1)         
324         lwz     r28, HOST_NV_GPR(R28)(r1)         
325         lwz     r29, HOST_NV_GPR(R29)(r1)         
326         lwz     r30, HOST_NV_GPR(R30)(r1)         
327         lwz     r31, HOST_NV_GPR(R31)(r1)         
328                                                   
329         /* Return to kvm_vcpu_run(). */           
330         lwz     r4, HOST_STACK_LR(r1)             
331         lwz     r5, HOST_CR(r1)                   
332         addi    r1, r1, HOST_STACK_SIZE           
333         mtlr    r4                                
334         mtcr    r5                                
335         /* r3 still contains the return code f    
336         blr                                       
337                                                   
338                                                   
339 /* Registers:                                     
340  *  r3: vcpu pointer                              
341  */                                               
342 _GLOBAL(__kvmppc_vcpu_run)                        
343         stwu    r1, -HOST_STACK_SIZE(r1)          
344         stw     r1, VCPU_HOST_STACK(r3) /* Sav    
345                                                   
346         /* Save host state to stack. */           
347         mr      r4, r3                            
348         mflr    r3                                
349         stw     r3, HOST_STACK_LR(r1)             
350         mfcr    r5                                
351         stw     r5, HOST_CR(r1)                   
352                                                   
353         /* Save host non-volatile register sta    
354         stw     r14, HOST_NV_GPR(R14)(r1)         
355         stw     r15, HOST_NV_GPR(R15)(r1)         
356         stw     r16, HOST_NV_GPR(R16)(r1)         
357         stw     r17, HOST_NV_GPR(R17)(r1)         
358         stw     r18, HOST_NV_GPR(R18)(r1)         
359         stw     r19, HOST_NV_GPR(R19)(r1)         
360         stw     r20, HOST_NV_GPR(R20)(r1)         
361         stw     r21, HOST_NV_GPR(R21)(r1)         
362         stw     r22, HOST_NV_GPR(R22)(r1)         
363         stw     r23, HOST_NV_GPR(R23)(r1)         
364         stw     r24, HOST_NV_GPR(R24)(r1)         
365         stw     r25, HOST_NV_GPR(R25)(r1)         
366         stw     r26, HOST_NV_GPR(R26)(r1)         
367         stw     r27, HOST_NV_GPR(R27)(r1)         
368         stw     r28, HOST_NV_GPR(R28)(r1)         
369         stw     r29, HOST_NV_GPR(R29)(r1)         
370         stw     r30, HOST_NV_GPR(R30)(r1)         
371         stw     r31, HOST_NV_GPR(R31)(r1)         
372                                                   
373         /* Load guest non-volatiles. */           
374         lwz     r14, VCPU_GPR(R14)(r4)            
375         lwz     r15, VCPU_GPR(R15)(r4)            
376         lwz     r16, VCPU_GPR(R16)(r4)            
377         lwz     r17, VCPU_GPR(R17)(r4)            
378         lwz     r18, VCPU_GPR(R18)(r4)            
379         lwz     r19, VCPU_GPR(R19)(r4)            
380         lwz     r20, VCPU_GPR(R20)(r4)            
381         lwz     r21, VCPU_GPR(R21)(r4)            
382         lwz     r22, VCPU_GPR(R22)(r4)            
383         lwz     r23, VCPU_GPR(R23)(r4)            
384         lwz     r24, VCPU_GPR(R24)(r4)            
385         lwz     r25, VCPU_GPR(R25)(r4)            
386         lwz     r26, VCPU_GPR(R26)(r4)            
387         lwz     r27, VCPU_GPR(R27)(r4)            
388         lwz     r28, VCPU_GPR(R28)(r4)            
389         lwz     r29, VCPU_GPR(R29)(r4)            
390         lwz     r30, VCPU_GPR(R30)(r4)            
391         lwz     r31, VCPU_GPR(R31)(r4)            
392                                                   
393 #ifdef CONFIG_SPE                                 
394         /* save host SPEFSCR and load guest SP    
395         mfspr   r3, SPRN_SPEFSCR                  
396         stw     r3, VCPU_HOST_SPEFSCR(r4)         
397         lwz     r3, VCPU_SPEFSCR(r4)              
398         mtspr   SPRN_SPEFSCR, r3                  
399 #endif                                            
400                                                   
401 lightweight_exit:                                 
402         stw     r2, HOST_R2(r1)                   
403                                                   
404         mfspr   r3, SPRN_PID                      
405         stw     r3, VCPU_HOST_PID(r4)             
406         lwz     r3, VCPU_SHADOW_PID(r4)           
407         mtspr   SPRN_PID, r3                      
408                                                   
409 #ifdef CONFIG_PPC_85xx                            
410         lwz     r3, VCPU_SHADOW_PID1(r4)          
411         mtspr   SPRN_PID1, r3                     
412 #endif                                            
413                                                   
414         /* Load some guest volatiles. */          
415         lwz     r0, VCPU_GPR(R0)(r4)              
416         lwz     r2, VCPU_GPR(R2)(r4)              
417         lwz     r9, VCPU_GPR(R9)(r4)              
418         lwz     r10, VCPU_GPR(R10)(r4)            
419         lwz     r11, VCPU_GPR(R11)(r4)            
420         lwz     r12, VCPU_GPR(R12)(r4)            
421         lwz     r13, VCPU_GPR(R13)(r4)            
422         lwz     r3, VCPU_LR(r4)                   
423         mtlr    r3                                
424         lwz     r3, VCPU_XER(r4)                  
425         mtxer   r3                                
426                                                   
427         /* Switch the IVPR. XXX If we take a T    
428          * so how do we make sure vcpu won't f    
429         lis     r8, kvmppc_booke_handlers@ha      
430         lwz     r8, kvmppc_booke_handlers@l(r8    
431         mtspr   SPRN_IVPR, r8                     
432                                                   
433         lwz     r5, VCPU_SHARED(r4)               
434                                                   
435         /* Can't switch the stack pointer unti    
436          * because host interrupt handlers wou    
437         lwz     r1, VCPU_GPR(R1)(r4)              
438                                                   
439         /*                                        
440          * Host interrupt handlers may have cl    
441          * guest-readable SPRGs, or the guest     
442          * written directly to the shared area    
443          * need to reload them here with the g    
444          */                                       
445         PPC_LD(r3, VCPU_SHARED_SPRG4, r5)         
446         mtspr   SPRN_SPRG4W, r3                   
447         PPC_LD(r3, VCPU_SHARED_SPRG5, r5)         
448         mtspr   SPRN_SPRG5W, r3                   
449         PPC_LD(r3, VCPU_SHARED_SPRG6, r5)         
450         mtspr   SPRN_SPRG6W, r3                   
451         PPC_LD(r3, VCPU_SHARED_SPRG7, r5)         
452         mtspr   SPRN_SPRG7W, r3                   
453                                                   
454 #ifdef CONFIG_KVM_EXIT_TIMING                     
455         /* save enter time */                     
456 1:                                                
457         mfspr   r6, SPRN_TBRU                     
458         mfspr   r7, SPRN_TBRL                     
459         mfspr   r8, SPRN_TBRU                     
460         cmpw    r8, r6                            
461         bne     1b                                
462         stw     r7, VCPU_TIMING_LAST_ENTER_TBL    
463         stw     r8, VCPU_TIMING_LAST_ENTER_TBU    
464 #endif                                            
465                                                   
466         /* Finish loading guest volatiles and     
467         lwz     r3, VCPU_CTR(r4)                  
468         lwz     r5, VCPU_CR(r4)                   
469         lwz     r6, VCPU_PC(r4)                   
470         lwz     r7, VCPU_SHADOW_MSR(r4)           
471         mtctr   r3                                
472         mtcr    r5                                
473         mtsrr0  r6                                
474         mtsrr1  r7                                
475         lwz     r5, VCPU_GPR(R5)(r4)              
476         lwz     r6, VCPU_GPR(R6)(r4)              
477         lwz     r7, VCPU_GPR(R7)(r4)              
478         lwz     r8, VCPU_GPR(R8)(r4)              
479                                                   
480         /* Clear any debug events which occurr    
481          * XXX This gives us a 3-instruction w    
482          * intended for guest context could fi    
483         lis     r3, 0xffff                        
484         ori     r3, r3, 0xffff                    
485         mtspr   SPRN_DBSR, r3                     
486                                                   
487         lwz     r3, VCPU_GPR(R3)(r4)              
488         lwz     r4, VCPU_GPR(R4)(r4)              
489         rfi                                       
490                                                   
491         .data                                     
492         .align  4                                 
493         .globl  kvmppc_booke_handler_addr         
494 kvmppc_booke_handler_addr:                        
495 KVM_HANDLER_ADDR BOOKE_INTERRUPT_CRITICAL         
496 KVM_HANDLER_ADDR BOOKE_INTERRUPT_MACHINE_CHECK    
497 KVM_HANDLER_ADDR BOOKE_INTERRUPT_DATA_STORAGE     
498 KVM_HANDLER_ADDR BOOKE_INTERRUPT_INST_STORAGE     
499 KVM_HANDLER_ADDR BOOKE_INTERRUPT_EXTERNAL         
500 KVM_HANDLER_ADDR BOOKE_INTERRUPT_ALIGNMENT        
501 KVM_HANDLER_ADDR BOOKE_INTERRUPT_PROGRAM          
502 KVM_HANDLER_ADDR BOOKE_INTERRUPT_FP_UNAVAIL       
503 KVM_HANDLER_ADDR BOOKE_INTERRUPT_SYSCALL          
504 KVM_HANDLER_ADDR BOOKE_INTERRUPT_AP_UNAVAIL       
505 KVM_HANDLER_ADDR BOOKE_INTERRUPT_DECREMENTER      
506 KVM_HANDLER_ADDR BOOKE_INTERRUPT_FIT              
507 KVM_HANDLER_ADDR BOOKE_INTERRUPT_WATCHDOG         
508 KVM_HANDLER_ADDR BOOKE_INTERRUPT_DTLB_MISS        
509 KVM_HANDLER_ADDR BOOKE_INTERRUPT_ITLB_MISS        
510 KVM_HANDLER_ADDR BOOKE_INTERRUPT_DEBUG            
511 KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_UNAVAIL      
512 KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_DATA      
513 KVM_HANDLER_ADDR BOOKE_INTERRUPT_SPE_FP_ROUND     
514 KVM_HANDLER_END /*Always keep this in end*/       
515                                                   
516 #ifdef CONFIG_SPE                                 
517 _GLOBAL(kvmppc_save_guest_spe)                    
518         cmpi    0,r3,0                            
519         beqlr-                                    
520         SAVE_32EVRS(0, r4, r3, VCPU_EVR)          
521         evxor   evr6, evr6, evr6                  
522         evmwumiaa evr6, evr6, evr6                
523         li      r4,VCPU_ACC                       
524         evstddx evr6, r4, r3            /* sav    
525         blr                                       
526                                                   
527 _GLOBAL(kvmppc_load_guest_spe)                    
528         cmpi    0,r3,0                            
529         beqlr-                                    
530         li      r4,VCPU_ACC                       
531         evlddx  evr6,r4,r3                        
532         evmra   evr6,evr6               /* loa    
533         REST_32EVRS(0, r4, r3, VCPU_EVR)          
534         blr                                       
535 #endif                                            
                                                      

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