diff mbox

kvm: Add emulation for movups/movupd

Message ID 20180401155444.7006-1-sf@sfritsch.de (mailing list archive)
State New, archived
Headers show

Commit Message

Stefan Fritsch April 1, 2018, 3:54 p.m. UTC
This is very similar to the aligned versions movaps/movapd.

We have seen the corresponding emulation failures with openbsd as guest
and with Windows 10 with intel HD graphics pass through.

Signed-off-by: Christian Ehrhardt <christian_ehrhardt@genua.de>
Signed-off-by: Stefan Fritsch <sf@sfritsch.de>
---
 arch/x86/kvm/emulate.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Radim Krčmář April 3, 2018, 7:44 p.m. UTC | #1
[The subject could mention "x86:" as well]

2018-04-01 17:54+0200, Stefan Fritsch:
> This is very similar to the aligned versions movaps/movapd.
> 
> We have seen the corresponding emulation failures with openbsd as guest
> and with Windows 10 with intel HD graphics pass through.
> 
> Signed-off-by: Christian Ehrhardt <christian_ehrhardt@genua.de>
> Signed-off-by: Stefan Fritsch <sf@sfritsch.de>
> ---

Nicely follows the implementation of aligned variants,

Reviewed-by: Radim Krčmář <rkrcmar@redhat.com>
Paolo Bonzini April 4, 2018, 3:53 p.m. UTC | #2
On 01/04/2018 17:54, Stefan Fritsch wrote:
> This is very similar to the aligned versions movaps/movapd.
> 
> We have seen the corresponding emulation failures with openbsd as guest
> and with Windows 10 with intel HD graphics pass through.
> 
> Signed-off-by: Christian Ehrhardt <christian_ehrhardt@genua.de>
> Signed-off-by: Stefan Fritsch <sf@sfritsch.de>
> ---
>  arch/x86/kvm/emulate.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> index d91eaeb01034..7dda8e38c19a 100644
> --- a/arch/x86/kvm/emulate.c
> +++ b/arch/x86/kvm/emulate.c
> @@ -4498,6 +4498,10 @@ static const struct gprefix pfx_0f_2b = {
>  	ID(0, &instr_dual_0f_2b), ID(0, &instr_dual_0f_2b), N, N,
>  };
>  
> +static const struct gprefix pfx_0f_10_0f_11 = {
> +	I(Unaligned, em_mov), I(Unaligned, em_mov), N, N,
> +};
> +
>  static const struct gprefix pfx_0f_28_0f_29 = {
>  	I(Aligned, em_mov), I(Aligned, em_mov), N, N,
>  };
> @@ -4709,7 +4713,9 @@ static const struct opcode twobyte_table[256] = {
>  	DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N,
>  	N, D(ImplicitOps | ModRM | SrcMem | NoAccess), N, N,
>  	/* 0x10 - 0x1F */
> -	N, N, N, N, N, N, N, N,
> +	GP(ModRM | DstReg | SrcMem | Mov | Sse, &pfx_0f_10_0f_11),
> +	GP(ModRM | DstMem | SrcReg | Mov | Sse, &pfx_0f_10_0f_11),
> +	N, N, N, N, N, N,
>  	D(ImplicitOps | ModRM | SrcMem | NoAccess),
>  	N, N, N, N, N, N, D(ImplicitOps | ModRM | SrcMem | NoAccess),
>  	/* 0x20 - 0x2F */
> 

Applied, thanks.

Paolo
Konrad Rzeszutek Wilk April 4, 2018, 5:10 p.m. UTC | #3
On Wed, Apr 04, 2018 at 05:53:04PM +0200, Paolo Bonzini wrote:
> On 01/04/2018 17:54, Stefan Fritsch wrote:
> > This is very similar to the aligned versions movaps/movapd.
..snip..
> Applied, thanks.

Should there be a corresponding test-case?
> 
> Paolo
Paolo Bonzini April 4, 2018, 5:24 p.m. UTC | #4
On 04/04/2018 19:10, Konrad Rzeszutek Wilk wrote:
> On Wed, Apr 04, 2018 at 05:53:04PM +0200, Paolo Bonzini wrote:
>> On 01/04/2018 17:54, Stefan Fritsch wrote:
>>> This is very similar to the aligned versions movaps/movapd.
> ..snip..
>> Applied, thanks.
> Should there be a corresponding test-case?

Good point!  Stefan, could you write one?

Thanks,

Paolo
Stefan Fritsch April 4, 2018, 5:35 p.m. UTC | #5
On Wednesday, 4 April 2018 19:24:20 CEST Paolo Bonzini wrote:
> On 04/04/2018 19:10, Konrad Rzeszutek Wilk wrote:
> > Should there be a corresponding test-case?
> 
> Good point!  Stefan, could you write one?

Is there infrastructure for such tests? If yes, can you give me a pointer to 
it?

Cheers,
Stefan
Paolo Bonzini April 5, 2018, 5:44 a.m. UTC | #6
On 04/04/2018 19:35, Stefan Fritsch wrote:
> On Wednesday, 4 April 2018 19:24:20 CEST Paolo Bonzini wrote:
>> On 04/04/2018 19:10, Konrad Rzeszutek Wilk wrote:
>>> Should there be a corresponding test-case?
>>
>> Good point!  Stefan, could you write one?
> 
> Is there infrastructure for such tests? If yes, can you give me a pointer to 
> it?

Yes, check out x86/emulator.c in
https://git.kernel.org/pub/scm/virt/kvm/kvm-unit-tests.git.  There is
already a movaps test.

Paolo
Jim Mattson Jan. 12, 2021, 11:47 p.m. UTC | #7
On Wed, Apr 4, 2018 at 10:44 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> On 04/04/2018 19:35, Stefan Fritsch wrote:
> > On Wednesday, 4 April 2018 19:24:20 CEST Paolo Bonzini wrote:
> >> On 04/04/2018 19:10, Konrad Rzeszutek Wilk wrote:
> >>> Should there be a corresponding test-case?
> >>
> >> Good point!  Stefan, could you write one?
> >
> > Is there infrastructure for such tests? If yes, can you give me a pointer to
> > it?
>
> Yes, check out x86/emulator.c in
> https://git.kernel.org/pub/scm/virt/kvm/kvm-unit-tests.git.  There is
> already a movaps test.

Whatever became of this unit test? I don't see it in the
kvm-unit-tests repository.
Stefan Fritsch Jan. 15, 2021, 8:56 a.m. UTC | #8
Am 13.01.21 um 00:47 schrieb Jim Mattson:
> On Wed, Apr 4, 2018 at 10:44 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>>
>> On 04/04/2018 19:35, Stefan Fritsch wrote:
>>> On Wednesday, 4 April 2018 19:24:20 CEST Paolo Bonzini wrote:
>>>> On 04/04/2018 19:10, Konrad Rzeszutek Wilk wrote:
>>>>> Should there be a corresponding test-case?
>>>>
>>>> Good point!  Stefan, could you write one?
>>>
>>> Is there infrastructure for such tests? If yes, can you give me a pointer to
>>> it?
>>
>> Yes, check out x86/emulator.c in
>> https://git.kernel.org/pub/scm/virt/kvm/kvm-unit-tests.git.  There is
>> already a movaps test.
> 
> Whatever became of this unit test? I don't see it in the
> kvm-unit-tests repository.
> 

Sorry, I did not get around to doing this. And it is unlikely that I 
will have time to do it in the near future.

Cheers,
Stefan
diff mbox

Patch

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index d91eaeb01034..7dda8e38c19a 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -4498,6 +4498,10 @@  static const struct gprefix pfx_0f_2b = {
 	ID(0, &instr_dual_0f_2b), ID(0, &instr_dual_0f_2b), N, N,
 };
 
+static const struct gprefix pfx_0f_10_0f_11 = {
+	I(Unaligned, em_mov), I(Unaligned, em_mov), N, N,
+};
+
 static const struct gprefix pfx_0f_28_0f_29 = {
 	I(Aligned, em_mov), I(Aligned, em_mov), N, N,
 };
@@ -4709,7 +4713,9 @@  static const struct opcode twobyte_table[256] = {
 	DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N,
 	N, D(ImplicitOps | ModRM | SrcMem | NoAccess), N, N,
 	/* 0x10 - 0x1F */
-	N, N, N, N, N, N, N, N,
+	GP(ModRM | DstReg | SrcMem | Mov | Sse, &pfx_0f_10_0f_11),
+	GP(ModRM | DstMem | SrcReg | Mov | Sse, &pfx_0f_10_0f_11),
+	N, N, N, N, N, N,
 	D(ImplicitOps | ModRM | SrcMem | NoAccess),
 	N, N, N, N, N, N, D(ImplicitOps | ModRM | SrcMem | NoAccess),
 	/* 0x20 - 0x2F */