From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH/RFC 5/9] KVM: s390: introduce post handlers for STSI Date: Mon, 16 Mar 2015 12:55:48 +0100 Message-ID: <5506C4C4.3050507@redhat.com> References: <1426495905-17531-1-git-send-email-borntraeger@de.ibm.com> <1426495905-17531-6-git-send-email-borntraeger@de.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Cc: Marcelo Tosatti , Alexander Graf , Cornelia Huck , Jens Freimann , Ekaterina Tumanova To: Christian Borntraeger , KVM Return-path: Received: from mx1.redhat.com ([209.132.183.28]:37826 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751638AbbCPMGW (ORCPT ); Mon, 16 Mar 2015 08:06:22 -0400 In-Reply-To: <1426495905-17531-6-git-send-email-borntraeger@de.ibm.com> Sender: kvm-owner@vger.kernel.org List-ID: On 16/03/2015 09:51, Christian Borntraeger wrote: > From: Ekaterina Tumanova > > The Store System Information (STSI) instruction currently collects all > information it relays to the caller in the kernel. Some information, > however, is only available in user space. An example of this is the > guest name: The kernel always sets "KVMGuest", but user space knows the > actual guest name. > > This patch introduces a new exit, KVM_EXIT_S390_STSI, guarded by a > capability that can be enabled by user space if it wants to be able to > insert such data. User space will be provided with the target buffer > and the requested STSI function code. > > Reviewed-by: Eric Farman > Reviewed-by: Christian Borntraeger > Signed-off-by: Ekaterina Tumanova > Signed-off-by: Christian Borntraeger > --- > Documentation/virtual/kvm/api.txt | 28 ++++++++++++++++++++++++++++ > arch/s390/include/asm/kvm_host.h | 1 + > arch/s390/kvm/kvm-s390.c | 5 +++++ > arch/s390/kvm/priv.c | 16 +++++++++++++++- > include/uapi/linux/kvm.h | 11 +++++++++++ > 5 files changed, 60 insertions(+), 1 deletion(-) This is okay, but it made me curious about s390 specifics because it's different from the x86 equivalent. The x86 info is always 16-byte (4 times 32 bit) and the selectors are few (roughly 30), and it is passed to the kernel at init time via KVM_SET_CPUID2. How many selectors are there on s390, and how big is the info that can be written? Paolo > diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt > index f03178d..74d18b6 100644 > --- a/Documentation/virtual/kvm/api.txt > +++ b/Documentation/virtual/kvm/api.txt > @@ -3304,3 +3304,31 @@ Returns: 0 on success, negative value on error > Allows use of the vector registers introduced with z13 processor, and > provides for the synchronization between host and user space. Will > return -EINVAL if the machine does not support vectors. > + > +7.4 KVM_CAP_S390_USER_STSI > + > +Architectures: s390 > +Parameters: none > + > +This capability allows post-handlers for the STSI instruction. After > +initial handling in the kernel, KVM exits to user space with > +KVM_EXIT_S390_STSI to allow user space to insert further data. > + > +Before exiting to userspace, kvm handlers should fill in s390_stsi field of > +vcpu->run: > +struct { > + __u64 addr; > + __u8 ar; > + __u8 reserved; > + __u8 fc; > + __u8 sel1; > + __u16 sel2; > +} s390_stsi; > + > +@addr - guest address of STSI SYSIB > +@fc - function code > +@sel1 - selector 1 > +@sel2 - selector 2 > +@ar - access register number > + > +KVM handlers should exit to userspace with rc = -EREMOTE. > diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h > index 347a333..2356a8c 100644 > --- a/arch/s390/include/asm/kvm_host.h > +++ b/arch/s390/include/asm/kvm_host.h > @@ -565,6 +565,7 @@ struct kvm_arch{ > int use_vectors; > int user_cpu_state_ctrl; > int user_sigp; > + int user_stsi; > struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS]; > wait_queue_head_t ipte_wq; > int ipte_lock_count; > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index 92855e2..1f5baf4 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -178,6 +178,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) > case KVM_CAP_VM_ATTRIBUTES: > case KVM_CAP_MP_STATE: > case KVM_CAP_S390_USER_SIGP: > + case KVM_CAP_S390_USER_STSI: > r = 1; > break; > case KVM_CAP_S390_MEM_OP: > @@ -280,6 +281,10 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm, struct kvm_enable_cap *cap) > kvm->arch.use_vectors = MACHINE_HAS_VX; > r = MACHINE_HAS_VX ? 0 : -EINVAL; > break; > + case KVM_CAP_S390_USER_STSI: > + kvm->arch.user_stsi = 1; > + r = 0; > + break; > default: > r = -EINVAL; > break; > diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c > index 5f26425..211102c 100644 > --- a/arch/s390/kvm/priv.c > +++ b/arch/s390/kvm/priv.c > @@ -488,6 +488,16 @@ static void handle_stsi_3_2_2(struct kvm_vcpu *vcpu, struct sysinfo_3_2_2 *mem) > ASCEBC(mem->vm[0].cpi, 16); > } > > +static void insert_stsi_usr_data(struct kvm_vcpu *vcpu, u64 addr, u8 fc, > + u8 sel1, u16 sel2) > +{ > + vcpu->run->exit_reason = KVM_EXIT_S390_STSI; > + vcpu->run->s390_stsi.addr = addr; > + vcpu->run->s390_stsi.fc = fc; > + vcpu->run->s390_stsi.sel1 = sel1; > + vcpu->run->s390_stsi.sel2 = sel2; > +} > + > static int handle_stsi(struct kvm_vcpu *vcpu) > { > int fc = (vcpu->run->s.regs.gprs[0] & 0xf0000000) >> 28; > @@ -547,11 +557,15 @@ static int handle_stsi(struct kvm_vcpu *vcpu) > rc = kvm_s390_inject_prog_cond(vcpu, rc); > goto out; > } > + if (vcpu->kvm->arch.user_stsi) { > + insert_stsi_usr_data(vcpu, operand2, fc, sel1, sel2); > + rc = -EREMOTE; > + } > trace_kvm_s390_handle_stsi(vcpu, fc, sel1, sel2, operand2); > free_page(mem); > kvm_s390_set_psw_cc(vcpu, 0); > vcpu->run->s.regs.gprs[0] = 0; > - return 0; > + return rc; > out_no_data: > kvm_s390_set_psw_cc(vcpu, 3); > out: > diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h > index 74bbd9a..279ffd2 100644 > --- a/include/uapi/linux/kvm.h > +++ b/include/uapi/linux/kvm.h > @@ -172,6 +172,7 @@ struct kvm_pit_config { > #define KVM_EXIT_S390_TSCH 22 > #define KVM_EXIT_EPR 23 > #define KVM_EXIT_SYSTEM_EVENT 24 > +#define KVM_EXIT_S390_STSI 25 > > /* For KVM_EXIT_INTERNAL_ERROR */ > /* Emulate instruction failed. */ > @@ -309,6 +310,15 @@ struct kvm_run { > __u32 type; > __u64 flags; > } system_event; > + /* KVM_EXIT_S390_STSI */ > + struct { > + __u64 addr; > + __u8 ar; > + __u8 reserved; > + __u8 fc; > + __u8 sel1; > + __u16 sel2; > + } s390_stsi; > /* Fix the size of the union. */ > char padding[256]; > }; > @@ -780,6 +790,7 @@ struct kvm_ppc_smmu_info { > #define KVM_CAP_S390_USER_SIGP 106 > #define KVM_CAP_S390_VECTOR_REGISTERS 107 > #define KVM_CAP_S390_MEM_OP 108 > +#define KVM_CAP_S390_USER_STSI 109 > > #ifdef KVM_CAP_IRQ_ROUTING > >