Message ID | 20230815151415.379760-5-seiden@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: s390: Enable AP instructions for PV-guests | expand |
On 15.08.23 17:14, Steffen Eiden wrote: > Introduces new feature bits and enablement flags for AP and AP IRQ > support. > > Signed-off-by: Steffen Eiden <seiden@linux.ibm.com> > Reviewed-by: Janosch Frank <frankja@linux.ibm.com> Reviewed-by: Michael Mueller <mimu@linux.ibm.com> > --- > arch/s390/include/asm/uv.h | 12 +++++++++++- > arch/s390/kvm/pv.c | 6 ++++-- > 2 files changed, 15 insertions(+), 3 deletions(-) > > diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h > index 823adfff7315..0e7bd3873907 100644 > --- a/arch/s390/include/asm/uv.h > +++ b/arch/s390/include/asm/uv.h > @@ -99,6 +99,8 @@ enum uv_cmds_inst { > enum uv_feat_ind { > BIT_UV_FEAT_MISC = 0, > BIT_UV_FEAT_AIV = 1, > + BIT_UV_FEAT_AP = 4, > + BIT_UV_FEAT_AP_INTR = 5, > }; > > struct uv_cb_header { > @@ -159,7 +161,15 @@ struct uv_cb_cgc { > u64 guest_handle; > u64 conf_base_stor_origin; > u64 conf_virt_stor_origin; > - u64 reserved30; > + u8 reserved30[6]; > + union { > + struct { > + u16 : 14; > + u16 ap_instr_intr : 1; > + u16 ap_allow_instr : 1; > + }; > + u16 raw; > + } flags; > u64 guest_stor_origin; > u64 guest_stor_len; > u64 guest_sca; > diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c > index 8570ee324607..75e81ba26d04 100644 > --- a/arch/s390/kvm/pv.c > +++ b/arch/s390/kvm/pv.c > @@ -576,12 +576,14 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) > uvcb.conf_base_stor_origin = > virt_to_phys((void *)kvm->arch.pv.stor_base); > uvcb.conf_virt_stor_origin = (u64)kvm->arch.pv.stor_var; > + uvcb.flags.ap_allow_instr = kvm->arch.model.uv_feat_guest.ap; > + uvcb.flags.ap_instr_intr = kvm->arch.model.uv_feat_guest.ap_intr; > > cc = uv_call_sched(0, (u64)&uvcb); > *rc = uvcb.header.rc; > *rrc = uvcb.header.rrc; > - KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x", > - uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc); > + KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x flags %04x", > + uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc, uvcb.flags.raw); > > /* Outputs */ > kvm->arch.pv.handle = uvcb.guest_handle;
diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h index 823adfff7315..0e7bd3873907 100644 --- a/arch/s390/include/asm/uv.h +++ b/arch/s390/include/asm/uv.h @@ -99,6 +99,8 @@ enum uv_cmds_inst { enum uv_feat_ind { BIT_UV_FEAT_MISC = 0, BIT_UV_FEAT_AIV = 1, + BIT_UV_FEAT_AP = 4, + BIT_UV_FEAT_AP_INTR = 5, }; struct uv_cb_header { @@ -159,7 +161,15 @@ struct uv_cb_cgc { u64 guest_handle; u64 conf_base_stor_origin; u64 conf_virt_stor_origin; - u64 reserved30; + u8 reserved30[6]; + union { + struct { + u16 : 14; + u16 ap_instr_intr : 1; + u16 ap_allow_instr : 1; + }; + u16 raw; + } flags; u64 guest_stor_origin; u64 guest_stor_len; u64 guest_sca; diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c index 8570ee324607..75e81ba26d04 100644 --- a/arch/s390/kvm/pv.c +++ b/arch/s390/kvm/pv.c @@ -576,12 +576,14 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc) uvcb.conf_base_stor_origin = virt_to_phys((void *)kvm->arch.pv.stor_base); uvcb.conf_virt_stor_origin = (u64)kvm->arch.pv.stor_var; + uvcb.flags.ap_allow_instr = kvm->arch.model.uv_feat_guest.ap; + uvcb.flags.ap_instr_intr = kvm->arch.model.uv_feat_guest.ap_intr; cc = uv_call_sched(0, (u64)&uvcb); *rc = uvcb.header.rc; *rrc = uvcb.header.rrc; - KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x", - uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc); + KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x flags %04x", + uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc, uvcb.flags.raw); /* Outputs */ kvm->arch.pv.handle = uvcb.guest_handle;