From: Sean Christopherson <seanjc@google.com>
To: David Matlack <dmatlack@google.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Jim Mattson <jmattson@google.com>, Peter Xu <peterx@redhat.com>,
Colton Lewis <coltonlewis@google.com>,
Aaron Lewis <aaronlewis@google.com>,
kvm@vger.kernel.org
Subject: Re: [PATCH v2 2/8] KVM: selftests: Explicitly require instructions bytes
Date: Thu, 27 Oct 2022 23:41:42 +0000 [thread overview]
Message-ID: <Y1sXNuM2e9p3DF92@google.com> (raw)
In-Reply-To: <20221018214612.3445074-3-dmatlack@google.com>
On Tue, Oct 18, 2022, David Matlack wrote:
> Explicitly require instruction bytes to be available in
> run->emulation_failure by asserting that they are present. Note that the
> test already requires the instruction bytes to be present because that's
> the only way the test will advance the RIP past the flds and get to
> GUEST_DONE().
>
> Signed-off-by: David Matlack <dmatlack@google.com>
> ---
> .../smaller_maxphyaddr_emulation_test.c | 47 +++++++++----------
> 1 file changed, 23 insertions(+), 24 deletions(-)
>
> diff --git a/tools/testing/selftests/kvm/x86_64/smaller_maxphyaddr_emulation_test.c b/tools/testing/selftests/kvm/x86_64/smaller_maxphyaddr_emulation_test.c
> index 6ed996988a5a..c5353ad0e06d 100644
> --- a/tools/testing/selftests/kvm/x86_64/smaller_maxphyaddr_emulation_test.c
> +++ b/tools/testing/selftests/kvm/x86_64/smaller_maxphyaddr_emulation_test.c
> @@ -65,30 +65,29 @@ static void process_exit_on_emulation_error(struct kvm_vcpu *vcpu)
> "Unexpected suberror: %u",
> run->emulation_failure.suberror);
>
> - if (run->emulation_failure.ndata >= 1) {
> - flags = run->emulation_failure.flags;
> - if ((flags & KVM_INTERNAL_ERROR_EMULATION_FLAG_INSTRUCTION_BYTES) &&
> - run->emulation_failure.ndata >= 3) {
> - insn_size = run->emulation_failure.insn_size;
> - insn_bytes = run->emulation_failure.insn_bytes;
> -
> - TEST_ASSERT(insn_size <= 15 && insn_size > 0,
> - "Unexpected instruction size: %u",
> - insn_size);
> -
> - TEST_ASSERT(is_flds(insn_bytes, insn_size),
> - "Unexpected instruction. Expected 'flds' (0xd9 /0)");
> -
> - /*
> - * If is_flds() succeeded then the instruction bytes
> - * contained an flds instruction that is 2-bytes in
> - * length (ie: no prefix, no SIB, no displacement).
> - */
> - vcpu_regs_get(vcpu, ®s);
> - regs.rip += 2;
> - vcpu_regs_set(vcpu, ®s);
> - }
> - }
> + flags = run->emulation_failure.flags;
> + TEST_ASSERT(run->emulation_failure.ndata >= 3 &&
> + flags & KVM_INTERNAL_ERROR_EMULATION_FLAG_INSTRUCTION_BYTES,
> + "run->emulation_failure is missing instruction bytes");
> +
> + insn_size = run->emulation_failure.insn_size;
> + insn_bytes = run->emulation_failure.insn_bytes;
> +
> + TEST_ASSERT(insn_size <= 15 && insn_size > 0,
> + "Unexpected instruction size: %u",
> + insn_size);
Unnecessary newline, insn_size fits comfortably on the line above.
> +
> + TEST_ASSERT(is_flds(insn_bytes, insn_size),
> + "Unexpected instruction. Expected 'flds' (0xd9 /0)");
> +
> + /*
> + * If is_flds() succeeded then the instruction bytes contained an flds
> + * instruction that is 2-bytes in length (ie: no prefix, no SIB, no
> + * displacement).
> + */
> + vcpu_regs_get(vcpu, ®s);
> + regs.rip += 2;
This whole sequence is silly. Assert that size > 0 but < 15, then assert that
it's >= 2, then skip exactly two bytes and effective "assert" that it's '2.
And while I appreciate the ModR/M decoding, IMO it does more harm than good. If
someone can follow the ModR/M decoding, they can figure out a hardcode opcode.
E.g. IMO this is much simpler and will be easier to debug.
#define FLDS_MEM_EAX ".byte 0xd9, 0x00"
static void guest_code(void)
{
__asm__ __volatile__(FLDS_MEM_EAX
:: "a"(MEM_REGION_GVA));
GUEST_DONE();
}
static void process_exit_on_emulation_error(struct kvm_vcpu *vcpu)
{
struct kvm_run *run = vcpu->run;
struct kvm_regs regs;
uint8_t *insn_bytes;
uint64_t flags;
TEST_ASSERT(run->exit_reason == KVM_EXIT_INTERNAL_ERROR,
"Unexpected exit reason: %u (%s)",
run->exit_reason,
exit_reason_str(run->exit_reason));
TEST_ASSERT(run->emulation_failure.suberror == KVM_INTERNAL_ERROR_EMULATION,
"Unexpected suberror: %u",
run->emulation_failure.suberror);
flags = run->emulation_failure.flags;
TEST_ASSERT(run->emulation_failure.ndata >= 3 &&
flags & KVM_INTERNAL_ERROR_EMULATION_FLAG_INSTRUCTION_BYTES,
"run->emulation_failure is missing instruction bytes");
TEST_ASSERT(run->emulation_failure.insn_size == 2,
"Expected a 2-byte opcode for 'flds', got %d bytes",
run->emulation_failure.insn_size);
insn_bytes = run->emulation_failure.insn_bytes;
TEST_ASSERT(insn_bytes[0] == 0xd9 && insn_bytes[1] == 0,
"Expected 'flds [eax]', opcode '0xd9 0x00', got opcode 0x%x 0x%x\n",
insn_bytes[0], insn_bytes[1]);
vcpu_regs_get(vcpu, ®s);
regs.rip += 2;
vcpu_regs_set(vcpu, ®s);
}
next prev parent reply other threads:[~2022-10-27 23:41 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-18 21:46 [PATCH v2 0/8] KVM: selftests: Fix and clean up emulator_error_test David Matlack
2022-10-18 21:46 ` [PATCH v2 1/8] KVM: selftests: Rename emulator_error_test to smaller_maxphyaddr_emulation_test David Matlack
2022-10-27 23:27 ` Sean Christopherson
2022-10-18 21:46 ` [PATCH v2 2/8] KVM: selftests: Explicitly require instructions bytes David Matlack
2022-10-27 23:41 ` Sean Christopherson [this message]
2022-10-18 21:46 ` [PATCH v2 3/8] KVM: selftests: Delete dead ucall code David Matlack
2022-10-27 23:44 ` Sean Christopherson
2022-10-28 23:59 ` David Matlack
2022-10-18 21:46 ` [PATCH v2 4/8] KVM: selftests: Move flds instruction emulation failure handling to header David Matlack
2022-10-18 21:46 ` [PATCH v2 5/8] KVM: x86/mmu: Use BIT{,_ULL}() for PFERR masks David Matlack
2022-10-27 23:45 ` Sean Christopherson
2022-10-18 21:46 ` [PATCH v2 6/8] KVM: selftests: Copy KVM PFERR masks into selftests David Matlack
2022-10-28 0:34 ` Sean Christopherson
2022-10-18 21:46 ` [PATCH v2 7/8] KVM: selftests: Expect #PF(RSVD) when TDP is disabled David Matlack
2022-10-28 0:31 ` Sean Christopherson
2022-10-28 23:51 ` David Matlack
2022-10-31 16:47 ` Sean Christopherson
2022-10-18 21:46 ` [PATCH v2 8/8] KVM: selftest: Add a test for KVM_CAP_EXIT_ON_EMULATION_FAILURE David Matlack
2022-10-28 0:34 ` Sean Christopherson
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=Y1sXNuM2e9p3DF92@google.com \
--to=seanjc@google.com \
--cc=aaronlewis@google.com \
--cc=coltonlewis@google.com \
--cc=dmatlack@google.com \
--cc=jmattson@google.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
/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.