Message ID | 20200207113958.7320-33-borntraeger@de.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: s390: Add support for protected VMs | expand |
On 07/02/2020 12.39, Christian Borntraeger wrote: > From: Janosch Frank <frankja@linux.ibm.com> > > We're not allowed to inject interrupts on intercepts that leave the > guest state in an "in-beetween" state where the next SIE entry will do a > continuation. Namely secure instruction interception and secure prefix > interception. > As our PSW is just a copy of the real one that will be replaced on the > next exit, we can mask out the interrupt bits in the PSW to make sure > that we do not inject anything. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > [borntraeger@de.ibm.com: patch merging, splitting, fixing] > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > --- > arch/s390/kvm/kvm-s390.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index ced2bac251a6..8c7b27287b91 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -4052,6 +4052,7 @@ static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason) > return vcpu_post_run_fault_in_sie(vcpu); > } > > +#define PSW_INT_MASK (PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_MCHECK) > static int __vcpu_run(struct kvm_vcpu *vcpu) > { > int rc, exit_reason; > @@ -4088,6 +4089,10 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) > memcpy(vcpu->run->s.regs.gprs, > sie_page->pv_grregs, > sizeof(sie_page->pv_grregs)); > + if (vcpu->arch.sie_block->icptcode == ICPT_PV_INSTR || > + vcpu->arch.sie_block->icptcode == ICPT_PV_PREF) { > + vcpu->arch.sie_block->gpsw.mask &= ~PSW_INT_MASK; > + } > } > local_irq_disable(); > __enable_cpu_timer_accounting(vcpu); > Reviewed-by: Thomas Huth <thuth@redhat.com>
On Fri, 7 Feb 2020 06:39:55 -0500 Christian Borntraeger <borntraeger@de.ibm.com> wrote: > From: Janosch Frank <frankja@linux.ibm.com> > > We're not allowed to inject interrupts on intercepts that leave the > guest state in an "in-beetween" state where the next SIE entry will do a s/beetween/between/ > continuation. Namely secure instruction interception and secure prefix s/continuation. Namely/continuation, namely,/ Add which one is 104 and which one is 112, so you can match up the description with the subject? > interception. > As our PSW is just a copy of the real one that will be replaced on the > next exit, we can mask out the interrupt bits in the PSW to make sure > that we do not inject anything. > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > [borntraeger@de.ibm.com: patch merging, splitting, fixing] > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> > --- > arch/s390/kvm/kvm-s390.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index ced2bac251a6..8c7b27287b91 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -4052,6 +4052,7 @@ static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason) > return vcpu_post_run_fault_in_sie(vcpu); > } > > +#define PSW_INT_MASK (PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_MCHECK) > static int __vcpu_run(struct kvm_vcpu *vcpu) > { > int rc, exit_reason; > @@ -4088,6 +4089,10 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) > memcpy(vcpu->run->s.regs.gprs, > sie_page->pv_grregs, > sizeof(sie_page->pv_grregs)); Add a comment, as suggested by Thomas last time? > + if (vcpu->arch.sie_block->icptcode == ICPT_PV_INSTR || > + vcpu->arch.sie_block->icptcode == ICPT_PV_PREF) { > + vcpu->arch.sie_block->gpsw.mask &= ~PSW_INT_MASK; > + } > } > local_irq_disable(); > __enable_cpu_timer_accounting(vcpu);
On 10.02.20 14:28, Cornelia Huck wrote: > On Fri, 7 Feb 2020 06:39:55 -0500 > Christian Borntraeger <borntraeger@de.ibm.com> wrote: > >> From: Janosch Frank <frankja@linux.ibm.com> >> >> We're not allowed to inject interrupts on intercepts that leave the >> guest state in an "in-beetween" state where the next SIE entry will do a > > s/beetween/between/ ack > >> continuation. Namely secure instruction interception and secure prefix > > s/continuation. Namely/continuation, namely,/ ack. > > Add which one is 104 and which one is 112, so you can match up the > description with the subject? ack. > > >> interception. >> As our PSW is just a copy of the real one that will be replaced on the >> next exit, we can mask out the interrupt bits in the PSW to make sure >> that we do not inject anything. >> >> Signed-off-by: Janosch Frank <frankja@linux.ibm.com> >> [borntraeger@de.ibm.com: patch merging, splitting, fixing] >> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> >> --- >> arch/s390/kvm/kvm-s390.c | 5 +++++ >> 1 file changed, 5 insertions(+) >> >> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c >> index ced2bac251a6..8c7b27287b91 100644 >> --- a/arch/s390/kvm/kvm-s390.c >> +++ b/arch/s390/kvm/kvm-s390.c >> @@ -4052,6 +4052,7 @@ static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason) >> return vcpu_post_run_fault_in_sie(vcpu); >> } >> >> +#define PSW_INT_MASK (PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_MCHECK) >> static int __vcpu_run(struct kvm_vcpu *vcpu) >> { >> int rc, exit_reason; >> @@ -4088,6 +4089,10 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) >> memcpy(vcpu->run->s.regs.gprs, >> sie_page->pv_grregs, >> sizeof(sie_page->pv_grregs)); > > Add a comment, as suggested by Thomas last time? diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index b53cabc15d9d..52a5196fe975 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -4089,6 +4089,12 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) memcpy(vcpu->run->s.regs.gprs, sie_page->pv_grregs, sizeof(sie_page->pv_grregs)); + /* + * We're not allowed to inject interrupts on intercepts + * that leave the guest state in an "in-beetween" state + * where the next SIE entry will do a continuation. + * Fence interrupts in our "internal" PSW. + */ if (vcpu->arch.sie_block->icptcode == ICPT_PV_INSTR || vcpu->arch.sie_block->icptcode == ICPT_PV_PREF) { vcpu->arch.sie_block->gpsw.mask &= ~PSW_INT_MASK; > >> + if (vcpu->arch.sie_block->icptcode == ICPT_PV_INSTR || >> + vcpu->arch.sie_block->icptcode == ICPT_PV_PREF) { >> + vcpu->arch.sie_block->gpsw.mask &= ~PSW_INT_MASK; >> + } >> } >> local_irq_disable(); >> __enable_cpu_timer_accounting(vcpu); >
On Mon, 10 Feb 2020 14:48:06 +0100 Christian Borntraeger <borntraeger@de.ibm.com> wrote: > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index b53cabc15d9d..52a5196fe975 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -4089,6 +4089,12 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) > memcpy(vcpu->run->s.regs.gprs, > sie_page->pv_grregs, > sizeof(sie_page->pv_grregs)); > + /* > + * We're not allowed to inject interrupts on intercepts > + * that leave the guest state in an "in-beetween" state s/beetween/between/ here as well :) > + * where the next SIE entry will do a continuation. > + * Fence interrupts in our "internal" PSW. > + */ > if (vcpu->arch.sie_block->icptcode == ICPT_PV_INSTR || > vcpu->arch.sie_block->icptcode == ICPT_PV_PREF) { > vcpu->arch.sie_block->gpsw.mask &= ~PSW_INT_MASK; With that on top, Reviewed-by: Cornelia Huck <cohuck@redhat.com>
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index ced2bac251a6..8c7b27287b91 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -4052,6 +4052,7 @@ static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason) return vcpu_post_run_fault_in_sie(vcpu); } +#define PSW_INT_MASK (PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_MCHECK) static int __vcpu_run(struct kvm_vcpu *vcpu) { int rc, exit_reason; @@ -4088,6 +4089,10 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) memcpy(vcpu->run->s.regs.gprs, sie_page->pv_grregs, sizeof(sie_page->pv_grregs)); + if (vcpu->arch.sie_block->icptcode == ICPT_PV_INSTR || + vcpu->arch.sie_block->icptcode == ICPT_PV_PREF) { + vcpu->arch.sie_block->gpsw.mask &= ~PSW_INT_MASK; + } } local_irq_disable(); __enable_cpu_timer_accounting(vcpu);