From: Dave Martin <Dave.Martin@arm.com>
To: Andrew Jones <drjones@redhat.com>
Cc: "peter.maydell@linaro.org" <peter.maydell@linaro.org>,
"richard.henderson@linaro.org" <richard.henderson@linaro.org>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
"armbru@redhat.com" <armbru@redhat.com>,
"qemu-arm@nongnu.org" <qemu-arm@nongnu.org>,
"abologna@redhat.com" <abologna@redhat.com>,
"alex.bennee@linaro.org" <alex.bennee@linaro.org>
Subject: Re: [Qemu-devel] [PATCH 05/13] target/arm/kvm: Add kvm_arch_get/put_sve
Date: Mon, 13 May 2019 16:31:16 +0100 [thread overview]
Message-ID: <20190513153116.GL28398@e103592.cambridge.arm.com> (raw)
In-Reply-To: <20190513135501.ztggqdac57qbpuft@kamzik.brq.redhat.com>
On Mon, May 13, 2019 at 02:55:01PM +0100, Andrew Jones wrote:
> On Mon, May 13, 2019 at 01:31:11PM +0100, Dave Martin wrote:
> > On Sun, May 12, 2019 at 09:36:16AM +0100, Andrew Jones wrote:
> > > These are the SVE equivalents to kvm_arch_get/put_fpsimd.
> > >
> > > Signed-off-by: Andrew Jones <drjones@redhat.com>
> > > ---
> > > target/arm/kvm64.c | 127 +++++++++++++++++++++++++++++++++++++++++++--
> > > 1 file changed, 123 insertions(+), 4 deletions(-)
> >
> > [...]
> >
> > > +static int kvm_arch_put_sve(CPUState *cs)
> > > +{
> > > + ARMCPU *cpu = ARM_CPU(cs);
> > > + CPUARMState *env = &cpu->env;
> > > + struct kvm_one_reg reg;
> > > + int n, ret;
> > > +
> > > + for (n = 0; n < KVM_ARM64_SVE_NUM_ZREGS; n++) {
> > > + uint64_t *q = aa64_vfp_qreg(env, n);
> > > +#ifdef HOST_WORDS_BIGENDIAN
> > > + uint64_t d[ARM_MAX_VQ * 2];
> > > + int i;
> > > + for (i = 0; i < cpu->sve_max_vq * 2; i++) {
> > > + d[i] = q[cpu->sve_max_vq * 2 - 1 - i];
> > > + }
> >
> > Out of interest, why do all this swabbing? It seems expensive.
> >
>
> QEMU keeps its 128-bit and larger words in the same order (least
> significant word first) for both host endian types. We need to
> do word swapping every time we set/get them to/from KVM.
I'm not sure whether this is appropriate here, though it depends on
what QEMU does with the data.
Something non-obvious to be aware of:
As exposed through the signal frame and the KVM ABI, the memory
representation of an SVE reg is invariant with respect to the
endianness.
IIUC, the byte order seen for a V-reg in KVM_REG_ARM_CORE and for
the equivalent Z-reg in KVM_REG_ARM64_SVE would be the opposite of each
other on BE, but the same on LE.
This is a feature of the archtiecture: a V-reg can be stored as a single
value, but Z-regs are in general too big to be treated as a single
value: they are always treated as a sequence of elements, and the
largest element size supported is 64 bits, not 128. IIUC, there is no
direct native way to store with 128-bit swabbing: some explicit data
processing operation would also be needed to swap adjacent 64-bit
elements in the vector around the store/load.
This is not specified in the ABI documentation -- I should address that.
If this is infeasible for KVM to work with, we could perhaps change it,
but I'm not too keen on that at this stage. KVM_REG_ARM64_SVE_VLS
has a similar behaviour: it's a vector of 64-bit possibly-swabbed words,
not a single possibly-swabbed 512-bit word.
Looking at the kernel, I may have screwed up in places where the
two representations interact, like fpsimd_to_sve(). I should take a
look at that... This doesn't affect the KVM ABI though.
Cheers
---Dave
WARNING: multiple messages have this Message-ID (diff)
From: Dave Martin <Dave.Martin@arm.com>
To: Andrew Jones <drjones@redhat.com>
Cc: "peter.maydell@linaro.org" <peter.maydell@linaro.org>,
"armbru@redhat.com" <armbru@redhat.com>,
"richard.henderson@linaro.org" <richard.henderson@linaro.org>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
"abologna@redhat.com" <abologna@redhat.com>,
"qemu-arm@nongnu.org" <qemu-arm@nongnu.org>,
"alex.bennee@linaro.org" <alex.bennee@linaro.org>
Subject: Re: [Qemu-devel] [PATCH 05/13] target/arm/kvm: Add kvm_arch_get/put_sve
Date: Mon, 13 May 2019 16:31:16 +0100 [thread overview]
Message-ID: <20190513153116.GL28398@e103592.cambridge.arm.com> (raw)
In-Reply-To: <20190513135501.ztggqdac57qbpuft@kamzik.brq.redhat.com>
On Mon, May 13, 2019 at 02:55:01PM +0100, Andrew Jones wrote:
> On Mon, May 13, 2019 at 01:31:11PM +0100, Dave Martin wrote:
> > On Sun, May 12, 2019 at 09:36:16AM +0100, Andrew Jones wrote:
> > > These are the SVE equivalents to kvm_arch_get/put_fpsimd.
> > >
> > > Signed-off-by: Andrew Jones <drjones@redhat.com>
> > > ---
> > > target/arm/kvm64.c | 127 +++++++++++++++++++++++++++++++++++++++++++--
> > > 1 file changed, 123 insertions(+), 4 deletions(-)
> >
> > [...]
> >
> > > +static int kvm_arch_put_sve(CPUState *cs)
> > > +{
> > > + ARMCPU *cpu = ARM_CPU(cs);
> > > + CPUARMState *env = &cpu->env;
> > > + struct kvm_one_reg reg;
> > > + int n, ret;
> > > +
> > > + for (n = 0; n < KVM_ARM64_SVE_NUM_ZREGS; n++) {
> > > + uint64_t *q = aa64_vfp_qreg(env, n);
> > > +#ifdef HOST_WORDS_BIGENDIAN
> > > + uint64_t d[ARM_MAX_VQ * 2];
> > > + int i;
> > > + for (i = 0; i < cpu->sve_max_vq * 2; i++) {
> > > + d[i] = q[cpu->sve_max_vq * 2 - 1 - i];
> > > + }
> >
> > Out of interest, why do all this swabbing? It seems expensive.
> >
>
> QEMU keeps its 128-bit and larger words in the same order (least
> significant word first) for both host endian types. We need to
> do word swapping every time we set/get them to/from KVM.
I'm not sure whether this is appropriate here, though it depends on
what QEMU does with the data.
Something non-obvious to be aware of:
As exposed through the signal frame and the KVM ABI, the memory
representation of an SVE reg is invariant with respect to the
endianness.
IIUC, the byte order seen for a V-reg in KVM_REG_ARM_CORE and for
the equivalent Z-reg in KVM_REG_ARM64_SVE would be the opposite of each
other on BE, but the same on LE.
This is a feature of the archtiecture: a V-reg can be stored as a single
value, but Z-regs are in general too big to be treated as a single
value: they are always treated as a sequence of elements, and the
largest element size supported is 64 bits, not 128. IIUC, there is no
direct native way to store with 128-bit swabbing: some explicit data
processing operation would also be needed to swap adjacent 64-bit
elements in the vector around the store/load.
This is not specified in the ABI documentation -- I should address that.
If this is infeasible for KVM to work with, we could perhaps change it,
but I'm not too keen on that at this stage. KVM_REG_ARM64_SVE_VLS
has a similar behaviour: it's a vector of 64-bit possibly-swabbed words,
not a single possibly-swabbed 512-bit word.
Looking at the kernel, I may have screwed up in places where the
two representations interact, like fpsimd_to_sve(). I should take a
look at that... This doesn't affect the KVM ABI though.
Cheers
---Dave
next prev parent reply other threads:[~2019-05-13 15:31 UTC|newest]
Thread overview: 131+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-12 8:36 [PATCH 00/13] target/arm/kvm: enable SVE in guests Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 01/13] target/arm/kvm64: fix error returns Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-06-05 7:20 ` Auger Eric
2019-05-12 8:36 ` [PATCH 02/13] update-linux-headers: Add sve_context.h to asm-arm64 Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-06-05 7:21 ` Auger Eric
2019-06-05 7:30 ` Andrew Jones
2019-06-05 7:30 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 03/13] HACK: linux header update Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 04/13] target/arm/kvm: Move the get/put of fpsimd registers out Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-06-05 7:15 ` Auger Eric
2019-06-05 7:27 ` Andrew Jones
2019-06-05 7:27 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 05/13] target/arm/kvm: Add kvm_arch_get/put_sve Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 12:31 ` Dave Martin
2019-05-13 12:31 ` [Qemu-devel] " Dave Martin
2019-05-13 13:55 ` Andrew Jones
2019-05-13 13:55 ` Andrew Jones
2019-05-13 15:31 ` Dave Martin [this message]
2019-05-13 15:31 ` Dave Martin
2019-05-13 15:40 ` Peter Maydell
2019-05-13 15:40 ` Peter Maydell
2019-05-13 16:05 ` Dave Martin
2019-05-13 16:05 ` Dave Martin
2019-05-13 16:40 ` Richard Henderson
2019-05-13 16:40 ` [Qemu-devel] " Richard Henderson
2019-05-13 18:14 ` Andrew Jones
2019-05-13 18:14 ` [Qemu-devel] " Andrew Jones
2019-05-13 18:31 ` Richard Henderson
2019-05-13 18:31 ` [Qemu-devel] " Richard Henderson
2019-05-13 12:43 ` Dave Martin
2019-05-13 12:43 ` [Qemu-devel] " Dave Martin
2019-05-13 14:07 ` Andrew Jones
2019-05-13 14:07 ` Andrew Jones
2019-05-13 14:39 ` Dave Martin
2019-05-13 14:39 ` Dave Martin
2019-05-13 16:58 ` Richard Henderson
2019-05-13 16:58 ` Richard Henderson
2019-05-14 9:10 ` Dave Martin
2019-05-14 9:10 ` Dave Martin
2019-05-12 8:36 ` [PATCH 06/13] target/arm/kvm: max cpu: Enable SVE when available Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-06-05 9:09 ` Auger Eric
2019-06-05 11:04 ` Andrew Jones
2019-06-05 11:04 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 07/13] target/arm/kvm: max cpu: Allow sve max vector length setting Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 17:19 ` Richard Henderson
2019-05-13 17:19 ` [Qemu-devel] " Richard Henderson
2019-05-13 18:19 ` Andrew Jones
2019-05-13 18:19 ` Andrew Jones
2019-06-06 8:30 ` Auger Eric
2019-06-06 8:53 ` Andrew Jones
2019-06-06 8:53 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 08/13] target/arm/monitor: Add query-sve-vector-lengths Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 16:12 ` Markus Armbruster
2019-05-13 16:12 ` Markus Armbruster
2019-05-13 18:30 ` Andrew Jones
2019-05-13 18:30 ` Andrew Jones
2019-05-14 5:32 ` Markus Armbruster
2019-05-12 8:36 ` [PATCH 09/13] target/arm/kvm: Export kvm_arm_get_sve_vls Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 10/13] target/arm/monitor: kvm: only return valid sve vector sets Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 11/13] target/arm/cpu64: max cpu: Introduce sve-vls-map Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 11:26 ` Dave Martin
2019-05-13 11:26 ` [Qemu-devel] " Dave Martin
2019-05-13 12:30 ` Andrew Jones
2019-05-13 12:30 ` Andrew Jones
2019-05-13 12:41 ` Dave Martin
2019-05-13 12:41 ` Dave Martin
2019-05-13 12:57 ` Andrew Jones
2019-05-13 12:57 ` Andrew Jones
2019-05-13 13:12 ` Dave Martin
2019-05-13 13:12 ` Dave Martin
2019-05-13 13:45 ` Andrew Jones
2019-05-13 13:45 ` Andrew Jones
2019-05-13 14:35 ` Dave Martin
2019-05-13 14:35 ` Dave Martin
2019-05-13 15:25 ` Markus Armbruster
2019-05-13 15:25 ` Markus Armbruster
2019-05-13 18:31 ` Andrew Jones
2019-05-13 18:31 ` Andrew Jones
2019-05-12 8:36 ` [PATCH 12/13] target/arm/kvm: max cpu: Add support for sve-vls-map Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-12 8:36 ` [PATCH 13/13] target/arm/kvm: host " Andrew Jones
2019-05-12 8:36 ` [Qemu-devel] " Andrew Jones
2019-05-13 15:37 ` Markus Armbruster
2019-05-13 15:37 ` Markus Armbruster
2019-05-13 18:33 ` Andrew Jones
2019-05-13 18:33 ` Andrew Jones
2019-05-13 9:32 ` [PATCH 00/13] target/arm/kvm: enable SVE in guests Andrea Bolognani
2019-05-13 9:32 ` [Qemu-devel] " Andrea Bolognani
2019-05-13 11:15 ` Dave Martin
2019-05-13 11:15 ` [Qemu-devel] " Dave Martin
2019-05-13 12:38 ` Andrew Jones
2019-05-13 12:38 ` [Qemu-devel] " Andrew Jones
2019-05-13 12:50 ` Dave Martin
2019-05-13 12:50 ` [Qemu-devel] " Dave Martin
2019-05-13 12:36 ` Andrew Jones
2019-05-13 12:36 ` Andrew Jones
2019-05-14 12:29 ` Andrea Bolognani
2019-05-14 12:29 ` Andrea Bolognani
2019-05-14 12:53 ` Andrew Jones
2019-05-14 16:03 ` Andrea Bolognani
2019-05-14 20:14 ` Richard Henderson
2019-05-15 8:03 ` Andrea Bolognani
2019-05-15 11:14 ` Dave Martin
2019-05-15 11:14 ` Dave Martin
2019-05-15 11:28 ` Andrea Bolognani
2019-05-15 11:28 ` Andrea Bolognani
2019-05-15 12:47 ` Dave Martin
2019-05-15 12:47 ` Dave Martin
2019-05-15 9:15 ` Andrew Jones
2019-05-13 9:52 ` Peter Maydell
2019-05-13 9:52 ` [Qemu-devel] " Peter Maydell
2019-05-13 12:43 ` Andrew Jones
2019-05-13 12:43 ` Andrew Jones
2019-05-13 18:46 ` Richard Henderson
2019-05-13 18:46 ` [Qemu-devel] " Richard Henderson
2019-05-13 19:16 ` Andrew Jones
2019-05-13 19:16 ` [Qemu-devel] " Andrew Jones
2019-05-14 9:05 ` Peter Maydell
2019-05-14 9:05 ` [Qemu-devel] " Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190513153116.GL28398@e103592.cambridge.arm.com \
--to=dave.martin@arm.com \
--cc=abologna@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=armbru@redhat.com \
--cc=drjones@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.