]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
s390/entry: Pass the asce as parameter to sie64a()
authorClaudio Imbrenda <imbrenda@linux.ibm.com>
Wed, 3 Jul 2024 15:58:59 +0000 (17:58 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 10 Jul 2024 17:50:45 +0000 (19:50 +0200)
Pass the guest ASCE explicitly as parameter, instead of having sie64a()
take it from lowcore.

This removes hidden state from lowcore, and makes things look cleaner.

Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Reviewed-by: Nico Boehr <nrb@linux.ibm.com>
Link: https://lore.kernel.org/r/20240703155900.103783-2-imbrenda@linux.ibm.com
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/kvm_host.h
arch/s390/include/asm/stacktrace.h
arch/s390/kernel/asm-offsets.c
arch/s390/kernel/entry.S
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/vsie.c

index 95990461888fcaee7759af29874071207797ad74..2d4e3f50a823c7246de972b0d665f35768677fe2 100644 (file)
@@ -1029,11 +1029,12 @@ void kvm_arch_crypto_clear_masks(struct kvm *kvm);
 void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm,
                               unsigned long *aqm, unsigned long *adm);
 
-int __sie64a(phys_addr_t sie_block_phys, struct kvm_s390_sie_block *sie_block, u64 *rsa);
+int __sie64a(phys_addr_t sie_block_phys, struct kvm_s390_sie_block *sie_block, u64 *rsa,
+            unsigned long gasce);
 
-static inline int sie64a(struct kvm_s390_sie_block *sie_block, u64 *rsa)
+static inline int sie64a(struct kvm_s390_sie_block *sie_block, u64 *rsa, unsigned long gasce)
 {
-       return __sie64a(virt_to_phys(sie_block), sie_block, rsa);
+       return __sie64a(virt_to_phys(sie_block), sie_block, rsa, gasce);
 }
 
 extern char sie_exit;
index 85b6738b826af6f5ce7d2e7d10a4fc97544ee424..1d5ca13dc90f5e2acf637625633aef396dd76d99 100644 (file)
@@ -65,6 +65,7 @@ struct stack_frame {
                        unsigned long sie_reason;
                        unsigned long sie_flags;
                        unsigned long sie_control_block_phys;
+                       unsigned long sie_guest_asce;
                };
        };
        unsigned long gprs[10];
index f55979f64d4996de797339bab62d0a90bde8fb06..26bb45d0e6f13f0177cf523c43ef774dd220dd64 100644 (file)
@@ -63,6 +63,7 @@ int main(void)
        OFFSET(__SF_SIE_REASON, stack_frame, sie_reason);
        OFFSET(__SF_SIE_FLAGS, stack_frame, sie_flags);
        OFFSET(__SF_SIE_CONTROL_PHYS, stack_frame, sie_control_block_phys);
+       OFFSET(__SF_SIE_GUEST_ASCE, stack_frame, sie_guest_asce);
        DEFINE(STACK_FRAME_OVERHEAD, sizeof(struct stack_frame));
        BLANK();
        OFFSET(__SFUSER_BACKCHAIN, stack_frame_user, back_chain);
index 60cf917a7122d9a7da3c7f1b14ac6879304477d5..454b6b92c7f84294e7afaca7beabb9446b5b40d6 100644 (file)
@@ -179,6 +179,7 @@ SYM_FUNC_END(__switch_to_asm)
  * %r2 pointer to sie control block phys
  * %r3 pointer to sie control block virt
  * %r4 guest register save area
+ * %r5 guest asce
  */
 SYM_FUNC_START(__sie64a)
        stmg    %r6,%r14,__SF_GPRS(%r15)        # save kernel registers
@@ -186,15 +187,12 @@ SYM_FUNC_START(__sie64a)
        stg     %r2,__SF_SIE_CONTROL_PHYS(%r15) # save sie block physical..
        stg     %r3,__SF_SIE_CONTROL(%r15)      # ...and virtual addresses
        stg     %r4,__SF_SIE_SAVEAREA(%r15)     # save guest register save area
+       stg     %r5,__SF_SIE_GUEST_ASCE(%r15)   # save guest asce
        xc      __SF_SIE_REASON(8,%r15),__SF_SIE_REASON(%r15) # reason code = 0
        mvc     __SF_SIE_FLAGS(8,%r15),__TI_flags(%r12) # copy thread flags
        lmg     %r0,%r13,0(%r4)                 # load guest gprs 0-13
-       lg      %r14,__LC_GMAP                  # get gmap pointer
-       ltgr    %r14,%r14
-       jz      .Lsie_gmap
        oi      __LC_CPU_FLAGS+7,_CIF_SIE
-       lctlg   %c1,%c1,__GMAP_ASCE(%r14)       # load primary asce
-.Lsie_gmap:
+       lctlg   %c1,%c1,__SF_SIE_GUEST_ASCE(%r15) # load primary asce
        lg      %r14,__SF_SIE_CONTROL(%r15)     # get control block pointer
        oi      __SIE_PROG0C+3(%r14),1          # we are going into SIE now
        tm      __SIE_PROG20+3(%r14),3          # last exit...
index 50b77b7590425f9aa962ec53e8fd414dd74a2ae0..7697c1fc17336404c6e373e84a6fcbbcb06981f9 100644 (file)
@@ -4829,7 +4829,8 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
                               sizeof(sie_page->pv_grregs));
                }
                exit_reason = sie64a(vcpu->arch.sie_block,
-                                    vcpu->run->s.regs.gprs);
+                                    vcpu->run->s.regs.gprs,
+                                    gmap_get_enabled()->asce);
                if (kvm_s390_pv_cpu_is_protected(vcpu)) {
                        memcpy(vcpu->run->s.regs.gprs,
                               sie_page->pv_grregs,
index c9ecae830634f5f73863736c1e2137a7b08728e2..97a70c2b83ee28236adc9f8fdaa0573e8822026e 100644 (file)
@@ -1150,7 +1150,7 @@ static int do_vsie_run(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
        vcpu->arch.sie_block->prog0c |= PROG_IN_SIE;
        barrier();
        if (!kvm_s390_vcpu_sie_inhibited(vcpu))
-               rc = sie64a(scb_s, vcpu->run->s.regs.gprs);
+               rc = sie64a(scb_s, vcpu->run->s.regs.gprs, gmap_get_enabled()->asce);
        barrier();
        vcpu->arch.sie_block->prog0c &= ~PROG_IN_SIE;