From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex =?utf-8?Q?Benn=C3=A9e?= Subject: Re: [PATCH v10 18/18] KVM: arm64: Invoke FPSIMD context switch trap from C Date: Thu, 24 May 2018 16:09:04 +0100 Message-ID: <87vabdrsz3.fsf@linaro.org> References: <1527005119-6842-1-git-send-email-Dave.Martin@arm.com> <1527005119-6842-19-git-send-email-Dave.Martin@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 6AA8A4A0C9 for ; Thu, 24 May 2018 10:58:47 -0400 (EDT) Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id BRHv9WOuVCw8 for ; Thu, 24 May 2018 10:58:24 -0400 (EDT) Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) by mm01.cs.columbia.edu (Postfix) with ESMTPS id 6F69A49F93 for ; Thu, 24 May 2018 10:58:24 -0400 (EDT) Received: by mail-wr0-f193.google.com with SMTP id w18-v6so3773506wrn.6 for ; Thu, 24 May 2018 08:09:06 -0700 (PDT) In-reply-to: <1527005119-6842-19-git-send-email-Dave.Martin@arm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu To: Dave Martin Cc: Christoffer Dall , Ard Biesheuvel , Marc Zyngier , Catalin Marinas , Will Deacon , kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org List-Id: kvmarm@lists.cs.columbia.edu CkRhdmUgTWFydGluIDxEYXZlLk1hcnRpbkBhcm0uY29tPiB3cml0ZXM6Cgo+IFRoZSBjb252ZXJz aW9uIG9mIHRoZSBGUFNJTUQgY29udGV4dCBzd2l0Y2ggdHJhcCBjb2RlIHRvIEMgaGFzIGFkZGVk Cj4gc29tZSBvdmVyaGVhZCB0byBjYWxsaW5nIGl0LCBkdWUgdG8gdGhlIG5lZWQgdG8gc2F2ZSBy ZWdpc3RlcnMgdGhhdAo+IHRoZSBwcm9jZWR1cmUgY2FsbCBzdGFuZGFyZCBkZWZpbmVzIGFzIGNh bGxlci1zYXZlZC4KPgo+IFNvLCBwZXJoYXBzIGl0IGlzIG5vIGxvbmdlciB3b3J0aCBpbnZva2lu ZyB0aGlzIHRyYXAgaGFuZGxlciBxdWl0ZQo+IHNvIGVhcmx5Lgo+Cj4gSW5zdGVhZCwgd2UgY2Fu IGludm9rZSBpdCBmcm9tIGZpeHVwX2d1ZXN0X2V4aXQoKSwgd2l0aCBsaXR0bGUKPiBsaWtlbGlo b29kIG9mIGluY3JlYXNpbmcgdGhlIG92ZXJoZWFkIG11Y2ggZnVydGhlci4KPgo+IEFzIGEgY29u dmVuaWVuY2UsIHRoaXMgcGF0Y2ggZ2l2ZXMgX19oeXBfc3dpdGNoX2Zwc2ltZCgpIHRoZSBzYW1l Cj4gcmV0dXJuIHNlbWFudGljcyBmaXh1cF9ndWVzdF9leGl0KCkuICBGb3Igbm93IHRoZXJlIGlz IG5vCj4gcG9zc2liaWxpdHkgb2YgYSBzcHVyaW91cyBGUFNJTUQgdHJhcCwgc28gdGhlIGZ1bmN0 aW9uIGFsd2F5cwo+IHJldHVybnMgdHJ1ZSwgYnV0IHRoaXMgYWxsb3dzIGl0IHRvIGJlIHRhaWwt Y2FsbGVkIHdpdGggYSBzaW5nbGUKPiByZXR1cm4gc3RhdGVtZW50Lgo+Cj4gU2lnbmVkLW9mZi1i eTogRGF2ZSBNYXJ0aW4gPERhdmUuTWFydGluQGFybS5jb20+Cj4gUmV2aWV3ZWQtYnk6IE1hcmMg WnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+Cj4gUmV2aWV3ZWQtYnk6IENocmlzdG9mZmVy IERhbGwgPGNocmlzdG9mZmVyLmRhbGxAYXJtLmNvbT4KClJldmlld2VkLWJ5OiBBbGV4IEJlbm7D qWUgPGFsZXguYmVubmVlQGxpbmFyby5vcmc+Cgo+IC0tLQo+ICBhcmNoL2FybTY0L2t2bS9oeXAv ZW50cnkuUyAgICAgfCAzMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAgYXJjaC9h cm02NC9rdm0vaHlwL2h5cC1lbnRyeS5TIHwgMTkgLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICBhcmNo L2FybTY0L2t2bS9oeXAvc3dpdGNoLmMgICAgfCAxNSArKysrKysrKysrKysrLS0KPiAgMyBmaWxl cyBjaGFuZ2VkLCAxMyBpbnNlcnRpb25zKCspLCA1MSBkZWxldGlvbnMoLSkKPgo+IGRpZmYgLS1n aXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvZW50cnkuUyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9lbnRy eS5TCj4gaW5kZXggNDBmMzQ5Yi4uZmFkMWUxNiAxMDA2NDQKPiAtLS0gYS9hcmNoL2FybTY0L2t2 bS9oeXAvZW50cnkuUwo+ICsrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9lbnRyeS5TCj4gQEAgLTE2 NiwzMyArMTY2LDMgQEAgYWJvcnRfZ3Vlc3RfZXhpdF9lbmQ6Cj4gIAlvcnIJeDAsIHgwLCB4NQo+ ICAxOglyZXQKPiAgRU5EUFJPQyhfX2d1ZXN0X2V4aXQpCj4gLQo+IC1FTlRSWShfX2Zwc2ltZF9n dWVzdF9yZXN0b3JlKQo+IC0JLy8geDA6IGVzcgo+IC0JLy8geDE6IHZjcHUKPiAtCS8vIHgyLXgy OSxscjogdmNwdSByZWdzCj4gLQkvLyB2Y3B1IHgwLXgxIG9uIHRoZSBzdGFjawo+IC0Jc3RwCXgy LCB4MywgW3NwLCAjLTE0NF0hCj4gLQlzdHAJeDQsIHg1LCBbc3AsICMxNl0KPiAtCXN0cAl4Niwg eDcsIFtzcCwgIzMyXQo+IC0Jc3RwCXg4LCB4OSwgW3NwLCAjNDhdCj4gLQlzdHAJeDEwLCB4MTEs IFtzcCwgIzY0XQo+IC0Jc3RwCXgxMiwgeDEzLCBbc3AsICM4MF0KPiAtCXN0cAl4MTQsIHgxNSwg W3NwLCAjOTZdCj4gLQlzdHAJeDE2LCB4MTcsIFtzcCwgIzExMl0KPiAtCXN0cAl4MTgsIGxyLCBb c3AsICMxMjhdCj4gLQo+IC0JYmwJX19oeXBfc3dpdGNoX2Zwc2ltZAo+IC0KPiAtCWxkcAl4NCwg eDUsIFtzcCwgIzE2XQo+IC0JbGRwCXg2LCB4NywgW3NwLCAjMzJdCj4gLQlsZHAJeDgsIHg5LCBb c3AsICM0OF0KPiAtCWxkcAl4MTAsIHgxMSwgW3NwLCAjNjRdCj4gLQlsZHAJeDEyLCB4MTMsIFtz cCwgIzgwXQo+IC0JbGRwCXgxNCwgeDE1LCBbc3AsICM5Nl0KPiAtCWxkcAl4MTYsIHgxNywgW3Nw LCAjMTEyXQo+IC0JbGRwCXgxOCwgbHIsIFtzcCwgIzEyOF0KPiAtCWxkcAl4MCwgeDEsIFtzcCwg IzE0NF0KPiAtCWxkcAl4MiwgeDMsIFtzcF0sICMxNjAKPiAtCWVyZXQKPiAtRU5EUFJPQyhfX2Zw c2ltZF9ndWVzdF9yZXN0b3JlKQo+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvaHlw LWVudHJ5LlMgYi9hcmNoL2FybTY0L2t2bS9oeXAvaHlwLWVudHJ5LlMKPiBpbmRleCBiZmZlY2Uy Li43NTNiOWQyIDEwMDY0NAo+IC0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9oeXAtZW50cnkuUwo+ ICsrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9oeXAtZW50cnkuUwo+IEBAIC0xMTMsMjUgKzExMyw2 IEBAIGVsMV9odmNfZ3Vlc3Q6Cj4KPiAgZWwxX3RyYXA6Cj4gIAlnZXRfdmNwdV9wdHIJeDEsIHgw Cj4gLQo+IC0JbXJzCQl4MCwgZXNyX2VsMgo+IC0JbHNyCQl4MCwgeDAsICNFU1JfRUx4X0VDX1NI SUZUCj4gLQkvKgo+IC0JICogeDA6IEVTUl9FQwo+IC0JICogeDE6IHZjcHUgcG9pbnRlcgo+IC0J ICovCj4gLQo+IC0JLyoKPiAtCSAqIFdlIHRyYXAgdGhlIGZpcnN0IGFjY2VzcyB0byB0aGUgRlAv U0lNRCB0byBzYXZlIHRoZSBob3N0IGNvbnRleHQKPiAtCSAqIGFuZCByZXN0b3JlIHRoZSBndWVz dCBjb250ZXh0IGxhemlseS4KPiAtCSAqIElmIEZQL1NJTUQgaXMgbm90IGltcGxlbWVudGVkLCBo YW5kbGUgdGhlIHRyYXAgYW5kIGluamVjdCBhbgo+IC0JICogdW5kZWZpbmVkIGluc3RydWN0aW9u IGV4Y2VwdGlvbiB0byB0aGUgZ3Vlc3QuCj4gLQkgKi8KPiAtYWx0ZXJuYXRpdmVfaWZfbm90IEFS TTY0X0hBU19OT19GUFNJTUQKPiAtCWNtcAl4MCwgI0VTUl9FTHhfRUNfRlBfQVNJTUQKPiAtCWIu ZXEJX19mcHNpbWRfZ3Vlc3RfcmVzdG9yZQo+IC1hbHRlcm5hdGl2ZV9lbHNlX25vcF9lbmRpZgo+ IC0KPiAgCW1vdgl4MCwgI0FSTV9FWENFUFRJT05fVFJBUAo+ICAJYglfX2d1ZXN0X2V4aXQKPgo+ IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvc3dpdGNoLmMgYi9hcmNoL2FybTY0L2t2 bS9oeXAvc3dpdGNoLmMKPiBpbmRleCA0ZmJlZTk1Li4yZDQ1YmQ3IDEwMDY0NAo+IC0tLSBhL2Fy Y2gvYXJtNjQva3ZtL2h5cC9zd2l0Y2guYwo+ICsrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9zd2l0 Y2guYwo+IEBAIC0zMjgsOCArMzI4LDcgQEAgc3RhdGljIGJvb2wgX19oeXBfdGV4dCBfX3NraXBf aW5zdHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+ICAJfQo+ICB9Cj4KPiAtdm9pZCBfX2h5cF90 ZXh0IF9faHlwX3N3aXRjaF9mcHNpbWQodTY0IGVzciBfX2Fsd2F5c191bnVzZWQsCj4gLQkJCQkg ICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+ICtzdGF0aWMgYm9vbCBfX2h5cF90ZXh0IF9faHlw X3N3aXRjaF9mcHNpbWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+ICB7Cj4gIAlzdHJ1Y3QgdXNl cl9mcHNpbWRfc3RhdGUgKmhvc3RfZnBzaW1kID0gdmNwdS0+YXJjaC5ob3N0X2Zwc2ltZF9zdGF0 ZTsKPgo+IEBAIC0zNjksNiArMzY4LDggQEAgdm9pZCBfX2h5cF90ZXh0IF9faHlwX3N3aXRjaF9m cHNpbWQodTY0IGVzciBfX2Fsd2F5c191bnVzZWQsCj4gIAkJCSAgICAgZnBleGMzMl9lbDIpOwo+ Cj4gIAl2Y3B1LT5hcmNoLmZsYWdzIHw9IEtWTV9BUk02NF9GUF9FTkFCTEVEOwo+ICsKPiArCXJl dHVybiB0cnVlOwo+ICB9Cj4KPiAgLyoKPiBAQCAtMzkwLDYgKzM5MSwxNiBAQCBzdGF0aWMgYm9v bCBfX2h5cF90ZXh0IGZpeHVwX2d1ZXN0X2V4aXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQg KmV4aXRfY29kZSkKPiAgCWlmICgqZXhpdF9jb2RlICE9IEFSTV9FWENFUFRJT05fVFJBUCkKPiAg CQlnb3RvIGV4aXQ7Cj4KPiArCS8qCj4gKwkgKiBXZSB0cmFwIHRoZSBmaXJzdCBhY2Nlc3MgdG8g dGhlIEZQL1NJTUQgdG8gc2F2ZSB0aGUgaG9zdCBjb250ZXh0Cj4gKwkgKiBhbmQgcmVzdG9yZSB0 aGUgZ3Vlc3QgY29udGV4dCBsYXppbHkuCj4gKwkgKiBJZiBGUC9TSU1EIGlzIG5vdCBpbXBsZW1l bnRlZCwgaGFuZGxlIHRoZSB0cmFwIGFuZCBpbmplY3QgYW4KPiArCSAqIHVuZGVmaW5lZCBpbnN0 cnVjdGlvbiBleGNlcHRpb24gdG8gdGhlIGd1ZXN0Lgo+ICsJICovCj4gKwlpZiAoc3lzdGVtX3N1 cHBvcnRzX2Zwc2ltZCgpICYmCj4gKwkgICAga3ZtX3ZjcHVfdHJhcF9nZXRfY2xhc3ModmNwdSkg PT0gRVNSX0VMeF9FQ19GUF9BU0lNRCkKPiArCQlyZXR1cm4gX19oeXBfc3dpdGNoX2Zwc2ltZCh2 Y3B1KTsKPiArCj4gIAlpZiAoIV9fcG9wdWxhdGVfZmF1bHRfaW5mbyh2Y3B1KSkKPiAgCQlyZXR1 cm4gdHJ1ZTsKCgotLQpBbGV4IEJlbm7DqWUKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18Ka3ZtYXJtIG1haWxpbmcgbGlzdAprdm1hcm1AbGlzdHMuY3MuY29s dW1iaWEuZWR1Cmh0dHBzOi8vbGlzdHMuY3MuY29sdW1iaWEuZWR1L21haWxtYW4vbGlzdGluZm8v a3ZtYXJtCg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: alex.bennee@linaro.org (Alex =?utf-8?Q?Benn=C3=A9e?=) Date: Thu, 24 May 2018 16:09:04 +0100 Subject: [PATCH v10 18/18] KVM: arm64: Invoke FPSIMD context switch trap from C In-Reply-To: <1527005119-6842-19-git-send-email-Dave.Martin@arm.com> References: <1527005119-6842-1-git-send-email-Dave.Martin@arm.com> <1527005119-6842-19-git-send-email-Dave.Martin@arm.com> Message-ID: <87vabdrsz3.fsf@linaro.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Dave Martin writes: > The conversion of the FPSIMD context switch trap code to C has added > some overhead to calling it, due to the need to save registers that > the procedure call standard defines as caller-saved. > > So, perhaps it is no longer worth invoking this trap handler quite > so early. > > Instead, we can invoke it from fixup_guest_exit(), with little > likelihood of increasing the overhead much further. > > As a convenience, this patch gives __hyp_switch_fpsimd() the same > return semantics fixup_guest_exit(). For now there is no > possibility of a spurious FPSIMD trap, so the function always > returns true, but this allows it to be tail-called with a single > return statement. > > Signed-off-by: Dave Martin > Reviewed-by: Marc Zyngier > Reviewed-by: Christoffer Dall Reviewed-by: Alex Benn?e > --- > arch/arm64/kvm/hyp/entry.S | 30 ------------------------------ > arch/arm64/kvm/hyp/hyp-entry.S | 19 ------------------- > arch/arm64/kvm/hyp/switch.c | 15 +++++++++++++-- > 3 files changed, 13 insertions(+), 51 deletions(-) > > diff --git a/arch/arm64/kvm/hyp/entry.S b/arch/arm64/kvm/hyp/entry.S > index 40f349b..fad1e16 100644 > --- a/arch/arm64/kvm/hyp/entry.S > +++ b/arch/arm64/kvm/hyp/entry.S > @@ -166,33 +166,3 @@ abort_guest_exit_end: > orr x0, x0, x5 > 1: ret > ENDPROC(__guest_exit) > - > -ENTRY(__fpsimd_guest_restore) > - // x0: esr > - // x1: vcpu > - // x2-x29,lr: vcpu regs > - // vcpu x0-x1 on the stack > - stp x2, x3, [sp, #-144]! > - stp x4, x5, [sp, #16] > - stp x6, x7, [sp, #32] > - stp x8, x9, [sp, #48] > - stp x10, x11, [sp, #64] > - stp x12, x13, [sp, #80] > - stp x14, x15, [sp, #96] > - stp x16, x17, [sp, #112] > - stp x18, lr, [sp, #128] > - > - bl __hyp_switch_fpsimd > - > - ldp x4, x5, [sp, #16] > - ldp x6, x7, [sp, #32] > - ldp x8, x9, [sp, #48] > - ldp x10, x11, [sp, #64] > - ldp x12, x13, [sp, #80] > - ldp x14, x15, [sp, #96] > - ldp x16, x17, [sp, #112] > - ldp x18, lr, [sp, #128] > - ldp x0, x1, [sp, #144] > - ldp x2, x3, [sp], #160 > - eret > -ENDPROC(__fpsimd_guest_restore) > diff --git a/arch/arm64/kvm/hyp/hyp-entry.S b/arch/arm64/kvm/hyp/hyp-entry.S > index bffece2..753b9d2 100644 > --- a/arch/arm64/kvm/hyp/hyp-entry.S > +++ b/arch/arm64/kvm/hyp/hyp-entry.S > @@ -113,25 +113,6 @@ el1_hvc_guest: > > el1_trap: > get_vcpu_ptr x1, x0 > - > - mrs x0, esr_el2 > - lsr x0, x0, #ESR_ELx_EC_SHIFT > - /* > - * x0: ESR_EC > - * x1: vcpu pointer > - */ > - > - /* > - * We trap the first access to the FP/SIMD to save the host context > - * and restore the guest context lazily. > - * If FP/SIMD is not implemented, handle the trap and inject an > - * undefined instruction exception to the guest. > - */ > -alternative_if_not ARM64_HAS_NO_FPSIMD > - cmp x0, #ESR_ELx_EC_FP_ASIMD > - b.eq __fpsimd_guest_restore > -alternative_else_nop_endif > - > mov x0, #ARM_EXCEPTION_TRAP > b __guest_exit > > diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c > index 4fbee95..2d45bd7 100644 > --- a/arch/arm64/kvm/hyp/switch.c > +++ b/arch/arm64/kvm/hyp/switch.c > @@ -328,8 +328,7 @@ static bool __hyp_text __skip_instr(struct kvm_vcpu *vcpu) > } > } > > -void __hyp_text __hyp_switch_fpsimd(u64 esr __always_unused, > - struct kvm_vcpu *vcpu) > +static bool __hyp_text __hyp_switch_fpsimd(struct kvm_vcpu *vcpu) > { > struct user_fpsimd_state *host_fpsimd = vcpu->arch.host_fpsimd_state; > > @@ -369,6 +368,8 @@ void __hyp_text __hyp_switch_fpsimd(u64 esr __always_unused, > fpexc32_el2); > > vcpu->arch.flags |= KVM_ARM64_FP_ENABLED; > + > + return true; > } > > /* > @@ -390,6 +391,16 @@ static bool __hyp_text fixup_guest_exit(struct kvm_vcpu *vcpu, u64 *exit_code) > if (*exit_code != ARM_EXCEPTION_TRAP) > goto exit; > > + /* > + * We trap the first access to the FP/SIMD to save the host context > + * and restore the guest context lazily. > + * If FP/SIMD is not implemented, handle the trap and inject an > + * undefined instruction exception to the guest. > + */ > + if (system_supports_fpsimd() && > + kvm_vcpu_trap_get_class(vcpu) == ESR_ELx_EC_FP_ASIMD) > + return __hyp_switch_fpsimd(vcpu); > + > if (!__populate_fault_info(vcpu)) > return true; -- Alex Benn?e