]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - arch/powerpc/kvm/book3s_segment.S
Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[mirror_ubuntu-bionic-kernel.git] / arch / powerpc / kvm / book3s_segment.S
index ca8f174289bb43a148bdd9159f71ca645e0c416a..2a2b96d5399917398312dacb7c7b2846483a7fd4 100644 (file)
@@ -167,20 +167,38 @@ kvmppc_handler_trampoline_enter_end:
  *                                                                            *
  *****************************************************************************/
 
-.global kvmppc_handler_trampoline_exit
-kvmppc_handler_trampoline_exit:
-
 .global kvmppc_interrupt_pr
 kvmppc_interrupt_pr:
+       /* 64-bit entry. Register usage at this point:
+        *
+        * SPRG_SCRATCH0   = guest R13
+        * R12             = (guest CR << 32) | exit handler id
+        * R13             = PACA
+        * HSTATE.SCRATCH0 = guest R12
+        * HSTATE.SCRATCH1 = guest CTR if RELOCATABLE
+        */
+#ifdef CONFIG_PPC64
+       /* Match 32-bit entry */
+#ifdef CONFIG_RELOCATABLE
+       std     r9, HSTATE_SCRATCH2(r13)
+       ld      r9, HSTATE_SCRATCH1(r13)
+       mtctr   r9
+       ld      r9, HSTATE_SCRATCH2(r13)
+#endif
+       rotldi  r12, r12, 32              /* Flip R12 halves for stw */
+       stw     r12, HSTATE_SCRATCH1(r13) /* CR is now in the low half */
+       srdi    r12, r12, 32              /* shift trap into low half */
+#endif
 
+.global kvmppc_handler_trampoline_exit
+kvmppc_handler_trampoline_exit:
        /* Register usage at this point:
         *
-        * SPRG_SCRATCH0  = guest R13
-        * R12            = exit handler id
-        * R13            = shadow vcpu (32-bit) or PACA (64-bit)
+        * SPRG_SCRATCH0   = guest R13
+        * R12             = exit handler id
+        * R13             = shadow vcpu (32-bit) or PACA (64-bit)
         * HSTATE.SCRATCH0 = guest R12
         * HSTATE.SCRATCH1 = guest CR
-        *
         */
 
        /* Save registers */