From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex =?utf-8?Q?Benn=C3=A9e?= Subject: Re: [PATCH 07/27] arm64/sve: Low-level SVE architectural state manipulation functions Date: Mon, 21 Aug 2017 11:11:48 +0100 Message-ID: <878tid5ixn.fsf@linaro.org> References: <1502280338-23002-1-git-send-email-Dave.Martin@arm.com> <1502280338-23002-8-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: <1502280338-23002-8-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: linux-arch@vger.kernel.org, libc-alpha@sourceware.org, Ard Biesheuvel , Szabolcs Nagy , Catalin Marinas , Will Deacon , Richard Sandiford , kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org List-Id: linux-arch.vger.kernel.org CkRhdmUgTWFydGluIDxEYXZlLk1hcnRpbkBhcm0uY29tPiB3cml0ZXM6Cgo+IE1hbmlwdWxhdGlu ZyB0aGUgU1ZFIGFyY2hpdGVjdHVyYWwgc3RhdGUsIGluY2x1ZGluZyB0aGUgdmVjdG9yIGFuZAo+ IHByZWRpY2F0ZSByZWdpc3RlcnMsIGZpcnN0LWZhdWx0IHJlZ2lzdGVyIGFuZCB0aGUgdmVjdG9y IGxlbmd0aCwKPiByZXF1aXJlcyB0aGUgdXNlIG9mIGRlZGljYXRlZCBpbnN0cnVjdGlvbnMgYWRk ZWQgYnkgU1ZFLgo+Cj4gVGhpcyBwYXRjaCBhZGRzIHN1aXRhYmxlIGFzc2VtYmx5IGZ1bmN0aW9u cyBmb3Igc2F2aW5nIGFuZAo+IHJlc3RvcmluZyB0aGUgU1ZFIHJlZ2lzdGVycyBhbmQgcXVlcnlp bmcgdGhlIHZlY3RvciBsZW5ndGguCj4gU2V0dGluZyBvZiB0aGUgdmVjdG9yIGxlbmd0aCBpcyBk b25lIGFzIHBhcnQgb2YgcmVnaXN0ZXIgcmVzdG9yZS4KPgo+IFNpbmNlIHBlb3BsZSBidWlsZGlu ZyBrZXJuZWxzIG1heSBub3QgYWxsIGdldCBhbiBTVkUtZW5hYmxlZAo+IHRvb2xjaGFpbiBmb3Ig YSB3aGlsZSwgdGhpcyBwYXRjaCB1c2VzIG1hY3JvcyB0aGF0IGdlbmVyYXRlCj4gZXhwbGljaXQg b3Bjb2RlcyBpbiBwbGFjZSBvZiBhc3NlbWJsZXIgbW5lbW9uaWNzLgo+Cj4gU2lnbmVkLW9mZi1i eTogRGF2ZSBNYXJ0aW4gPERhdmUuTWFydGluQGFybS5jb20+Cj4gLS0tCj4gIGFyY2gvYXJtNjQv aW5jbHVkZS9hc20vZnBzaW1kLmggICAgICAgfCAgIDUgKysKPiAgYXJjaC9hcm02NC9pbmNsdWRl L2FzbS9mcHNpbWRtYWNyb3MuaCB8IDEzNyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4gIGFyY2gvYXJtNjQva2VybmVsL2VudHJ5LWZwc2ltZC5TICAgICAgfCAgMTcgKysrKysK PiAgMyBmaWxlcyBjaGFuZ2VkLCAxNTkgaW5zZXJ0aW9ucygrKQo+Cj4gZGlmZiAtLWdpdCBhL2Fy Y2gvYXJtNjQvaW5jbHVkZS9hc20vZnBzaW1kLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Zw c2ltZC5oCj4gaW5kZXggNDEwYzQ4MS4uMDI2YTdjNyAxMDA2NDQKPiAtLS0gYS9hcmNoL2FybTY0 L2luY2x1ZGUvYXNtL2Zwc2ltZC5oCj4gKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9mcHNp bWQuaAo+IEBAIC02Nyw2ICs2NywxMSBAQCBleHRlcm4gdm9pZCBmcHNpbWRfdXBkYXRlX2N1cnJl bnRfc3RhdGUoc3RydWN0IGZwc2ltZF9zdGF0ZSAqc3RhdGUpOwo+Cj4gIGV4dGVybiB2b2lkIGZw c2ltZF9mbHVzaF90YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0KTsKPgo+ICtl eHRlcm4gdm9pZCBzdmVfc2F2ZV9zdGF0ZSh2b2lkICpzdGF0ZSwgdTMyICpwZnBzcik7Cj4gK2V4 dGVybiB2b2lkIHN2ZV9sb2FkX3N0YXRlKHZvaWQgY29uc3QgKnN0YXRlLCB1MzIgY29uc3QgKnBm cHNyLAo+ICsJCQkgICB1bnNpZ25lZCBsb25nIHZxX21pbnVzXzEpOwo+ICtleHRlcm4gdW5zaWdu ZWQgaW50IHN2ZV9nZXRfdmwodm9pZCk7Cj4gKwo+ICAvKiBGb3IgdXNlIGJ5IEVGSSBydW50aW1l IHNlcnZpY2VzIGNhbGxzIG9ubHkgKi8KPiAgZXh0ZXJuIHZvaWQgX19lZmlfZnBzaW1kX2JlZ2lu KHZvaWQpOwo+ICBleHRlcm4gdm9pZCBfX2VmaV9mcHNpbWRfZW5kKHZvaWQpOwo+IGRpZmYgLS1n aXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Zwc2ltZG1hY3Jvcy5oIGIvYXJjaC9hcm02NC9p bmNsdWRlL2FzbS9mcHNpbWRtYWNyb3MuaAo+IGluZGV4IDBmNWZkZDMuLjUwMjMwNjQgMTAwNjQ0 Cj4gLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9mcHNpbWRtYWNyb3MuaAo+ICsrKyBiL2Fy Y2gvYXJtNjQvaW5jbHVkZS9hc20vZnBzaW1kbWFjcm9zLmgKPiBAQCAtNzUsMyArNzUsMTQwIEBA Cj4gIAlsZHIJd1x0bXBuciwgW1xzdGF0ZSwgIzE2ICogMiArIDRdCj4gIAlmcHNpbWRfcmVzdG9y ZV9mcGNyIHhcdG1wbnIsIFxzdGF0ZQo+ICAuZW5kbQo+ICsKPiArLm1hY3JvIF9jaGVja19nZW5l cmFsX3JlZyBucgo+ICsJLmlmIChcbnIpIDwgMCB8fCAoXG5yKSA+IDMwCj4gKwkJLmVycm9yICJC YWQgcmVnaXN0ZXIgbnVtYmVyIFxuci4iCj4gKwkuZW5kaWYKPiArLmVuZG0KPiArCj4gKy5tYWNy byBfc3ZlX2NoZWNrX3pyZWcgem5yCj4gKwkuaWYgKFx6bnIpIDwgMCB8fCAoXHpucikgPiAzMQo+ ICsJCS5lcnJvciAiQmFkIFNjYWxhYmxlIFZlY3RvciBFeHRlbnNpb24gdmVjdG9yIHJlZ2lzdGVy IG51bWJlciBcem5yLiIKPiArCS5lbmRpZgo+ICsuZW5kbQo+ICsKPiArLm1hY3JvIF9zdmVfY2hl Y2tfcHJlZyBwbnIKPiArCS5pZiAoXHBucikgPCAwIHx8IChccG5yKSA+IDE1Cj4gKwkJLmVycm9y ICJCYWQgU2NhbGFibGUgVmVjdG9yIEV4dGVuc2lvbiBwcmVkaWNhdGUgcmVnaXN0ZXIgbnVtYmVy IFxwbnIuIgo+ICsJLmVuZGlmCj4gKy5lbmRtCj4gKwo+ICsubWFjcm8gX2NoZWNrX251bSBuLCBt aW4sIG1heAo+ICsJLmlmIChcbikgPCAoXG1pbikgfHwgKFxuKSA+IChcbWF4KQo+ICsJCS5lcnJv ciAiTnVtYmVyIFxuIG91dCBvZiByYW5nZSBbXG1pbixcbWF4XSIKPiArCS5lbmRpZgo+ICsuZW5k bQo+ICsKPiArLm1hY3JvIF9zdmVfc3RyX3YgbnosIG54YmFzZSwgb2Zmc2V0PTAKPiArCV9zdmVf Y2hlY2tfenJlZyBcbnoKPiArCV9jaGVja19nZW5lcmFsX3JlZyBcbnhiYXNlCj4gKwlfY2hlY2tf bnVtIChcb2Zmc2V0KSwgLTB4MTAwLCAweGZmCj4gKwkuaW5zdAkweGU1ODA0MDAwCQkJXAo+ICsJ CXwgKFxueikJCQkJXAo+ICsJCXwgKChcbnhiYXNlKSA8PCA1KQkJXAo+ICsJCXwgKCgoXG9mZnNl dCkgJiA3KSA8PCAxMCkJXAo+ICsJCXwgKCgoXG9mZnNldCkgJiAweDFmOCkgPDwgMTMpCj4gKy5l bmRtCgpDYW4gd2UgaGF2ZSByZWZlcmVuY2VzIHRvIHRoZSBBUk0gQVJNIHRpdGxlcyAodGhlIHNl Y3Rpb24gbnVtYmVycyBrZWVwCmNoYW5naW5nKSBmb3IgZWFjaCBoYW5kLWhhY2tlZCBpbnN0cnVj dGlvbiBwbGVhc2UuIE90aGVyd2lzZSBpdCBpcwppbXBvc3NpYmxlIHRvIHZlcmlmeSBlYWNoIG9u ZS4KCj4gKwo+ICsubWFjcm8gX3N2ZV9sZHJfdiBueiwgbnhiYXNlLCBvZmZzZXQ9MAo+ICsJX3N2 ZV9jaGVja196cmVnIFxuego+ICsJX2NoZWNrX2dlbmVyYWxfcmVnIFxueGJhc2UKPiArCV9jaGVj a19udW0gKFxvZmZzZXQpLCAtMHgxMDAsIDB4ZmYKPiArCS5pbnN0CTB4ODU4MDQwMDAJCQlcCj4g KwkJfCAoXG56KQkJCQlcCj4gKwkJfCAoKFxueGJhc2UpIDw8IDUpCQlcCj4gKwkJfCAoKChcb2Zm c2V0KSAmIDcpIDw8IDEwKQlcCj4gKwkJfCAoKChcb2Zmc2V0KSAmIDB4MWY4KSA8PCAxMykKPiAr LmVuZG0KPiArCj4gKy5tYWNybyBfc3ZlX3N0cl9wIG5wLCBueGJhc2UsIG9mZnNldD0wCj4gKwlf c3ZlX2NoZWNrX3ByZWcgXG5wCj4gKwlfY2hlY2tfZ2VuZXJhbF9yZWcgXG54YmFzZQo+ICsJX2No ZWNrX251bSAoXG9mZnNldCksIC0weDEwMCwgMHhmZgo+ICsJLmluc3QJMHhlNTgwMDAwMAkJCVwK PiArCQl8IChcbnApCQkJCVwKPiArCQl8ICgoXG54YmFzZSkgPDwgNSkJCVwKPiArCQl8ICgoKFxv ZmZzZXQpICYgNykgPDwgMTApCVwKPiArCQl8ICgoKFxvZmZzZXQpICYgMHgxZjgpIDw8IDEzKQo+ ICsuZW5kbQo+ICsKPiArLm1hY3JvIF9zdmVfbGRyX3AgbnAsIG54YmFzZSwgb2Zmc2V0PTAKPiAr CV9zdmVfY2hlY2tfcHJlZyBcbnAKPiArCV9jaGVja19nZW5lcmFsX3JlZyBcbnhiYXNlCj4gKwlf Y2hlY2tfbnVtIChcb2Zmc2V0KSwgLTB4MTAwLCAweGZmCj4gKwkuaW5zdAkweDg1ODAwMDAwCQkJ XAo+ICsJCXwgKFxucCkJCQkJXAo+ICsJCXwgKChcbnhiYXNlKSA8PCA1KQkJXAo+ICsJCXwgKCgo XG9mZnNldCkgJiA3KSA8PCAxMCkJXAo+ICsJCXwgKCgoXG9mZnNldCkgJiAweDFmOCkgPDwgMTMp Cj4gKy5lbmRtCj4gKwo+ICsubWFjcm8gX3N2ZV9yZHZsIG54LCBpbW0KPiArCV9jaGVja19nZW5l cmFsX3JlZyBcbngKPiArCV9jaGVja19udW0gKFxpbW0pLCAtMHgyMCwgMHgxZgo+ICsJLmluc3QJ MHgwNGJmNTAwMAkJCVwKPiArCQl8IChcbngpCQkJCVwKPiArCQl8ICgoKFxpbW0pICYgMHgzZikg PDwgNSkKPiArLmVuZG0KPiArCj4gKy5tYWNybyBfc3ZlX3JkZmZyIG5wCj4gKwlfc3ZlX2NoZWNr X3ByZWcgXG5wCj4gKwkuaW5zdAkweDI1MTlmMDAwCQkJXAo+ICsJCXwgKFxucCkKPiArLmVuZG0K PiArCj4gKy5tYWNybyBfc3ZlX3dyZmZyIG5wCj4gKwlfc3ZlX2NoZWNrX3ByZWcgXG5wCj4gKwku aW5zdAkweDI1Mjg5MDAwCQkJXAo+ICsJCXwgKChcbnApIDw8IDUpCj4gKy5lbmRtCj4gKwo+ICsu bWFjcm8gX19mb3IgZnJvbTpyZXEsIHRvOnJlcQo+ICsJLmlmIChcZnJvbSkgPT0gKFx0bykKPiAr CQlfZm9yX19ib2R5IFxmcm9tCj4gKwkuZWxzZQo+ICsJCV9fZm9yIFxmcm9tLCAoXGZyb20pICsg KChcdG8pIC0gKFxmcm9tKSkgLyAyCj4gKwkJX19mb3IgKFxmcm9tKSArICgoXHRvKSAtIChcZnJv bSkpIC8gMiArIDEsIFx0bwo+ICsJLmVuZGlmCj4gKy5lbmRtCj4gKwo+ICsubWFjcm8gX2ZvciB2 YXI6cmVxLCBmcm9tOnJlcSwgdG86cmVxLCBpbnNuOnZhcmFyZwo+ICsJLm1hY3JvIF9mb3JfX2Jv ZHkgXHZhcjpyZXEKPiArCQlcaW5zbgo+ICsJLmVuZG0KPiArCj4gKwlfX2ZvciBcZnJvbSwgXHRv Cj4gKwo+ICsJLnB1cmdlbSBfZm9yX19ib2R5Cj4gKy5lbmRtCj4gKwo+ICsubWFjcm8gc3ZlX3Nh dmUgbnhiYXNlLCB4cGZwc3IsIG54dG1wCj4gKyBfZm9yIG4sIDAsIDMxLAlfc3ZlX3N0cl92CVxu LCBcbnhiYXNlLCBcbiAtIDM0Cj4gKyBfZm9yIG4sIDAsIDE1LAlfc3ZlX3N0cl9wCVxuLCBcbnhi YXNlLCBcbiAtIDE2Cj4gKwkJX3N2ZV9yZGZmcgkwCj4gKwkJX3N2ZV9zdHJfcAkwLCBcbnhiYXNl Cj4gKwkJX3N2ZV9sZHJfcAkwLCBcbnhiYXNlLCAtMTYKPiArCj4gKwkJbXJzCQl4XG54dG1wLCBm cHNyCj4gKwkJc3RyCQl3XG54dG1wLCBbXHhwZnBzcl0KPiArCQltcnMJCXhcbnh0bXAsIGZwY3IK PiArCQlzdHIJCXdcbnh0bXAsIFtceHBmcHNyLCAjNF0KPiArLmVuZG0KPiArCj4gKy5tYWNybyBz dmVfbG9hZCBueGJhc2UsIHhwZnBzciwgeHZxbWludXMxLCBueHRtcAo+ICsJCW1yc19zCQl4XG54 dG1wLCBTWVNfWkNSX0VMMQo+ICsJCWJpYwkJeFxueHRtcCwgeFxueHRtcCwgWkNSX0VMeF9MRU5f TUFTSwo+ICsJCW9ycgkJeFxueHRtcCwgeFxueHRtcCwgXHh2cW1pbnVzMQo+ICsJCW1zcl9zCQlT WVNfWkNSX0VMMSwgeFxueHRtcAkvLyBzZWxmLXN5bmNocm9uaXNpbmcKPiArCj4gKyBfZm9yIG4s IDAsIDMxLAlfc3ZlX2xkcl92CVxuLCBcbnhiYXNlLCBcbiAtIDM0Cj4gKwkJX3N2ZV9sZHJfcAkw LCBcbnhiYXNlCj4gKwkJX3N2ZV93cmZmcgkwCj4gKyBfZm9yIG4sIDAsIDE1LAlfc3ZlX2xkcl9w CVxuLCBcbnhiYXNlLCBcbiAtIDE2Cj4gKwo+ICsJCWxkcgkJd1xueHRtcCwgW1x4cGZwc3JdCj4g KwkJbXNyCQlmcHNyLCB4XG54dG1wCj4gKwkJbGRyCQl3XG54dG1wLCBbXHhwZnBzciwgIzRdCj4g KwkJbXNyCQlmcGNyLCB4XG54dG1wCj4gKy5lbmRtCj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQv a2VybmVsL2VudHJ5LWZwc2ltZC5TIGIvYXJjaC9hcm02NC9rZXJuZWwvZW50cnktZnBzaW1kLlMK PiBpbmRleCA2YTI3Y2Q2Li43M2YxN2JmIDEwMDY0NAo+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVs L2VudHJ5LWZwc2ltZC5TCj4gKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvZW50cnktZnBzaW1kLlMK PiBAQCAtNDEsMyArNDEsMjAgQEAgRU5UUlkoZnBzaW1kX2xvYWRfc3RhdGUpCj4gIAlmcHNpbWRf cmVzdG9yZSB4MCwgOAo+ICAJcmV0Cj4gIEVORFBST0MoZnBzaW1kX2xvYWRfc3RhdGUpCj4gKwo+ ICsjaWZkZWYgQ09ORklHX0FSTTY0X1NWRQo+ICtFTlRSWShzdmVfc2F2ZV9zdGF0ZSkKPiArCXN2 ZV9zYXZlIDAsIHgxLCAyCj4gKwlyZXQKPiArRU5EUFJPQyhzdmVfc2F2ZV9zdGF0ZSkKPiArCj4g K0VOVFJZKHN2ZV9sb2FkX3N0YXRlKQo+ICsJc3ZlX2xvYWQgMCwgeDEsIHgyLCAzCj4gKwlyZXQK PiArRU5EUFJPQyhzdmVfbG9hZF9zdGF0ZSkKPiArCj4gK0VOVFJZKHN2ZV9nZXRfdmwpCj4gKwlf c3ZlX3JkdmwJMCwgMQo+ICsJcmV0Cj4gK0VORFBST0Moc3ZlX2dldF92bCkKPiArI2VuZGlmIC8q IENPTkZJR19BUk02NF9TVkUgKi8KCgotLQpBbGV4IEJlbm7DqWUKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18Ka3ZtYXJtIG1haWxpbmcgbGlzdAprdm1hcm1A bGlzdHMuY3MuY29sdW1iaWEuZWR1Cmh0dHBzOi8vbGlzdHMuY3MuY29sdW1iaWEuZWR1L21haWxt YW4vbGlzdGluZm8va3ZtYXJtCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-f171.google.com ([209.85.128.171]:34956 "EHLO mail-wr0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752007AbdHUKLv (ORCPT ); Mon, 21 Aug 2017 06:11:51 -0400 Received: by mail-wr0-f171.google.com with SMTP id k46so19902683wre.2 for ; Mon, 21 Aug 2017 03:11:50 -0700 (PDT) References: <1502280338-23002-1-git-send-email-Dave.Martin@arm.com> <1502280338-23002-8-git-send-email-Dave.Martin@arm.com> From: Alex =?utf-8?Q?Benn=C3=A9e?= Subject: Re: [PATCH 07/27] arm64/sve: Low-level SVE architectural state manipulation functions In-reply-to: <1502280338-23002-8-git-send-email-Dave.Martin@arm.com> Date: Mon, 21 Aug 2017 11:11:48 +0100 Message-ID: <878tid5ixn.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-arch-owner@vger.kernel.org List-ID: To: Dave Martin Cc: linux-arm-kernel@lists.infradead.org, linux-arch@vger.kernel.org, libc-alpha@sourceware.org, Ard Biesheuvel , Szabolcs Nagy , Catalin Marinas , Will Deacon , Richard Sandiford , kvmarm@lists.cs.columbia.edu Message-ID: <20170821101148.qSABbnBYIxATkp2mr10zw28TQeu_94w_tmos8tM2x_w@z> Dave Martin writes: > Manipulating the SVE architectural state, including the vector and > predicate registers, first-fault register and the vector length, > requires the use of dedicated instructions added by SVE. > > This patch adds suitable assembly functions for saving and > restoring the SVE registers and querying the vector length. > Setting of the vector length is done as part of register restore. > > Since people building kernels may not all get an SVE-enabled > toolchain for a while, this patch uses macros that generate > explicit opcodes in place of assembler mnemonics. > > Signed-off-by: Dave Martin > --- > arch/arm64/include/asm/fpsimd.h | 5 ++ > arch/arm64/include/asm/fpsimdmacros.h | 137 ++++++++++++++++++++++++++++++++++ > arch/arm64/kernel/entry-fpsimd.S | 17 +++++ > 3 files changed, 159 insertions(+) > > diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h > index 410c481..026a7c7 100644 > --- a/arch/arm64/include/asm/fpsimd.h > +++ b/arch/arm64/include/asm/fpsimd.h > @@ -67,6 +67,11 @@ extern void fpsimd_update_current_state(struct fpsimd_state *state); > > extern void fpsimd_flush_task_state(struct task_struct *target); > > +extern void sve_save_state(void *state, u32 *pfpsr); > +extern void sve_load_state(void const *state, u32 const *pfpsr, > + unsigned long vq_minus_1); > +extern unsigned int sve_get_vl(void); > + > /* For use by EFI runtime services calls only */ > extern void __efi_fpsimd_begin(void); > extern void __efi_fpsimd_end(void); > diff --git a/arch/arm64/include/asm/fpsimdmacros.h b/arch/arm64/include/asm/fpsimdmacros.h > index 0f5fdd3..5023064 100644 > --- a/arch/arm64/include/asm/fpsimdmacros.h > +++ b/arch/arm64/include/asm/fpsimdmacros.h > @@ -75,3 +75,140 @@ > ldr w\tmpnr, [\state, #16 * 2 + 4] > fpsimd_restore_fpcr x\tmpnr, \state > .endm > + > +.macro _check_general_reg nr > + .if (\nr) < 0 || (\nr) > 30 > + .error "Bad register number \nr." > + .endif > +.endm > + > +.macro _sve_check_zreg znr > + .if (\znr) < 0 || (\znr) > 31 > + .error "Bad Scalable Vector Extension vector register number \znr." > + .endif > +.endm > + > +.macro _sve_check_preg pnr > + .if (\pnr) < 0 || (\pnr) > 15 > + .error "Bad Scalable Vector Extension predicate register number \pnr." > + .endif > +.endm > + > +.macro _check_num n, min, max > + .if (\n) < (\min) || (\n) > (\max) > + .error "Number \n out of range [\min,\max]" > + .endif > +.endm > + > +.macro _sve_str_v nz, nxbase, offset=0 > + _sve_check_zreg \nz > + _check_general_reg \nxbase > + _check_num (\offset), -0x100, 0xff > + .inst 0xe5804000 \ > + | (\nz) \ > + | ((\nxbase) << 5) \ > + | (((\offset) & 7) << 10) \ > + | (((\offset) & 0x1f8) << 13) > +.endm Can we have references to the ARM ARM titles (the section numbers keep changing) for each hand-hacked instruction please. Otherwise it is impossible to verify each one. > + > +.macro _sve_ldr_v nz, nxbase, offset=0 > + _sve_check_zreg \nz > + _check_general_reg \nxbase > + _check_num (\offset), -0x100, 0xff > + .inst 0x85804000 \ > + | (\nz) \ > + | ((\nxbase) << 5) \ > + | (((\offset) & 7) << 10) \ > + | (((\offset) & 0x1f8) << 13) > +.endm > + > +.macro _sve_str_p np, nxbase, offset=0 > + _sve_check_preg \np > + _check_general_reg \nxbase > + _check_num (\offset), -0x100, 0xff > + .inst 0xe5800000 \ > + | (\np) \ > + | ((\nxbase) << 5) \ > + | (((\offset) & 7) << 10) \ > + | (((\offset) & 0x1f8) << 13) > +.endm > + > +.macro _sve_ldr_p np, nxbase, offset=0 > + _sve_check_preg \np > + _check_general_reg \nxbase > + _check_num (\offset), -0x100, 0xff > + .inst 0x85800000 \ > + | (\np) \ > + | ((\nxbase) << 5) \ > + | (((\offset) & 7) << 10) \ > + | (((\offset) & 0x1f8) << 13) > +.endm > + > +.macro _sve_rdvl nx, imm > + _check_general_reg \nx > + _check_num (\imm), -0x20, 0x1f > + .inst 0x04bf5000 \ > + | (\nx) \ > + | (((\imm) & 0x3f) << 5) > +.endm > + > +.macro _sve_rdffr np > + _sve_check_preg \np > + .inst 0x2519f000 \ > + | (\np) > +.endm > + > +.macro _sve_wrffr np > + _sve_check_preg \np > + .inst 0x25289000 \ > + | ((\np) << 5) > +.endm > + > +.macro __for from:req, to:req > + .if (\from) == (\to) > + _for__body \from > + .else > + __for \from, (\from) + ((\to) - (\from)) / 2 > + __for (\from) + ((\to) - (\from)) / 2 + 1, \to > + .endif > +.endm > + > +.macro _for var:req, from:req, to:req, insn:vararg > + .macro _for__body \var:req > + \insn > + .endm > + > + __for \from, \to > + > + .purgem _for__body > +.endm > + > +.macro sve_save nxbase, xpfpsr, nxtmp > + _for n, 0, 31, _sve_str_v \n, \nxbase, \n - 34 > + _for n, 0, 15, _sve_str_p \n, \nxbase, \n - 16 > + _sve_rdffr 0 > + _sve_str_p 0, \nxbase > + _sve_ldr_p 0, \nxbase, -16 > + > + mrs x\nxtmp, fpsr > + str w\nxtmp, [\xpfpsr] > + mrs x\nxtmp, fpcr > + str w\nxtmp, [\xpfpsr, #4] > +.endm > + > +.macro sve_load nxbase, xpfpsr, xvqminus1, nxtmp > + mrs_s x\nxtmp, SYS_ZCR_EL1 > + bic x\nxtmp, x\nxtmp, ZCR_ELx_LEN_MASK > + orr x\nxtmp, x\nxtmp, \xvqminus1 > + msr_s SYS_ZCR_EL1, x\nxtmp // self-synchronising > + > + _for n, 0, 31, _sve_ldr_v \n, \nxbase, \n - 34 > + _sve_ldr_p 0, \nxbase > + _sve_wrffr 0 > + _for n, 0, 15, _sve_ldr_p \n, \nxbase, \n - 16 > + > + ldr w\nxtmp, [\xpfpsr] > + msr fpsr, x\nxtmp > + ldr w\nxtmp, [\xpfpsr, #4] > + msr fpcr, x\nxtmp > +.endm > diff --git a/arch/arm64/kernel/entry-fpsimd.S b/arch/arm64/kernel/entry-fpsimd.S > index 6a27cd6..73f17bf 100644 > --- a/arch/arm64/kernel/entry-fpsimd.S > +++ b/arch/arm64/kernel/entry-fpsimd.S > @@ -41,3 +41,20 @@ ENTRY(fpsimd_load_state) > fpsimd_restore x0, 8 > ret > ENDPROC(fpsimd_load_state) > + > +#ifdef CONFIG_ARM64_SVE > +ENTRY(sve_save_state) > + sve_save 0, x1, 2 > + ret > +ENDPROC(sve_save_state) > + > +ENTRY(sve_load_state) > + sve_load 0, x1, x2, 3 > + ret > +ENDPROC(sve_load_state) > + > +ENTRY(sve_get_vl) > + _sve_rdvl 0, 1 > + ret > +ENDPROC(sve_get_vl) > +#endif /* CONFIG_ARM64_SVE */ -- Alex Bennée