From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex =?utf-8?Q?Benn=C3=A9e?= Subject: Re: [PATCH v10 05/18] KVM: arm64: Convert lazy FPSIMD context switch trap to C Date: Wed, 23 May 2018 20:35:13 +0100 Message-ID: <87k1rutbbi.fsf@linaro.org> References: <1527005119-6842-1-git-send-email-Dave.Martin@arm.com> <1527005119-6842-6-git-send-email-Dave.Martin@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-reply-to: <1527005119-6842-6-git-send-email-Dave.Martin@arm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org 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+IFRvIG1ha2UgdGhl IGxhenkgRlBTSU1EIGNvbnRleHQgc3dpdGNoIHRyYXAgY29kZSBlYXNpZXIgdG8gaGFjayBvbiwK PiB0aGlzIHBhdGNoIGNvbnZlcnRzIGl0IHRvIEMuCj4KPiBUaGlzIGlzIG5vdCBhbWF6aW5nbHkg ZWZmaWNpZW50LCBidXQgdGhlIHRyYXAgc2hvdWxkIHR5cGljYWxseSBvbmx5Cj4gYmUgdGFrZW4g b25jZSBwZXIgaG9zdCBjb250ZXh0IHN3aXRjaC4KPgo+IFNpZ25lZC1vZmYtYnk6IERhdmUgTWFy dGluIDxEYXZlLk1hcnRpbkBhcm0uY29tPgo+IFJldmlld2VkLWJ5OiBNYXJjIFp5bmdpZXIgPG1h cmMuenluZ2llckBhcm0uY29tPgo+IC0tLQo+ICBhcmNoL2FybTY0L2t2bS9oeXAvZW50cnkuUyAg fCA1NyArKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAgYXJj aC9hcm02NC9rdm0vaHlwL3N3aXRjaC5jIHwgMjQgKysrKysrKysrKysrKysrKysrKwo+ICAyIGZp bGVzIGNoYW5nZWQsIDQ2IGluc2VydGlvbnMoKyksIDM1IGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAt LWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9lbnRyeS5TIGIvYXJjaC9hcm02NC9rdm0vaHlwL2Vu dHJ5LlMKPiBpbmRleCBlNDFhMTYxLi40MGYzNDliIDEwMDY0NAo+IC0tLSBhL2FyY2gvYXJtNjQv a3ZtL2h5cC9lbnRyeS5TCj4gKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL2VudHJ5LlMKPiBAQCAt MTcyLDQwICsxNzIsMjcgQEAgRU5UUlkoX19mcHNpbWRfZ3Vlc3RfcmVzdG9yZSkKPiAgCS8vIHgx OiB2Y3B1Cj4gIAkvLyB4Mi14MjksbHI6IHZjcHUgcmVncwo+ICAJLy8gdmNwdSB4MC14MSBvbiB0 aGUgc3RhY2sKPiAtCXN0cAl4MiwgeDMsIFtzcCwgIy0xNl0hCj4gLQlzdHAJeDQsIGxyLCBbc3As ICMtMTZdIQo+IC0KPiAtYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X0hBU19WSVJUX0hPU1RfRVhU Tgo+IC0JbXJzCXgyLCBjcHRyX2VsMgo+IC0JYmljCXgyLCB4MiwgI0NQVFJfRUwyX1RGUAo+IC0J bXNyCWNwdHJfZWwyLCB4Mgo+IC1hbHRlcm5hdGl2ZV9lbHNlCj4gLQltcnMJeDIsIGNwYWNyX2Vs MQo+IC0Jb3JyCXgyLCB4MiwgI0NQQUNSX0VMMV9GUEVOCj4gLQltc3IJY3BhY3JfZWwxLCB4Mgo+ IC1hbHRlcm5hdGl2ZV9lbmRpZgo+IC0JaXNiCj4gLQo+IC0JbW92CXgzLCB4MQo+IC0KPiAtCWxk cgl4MCwgW3gzLCAjVkNQVV9IT1NUX0NPTlRFWFRdCj4gLQlrZXJuX2h5cF92YSB4MAo+IC0JYWRk CXgwLCB4MCwgI0NQVV9HUF9SRUdfT0ZGU0VUKENQVV9GUF9SRUdTKQo+IC0JYmwJX19mcHNpbWRf c2F2ZV9zdGF0ZQo+IC0KPiAtCWFkZAl4MiwgeDMsICNWQ1BVX0NPTlRFWFQKPiAtCWFkZAl4MCwg eDIsICNDUFVfR1BfUkVHX09GRlNFVChDUFVfRlBfUkVHUykKPiAtCWJsCV9fZnBzaW1kX3Jlc3Rv cmVfc3RhdGUKPiAtCj4gLQkvLyBTa2lwIHJlc3RvcmluZyBmcGV4YzMyIGZvciBBQXJjaDY0IGd1 ZXN0cwo+IC0JbXJzCXgxLCBoY3JfZWwyCj4gLQl0Ym56CXgxLCAjSENSX1JXX1NISUZULCAxZgo+ IC0JbGRyCXg0LCBbeDMsICNWQ1BVX0ZQRVhDMzJfRUwyXQo+IC0JbXNyCWZwZXhjMzJfZWwyLCB4 NAo+IC0xOgo+IC0JbGRwCXg0LCBsciwgW3NwXSwgIzE2Cj4gLQlsZHAJeDIsIHgzLCBbc3BdLCAj MTYKPiAtCWxkcAl4MCwgeDEsIFtzcF0sICMxNgo+IC0KPiArCXN0cAl4MiwgeDMsIFtzcCwgIy0x NDRdIQo+ICsJc3RwCXg0LCB4NSwgW3NwLCAjMTZdCj4gKwlzdHAJeDYsIHg3LCBbc3AsICMzMl0K PiArCXN0cAl4OCwgeDksIFtzcCwgIzQ4XQo+ICsJc3RwCXgxMCwgeDExLCBbc3AsICM2NF0KPiAr CXN0cAl4MTIsIHgxMywgW3NwLCAjODBdCj4gKwlzdHAJeDE0LCB4MTUsIFtzcCwgIzk2XQo+ICsJ c3RwCXgxNiwgeDE3LCBbc3AsICMxMTJdCj4gKwlzdHAJeDE4LCBsciwgW3NwLCAjMTI4XQo+ICsK PiArCWJsCV9faHlwX3N3aXRjaF9mcHNpbWQKPiArCj4gKwlsZHAJeDQsIHg1LCBbc3AsICMxNl0K PiArCWxkcAl4NiwgeDcsIFtzcCwgIzMyXQo+ICsJbGRwCXg4LCB4OSwgW3NwLCAjNDhdCj4gKwls ZHAJeDEwLCB4MTEsIFtzcCwgIzY0XQo+ICsJbGRwCXgxMiwgeDEzLCBbc3AsICM4MF0KPiArCWxk cAl4MTQsIHgxNSwgW3NwLCAjOTZdCj4gKwlsZHAJeDE2LCB4MTcsIFtzcCwgIzExMl0KPiArCWxk cAl4MTgsIGxyLCBbc3AsICMxMjhdCj4gKwlsZHAJeDAsIHgxLCBbc3AsICMxNDRdCj4gKwlsZHAJ eDIsIHgzLCBbc3BdLCAjMTYwCj4gIAllcmV0Cj4gIEVORFBST0MoX19mcHNpbWRfZ3Vlc3RfcmVz dG9yZSkKPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL3N3aXRjaC5jIGIvYXJjaC9h cm02NC9rdm0vaHlwL3N3aXRjaC5jCj4gaW5kZXggZDk2NDUyMy4uYzA3OTZjNCAxMDA2NDQKPiAt LS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvc3dpdGNoLmMKPiArKysgYi9hcmNoL2FybTY0L2t2bS9o eXAvc3dpdGNoLmMKPiBAQCAtMzE4LDYgKzMxOCwzMCBAQCBzdGF0aWMgYm9vbCBfX2h5cF90ZXh0 IF9fc2tpcF9pbnN0cihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4gIAl9Cj4gIH0KPgo+ICt2b2lk IF9faHlwX3RleHQgX19oeXBfc3dpdGNoX2Zwc2ltZCh1NjQgZXNyIF9fYWx3YXlzX3VudXNlZCwK PiArCQkJCSAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCj4gK3sKPiArCWt2bV9jcHVfY29udGV4 dF90ICpob3N0X2N0eHQ7Cj4gKwo+ICsJaWYgKGhhc192aGUoKSkKPiArCQl3cml0ZV9zeXNyZWco cmVhZF9zeXNyZWcoY3BhY3JfZWwxKSB8IENQQUNSX0VMMV9GUEVOLAo+ICsJCQkgICAgIGNwYWNy X2VsMSk7Cj4gKwllbHNlCj4gKwkJd3JpdGVfc3lzcmVnKHJlYWRfc3lzcmVnKGNwdHJfZWwyKSAm IH4odTY0KUNQVFJfRUwyX1RGUCwKPiArCQkJICAgICBjcHRyX2VsMik7CgpJcyB0aGVyZSBubyB3 YXkgdG8gZG8gYWx0ZXJuYXRpdmUoKSBpbiBDIG9yIGRvZXMgaXQgYWx3YXlzIGNvbWUgZG93biB0 bwpkaWZmZXJlbnQgaW5saW5lIGFzbXM/CgpBbnl3YXk6CgpSZXZpZXdlZC1ieTogQWxleCBCZW5u w6llIDxhbGV4LmJlbm5lZUBsaW5hcm8ub3JnPgoKCj4gKwo+ICsJaXNiKCk7Cj4gKwo+ICsJaG9z dF9jdHh0ID0ga2Vybl9oeXBfdmEodmNwdS0+YXJjaC5ob3N0X2NwdV9jb250ZXh0KTsKPiArCV9f ZnBzaW1kX3NhdmVfc3RhdGUoJmhvc3RfY3R4dC0+Z3BfcmVncy5mcF9yZWdzKTsKPiArCV9fZnBz aW1kX3Jlc3RvcmVfc3RhdGUoJnZjcHUtPmFyY2guY3R4dC5ncF9yZWdzLmZwX3JlZ3MpOwo+ICsK PiArCS8qIFNraXAgcmVzdG9yaW5nIGZwZXhjMzIgZm9yIEFBcmNoNjQgZ3Vlc3RzICovCj4gKwlp ZiAoIShyZWFkX3N5c3JlZyhoY3JfZWwyKSAmIEhDUl9SVykpCj4gKwkJd3JpdGVfc3lzcmVnKHZj cHUtPmFyY2guY3R4dC5zeXNfcmVnc1tGUEVYQzMyX0VMMl0sCj4gKwkJCSAgICAgZnBleGMzMl9l bDIpOwo+ICt9Cj4gKwo+ICAvKgo+ICAgKiBSZXR1cm4gdHJ1ZSB3aGVuIHdlIHdlcmUgYWJsZSB0 byBmaXh1cCB0aGUgZ3Vlc3QgZXhpdCBhbmQgc2hvdWxkIHJldHVybiB0bwo+ICAgKiB0aGUgZ3Vl c3QsIGZhbHNlIHdoZW4gd2Ugc2hvdWxkIHJlc3RvcmUgdGhlIGhvc3Qgc3RhdGUgYW5kIHJldHVy biB0byB0aGUKCgotLQpBbGV4IEJlbm7DqWUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFy bS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: alex.bennee@linaro.org (Alex =?utf-8?Q?Benn=C3=A9e?=) Date: Wed, 23 May 2018 20:35:13 +0100 Subject: [PATCH v10 05/18] KVM: arm64: Convert lazy FPSIMD context switch trap to C In-Reply-To: <1527005119-6842-6-git-send-email-Dave.Martin@arm.com> References: <1527005119-6842-1-git-send-email-Dave.Martin@arm.com> <1527005119-6842-6-git-send-email-Dave.Martin@arm.com> Message-ID: <87k1rutbbi.fsf@linaro.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Dave Martin writes: > To make the lazy FPSIMD context switch trap code easier to hack on, > this patch converts it to C. > > This is not amazingly efficient, but the trap should typically only > be taken once per host context switch. > > Signed-off-by: Dave Martin > Reviewed-by: Marc Zyngier > --- > arch/arm64/kvm/hyp/entry.S | 57 +++++++++++++++++---------------------------- > arch/arm64/kvm/hyp/switch.c | 24 +++++++++++++++++++ > 2 files changed, 46 insertions(+), 35 deletions(-) > > diff --git a/arch/arm64/kvm/hyp/entry.S b/arch/arm64/kvm/hyp/entry.S > index e41a161..40f349b 100644 > --- a/arch/arm64/kvm/hyp/entry.S > +++ b/arch/arm64/kvm/hyp/entry.S > @@ -172,40 +172,27 @@ ENTRY(__fpsimd_guest_restore) > // x1: vcpu > // x2-x29,lr: vcpu regs > // vcpu x0-x1 on the stack > - stp x2, x3, [sp, #-16]! > - stp x4, lr, [sp, #-16]! > - > -alternative_if_not ARM64_HAS_VIRT_HOST_EXTN > - mrs x2, cptr_el2 > - bic x2, x2, #CPTR_EL2_TFP > - msr cptr_el2, x2 > -alternative_else > - mrs x2, cpacr_el1 > - orr x2, x2, #CPACR_EL1_FPEN > - msr cpacr_el1, x2 > -alternative_endif > - isb > - > - mov x3, x1 > - > - ldr x0, [x3, #VCPU_HOST_CONTEXT] > - kern_hyp_va x0 > - add x0, x0, #CPU_GP_REG_OFFSET(CPU_FP_REGS) > - bl __fpsimd_save_state > - > - add x2, x3, #VCPU_CONTEXT > - add x0, x2, #CPU_GP_REG_OFFSET(CPU_FP_REGS) > - bl __fpsimd_restore_state > - > - // Skip restoring fpexc32 for AArch64 guests > - mrs x1, hcr_el2 > - tbnz x1, #HCR_RW_SHIFT, 1f > - ldr x4, [x3, #VCPU_FPEXC32_EL2] > - msr fpexc32_el2, x4 > -1: > - ldp x4, lr, [sp], #16 > - ldp x2, x3, [sp], #16 > - ldp x0, x1, [sp], #16 > - > + 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/switch.c b/arch/arm64/kvm/hyp/switch.c > index d964523..c0796c4 100644 > --- a/arch/arm64/kvm/hyp/switch.c > +++ b/arch/arm64/kvm/hyp/switch.c > @@ -318,6 +318,30 @@ static bool __hyp_text __skip_instr(struct kvm_vcpu *vcpu) > } > } > > +void __hyp_text __hyp_switch_fpsimd(u64 esr __always_unused, > + struct kvm_vcpu *vcpu) > +{ > + kvm_cpu_context_t *host_ctxt; > + > + if (has_vhe()) > + write_sysreg(read_sysreg(cpacr_el1) | CPACR_EL1_FPEN, > + cpacr_el1); > + else > + write_sysreg(read_sysreg(cptr_el2) & ~(u64)CPTR_EL2_TFP, > + cptr_el2); Is there no way to do alternative() in C or does it always come down to different inline asms? Anyway: Reviewed-by: Alex Benn?e > + > + isb(); > + > + host_ctxt = kern_hyp_va(vcpu->arch.host_cpu_context); > + __fpsimd_save_state(&host_ctxt->gp_regs.fp_regs); > + __fpsimd_restore_state(&vcpu->arch.ctxt.gp_regs.fp_regs); > + > + /* Skip restoring fpexc32 for AArch64 guests */ > + if (!(read_sysreg(hcr_el2) & HCR_RW)) > + write_sysreg(vcpu->arch.ctxt.sys_regs[FPEXC32_EL2], > + fpexc32_el2); > +} > + > /* > * Return true when we were able to fixup the guest exit and should return to > * the guest, false when we should restore the host state and return to the -- Alex Benn?e