On 20/06/19 13:02, Vitaly Kuznetsov wrote: > To avoid hardcoding xsetbv length to '3' we need to support decoding it in > the emulator. > > Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> Can you also emulate it properly? The code from QEMU's target/i386/fpu_helper.c can help. :) Paolo > --- > arch/x86/include/asm/kvm_emulate.h | 1 + > arch/x86/kvm/emulate.c | 9 ++++++++- > arch/x86/kvm/svm.c | 1 + > 3 files changed, 10 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h > index feab24cac610..478f76b0122d 100644 > --- a/arch/x86/include/asm/kvm_emulate.h > +++ b/arch/x86/include/asm/kvm_emulate.h > @@ -429,6 +429,7 @@ enum x86_intercept { > x86_intercept_ins, > x86_intercept_out, > x86_intercept_outs, > + x86_intercept_xsetbv, > > nr_x86_intercepts > }; > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index d0d5dd44b4f4..ff25d94df684 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -4393,6 +4393,12 @@ static const struct opcode group7_rm1[] = { > N, N, N, N, N, N, > }; > > +static const struct opcode group7_rm2[] = { > + N, > + DI(SrcNone | Priv, xsetbv), > + N, N, N, N, N, N, > +}; > + > static const struct opcode group7_rm3[] = { > DIP(SrcNone | Prot | Priv, vmrun, check_svme_pa), > II(SrcNone | Prot | EmulateOnUD, em_hypercall, vmmcall), > @@ -4482,7 +4488,8 @@ static const struct group_dual group7 = { { > }, { > EXT(0, group7_rm0), > EXT(0, group7_rm1), > - N, EXT(0, group7_rm3), > + EXT(0, group7_rm2), > + EXT(0, group7_rm3), > II(SrcNone | DstMem | Mov, em_smsw, smsw), N, > II(SrcMem16 | Mov | Priv, em_lmsw, lmsw), > EXT(0, group7_rm7), > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index f980fc43372d..39e61029f401 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -6041,6 +6041,7 @@ static const struct __x86_intercept { > [x86_intercept_ins] = POST_EX(SVM_EXIT_IOIO), > [x86_intercept_out] = POST_EX(SVM_EXIT_IOIO), > [x86_intercept_outs] = POST_EX(SVM_EXIT_IOIO), > + [x86_intercept_xsetbv] = PRE_EX(SVM_EXIT_XSETBV), > }; > > #undef PRE_EX >