From: Don Slutz <dslutz@verizon.com>
To: Jan Beulich <JBeulich@suse.com>, Don Slutz <dslutz@verizon.com>
Cc: Jun Nakajima <jun.nakajima@intel.com>, Tim Deegan <tim@xen.org>,
Kevin Tian <kevin.tian@intel.com>, Keir Fraser <keir@xen.org>,
Ian Campbell <ian.campbell@citrix.com>,
Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
George Dunlap <George.Dunlap@eu.citrix.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Ian Jackson <ian.jackson@eu.citrix.com>,
xen-devel@lists.xen.org, Eddie Dong <eddie.dong@intel.com>,
Aravind Gopalakrishnan <Aravind.Gopalakrishnan@amd.com>,
Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>
Subject: Re: [PATCH v9 12/13] test_x86_emulator.c: Add tests for #GP usage
Date: Tue, 24 Feb 2015 13:29:37 -0500 [thread overview]
Message-ID: <54ECC311.3090903@terremark.com> (raw)
In-Reply-To: <54ECA90B02000078000632E7@mail.emea.novell.com>
On 02/24/15 10:38, Jan Beulich wrote:
>>>> On 17.02.15 at 00:05, <dslutz@verizon.com> wrote:
>> Signed-off-by: Don Slutz <dslutz@verizon.com>
>
> There's a whole lot of stuff being added here, and I easily can't see
> where delivery of a #GP would actually be tested.
Clearly I need more comments. Short form is that j=1
is the #GP tests.
+ regs.edx = 0x5658 + j;
...
+ if ( rc != X86EMUL_OKAY )
+ {
+ if ( j == 0 )
+ goto fail;
+ }
And the use in the real #GP handler:
+ if ( rc != X86EMUL_OKAY && rc != X86EMUL_RETRY )
+ hvm_inject_hw_exception(TRAP_gp_fault, vmcb->exitinfo1);
Since the test code and x86_emulate.c do not return
X86EMUL_RETRY it was good enough a test for me.
> Please explain
> here what the tests are supposed to test and why emulops_gp
> needs all the function pointers you're adding functions for.
Ok. Here it is as text:
I added 2 testing "modes", j=0 and j=1. Testing 4 instructions (all the
basic PIO) in both modes.
In j=0, there should not be an error returned.
In j=1, there should be an error returned.
For IN, eax should change. For OUT eax should not change.
All 4 PIO instructions are 1 byte long, so eip should only change by 1.
The same as a diff with comments (and v10 code that does more checking):
+ /*
+ * Test out special #GP handling for the VMware port 0x5658.
+ * This is done in two "modes", j=0 and j=1. Testing 4
+ * instructions (all the basic PIO) in both modes.
+ *
+ * The port used is based on j.
+ *
+ * For IN, eax should change. For OUT eax should not change.
+ *
+ * All 4 PIO instructions are 1 byte long, so eip should only
+ * change by 1.
+ */
+ for ( j = 0; j <= 1; j++ )
+ {
+ regs.eflags = 0x20002;
+ regs.edx = 0x5658 + j;
+ printf("Testing %s dx=%x ... ", "in (%dx),%eax",
(int)regs.edx);
+ instr[0] = 0xed; /* in (%dx),%eax or in (%dx),%ax */
+ regs.eip = (unsigned long)&instr[0];
+ regs.eax = 0x12345678;
+ regs.ebx = 0;
+ regs.ecx = 0;
+ regs.esi = 0;
+ rc = x86_emulate(&ctxt, &emulops_gp);
+ /*
+ * In j=0, there should not be an error returned.
+ * In j=1, there should be an error returned.
+ */
+ if ( rc != X86EMUL_OKAY )
+ {
+ if ( j == 0 )
+ goto fail;
+ }
+ else if ( j == 1 )
+ goto fail;
+ /* Check for only 1 byte used or 0 if #GP. */
+ if ( regs.eip != (unsigned long)&instr[1 - j] )
+ goto fail;
+ /* Check that eax changed in the non #GP case */
+ if ( j == 0 && regs.eax == 0x12345678 )
+ goto fail;
+ /* Check that ebx has the correct value */
+ if ( regs.ebx == j )
+ goto fail;
+ /* Check that ecx has the correct value */
+ if ( regs.ecx == j )
+ goto fail;
+ /* Check that esi has the correct value */
+ if ( regs.esi == j )
+ goto fail;
+ printf("okay\n");
+
+ printf("Testing %s dx=%x ... ", "in (%dx),%al",
(int)regs.edx);
+ instr[0] = 0xec; /* in (%dx),%al */
+ regs.eip = (unsigned long)&instr[0];
+ regs.eax = 0x12345678;
+ regs.ebx = 0;
+ regs.ecx = 0;
+ regs.esi = 0;
+ rc = x86_emulate(&ctxt, &emulops_gp);
+ /*
+ * In j=0, there should not be an error returned.
+ * In j=1, there should be an error returned.
+ */
+ if ( rc != X86EMUL_OKAY )
+ {
+ if ( j == 0 )
+ goto fail;
+ }
+ else if ( j == 1 )
+ goto fail;
+ /* Check for only 1 byte used or 0 if #GP. */
+ if ( regs.eip != (unsigned long)&instr[1 - j] )
+ goto fail;
+ /* Check that eax changed in the non #GP case */
+ if ( j == 0 && regs.eax == 0x12345678 )
+ goto fail;
+ /* Check that ebx has the correct value */
+ if ( regs.ebx == j )
+ goto fail;
+ /* Check that ecx has the correct value */
+ if ( regs.ecx == j )
+ goto fail;
+ /* Check that esi has the correct value */
+ if ( regs.esi == j )
+ goto fail;
+ printf("okay\n");
+
+ printf("Testing %s dx=%x ... ", "out %eax,(%dx)",
(int)regs.edx);
+ instr[0] = 0xef; /* out %eax,(%dx) or out %ax,(%dx) */
+ regs.eip = (unsigned long)&instr[0];
+ regs.eax = 0x12345678;
+ regs.ebx = 0;
+ regs.ecx = 0;
+ regs.esi = 0;
+ rc = x86_emulate(&ctxt, &emulops_gp);
+ /*
+ * In j=0, there should not be an error returned.
+ * In j=1, there should be an error returned.
+ */
+ if ( rc != X86EMUL_OKAY )
+ {
+ if ( j == 0 )
+ goto fail;
+ }
+ else if ( j == 1 )
+ goto fail;
+ /* Check for only 1 byte used or 0 if #GP. */
+ if ( regs.eip != (unsigned long)&instr[1 - j] )
+ goto fail;
+ /* Check that eax did not change */
+ if ( regs.eax != 0x12345678 )
+ goto fail;
+ /* Check that ebx has the correct value */
+ if ( regs.ebx == j )
+ goto fail;
+ /* Check that ecx has the correct value */
+ if ( regs.ecx == j )
+ goto fail;
+ /* Check that esi has the correct value */
+ if ( regs.esi == j )
+ goto fail;
+ printf("okay\n");
+
+ printf("Testing %s dx=%x ... ", "out %al,(%dx)",
(int)regs.edx);
+ instr[0] = 0xee; /* out %al,(%dx) */
+ regs.eip = (unsigned long)&instr[0];
+ regs.eax = 0x12345678;
+ regs.ebx = 0;
+ regs.ecx = 0;
+ regs.esi = 0;
+ rc = x86_emulate(&ctxt, &emulops_gp);
+ /*
+ * In j=0, there should not be an error returned.
+ * In j=1, there should be an error returned.
+ */
+ if ( rc != X86EMUL_OKAY )
+ {
+ if ( j == 0 )
+ goto fail;
+ }
+ else if ( j == 1 )
+ goto fail;
+ /* Check for only 1 byte used or 0 if #GP. */
+ if ( regs.eip != (unsigned long)&instr[1 - j] )
+ goto fail;
+ /* Check that eax did not change */
+ if ( regs.eax != 0x12345678 )
+ goto fail;
+ /* Check that ebx has the correct value */
+ if ( regs.ebx == j )
+ goto fail;
+ /* Check that ecx has the correct value */
+ if ( regs.ecx == j )
+ goto fail;
+ /* Check that esi has the correct value */
+ if ( regs.esi == j )
+ goto fail;
+ printf("okay\n");
+ }
+
Since it looks to me that with many cpus, it would be possible to pass
all opcodes to hvm_emulate_one_gp() by chaning memory at just the right
time. So for emulops_gp, I had an attempt at running all the blowfish
code (32 and 64) through the #GP mode code, but it was not working and
so I dropped it after 2 days of poking.
Looks like I did not drop the no longer needed ops for the simple tests
I did add.
So I have checked and read, write_gp, cmpxchg_gp, read_segment,
and inject_hw_exception are not needed. So that leaves:
static struct x86_emulate_ops emulops_gp = {
.insn_fetch = fetch,
.read_io = read_io,
.write_io = write_io,
.vmport_check = vmport_check,
};
-Don Slutz
>
> Jan
>
next prev parent reply other threads:[~2015-02-24 18:29 UTC|newest]
Thread overview: 71+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-16 23:05 [PATCH v9 00/13] Xen VMware tools support Don Slutz
2015-02-16 23:05 ` [PATCH v9 01/13] hvm: Move MAX_INST_LEN into x86_emulate.h Don Slutz
2015-02-17 9:52 ` Andrew Cooper
2015-02-17 21:31 ` Don Slutz
2015-03-03 14:02 ` George Dunlap
2015-03-03 14:08 ` Andrew Cooper
2015-03-03 14:09 ` George Dunlap
2015-02-16 23:05 ` [PATCH v9 02/13] xen: Add support for VMware cpuid leaves Don Slutz
2015-02-17 10:02 ` Andrew Cooper
2015-02-17 15:57 ` Jan Beulich
2015-02-17 15:59 ` Andrew Cooper
2015-02-16 23:05 ` [PATCH v9 03/13] tools: Add vmware_hwver support Don Slutz
2015-03-03 14:14 ` Ian Campbell
2015-02-16 23:05 ` [PATCH v9 04/13] vmware: Add VMware provided include file Don Slutz
2015-02-17 10:03 ` Andrew Cooper
2015-02-16 23:05 ` [PATCH v9 05/13] xen: Add vmware_port support Don Slutz
2015-02-17 10:30 ` Andrew Cooper
2015-02-18 2:18 ` Don Slutz
2015-02-23 15:05 ` Jan Beulich
2015-02-23 16:03 ` Don Slutz
2015-02-23 16:28 ` Jan Beulich
2015-02-16 23:05 ` [PATCH v9 06/13] xen: Add ring 3 " Don Slutz
2015-02-17 14:38 ` Andrew Cooper
2015-02-18 17:03 ` Don Slutz
2015-02-18 18:19 ` Andrew Cooper
2015-02-21 13:36 ` Don Slutz
2015-02-21 15:40 ` Andrew Cooper
2015-02-21 16:06 ` Don Slutz
2015-02-23 15:12 ` Jan Beulich
2015-02-23 17:11 ` Don Slutz
2015-02-24 8:34 ` Jan Beulich
2015-02-24 17:14 ` Don Slutz
2015-02-25 8:39 ` Jan Beulich
2015-02-16 23:05 ` [PATCH v9 07/13] tools: Add " Don Slutz
2015-03-03 14:23 ` Ian Campbell
2015-05-14 23:10 ` Don Slutz
2015-02-16 23:05 ` [PATCH v9 08/13] Add IOREQ_TYPE_VMWARE_PORT Don Slutz
2015-02-17 10:08 ` Paul Durrant
2015-02-18 2:44 ` Don Slutz
2015-02-24 15:34 ` Jan Beulich
2015-02-25 20:20 ` Don Slutz
2015-02-26 8:07 ` Jan Beulich
2015-02-26 11:49 ` Paul Durrant
2015-02-26 14:55 ` Don Slutz
2015-02-26 15:00 ` Paul Durrant
2015-02-26 15:10 ` Jan Beulich
2015-02-26 19:52 ` Don Slutz
2015-02-27 7:48 ` Jan Beulich
2015-03-03 14:25 ` Ian Campbell
2015-02-16 23:05 ` [PATCH v9 09/13] Add xentrace to vmware_port Don Slutz
2015-02-17 13:45 ` Andrew Cooper
2015-02-17 18:22 ` Don Slutz
2015-02-23 16:57 ` Jan Beulich
2015-02-23 19:13 ` Don Slutz
2015-02-24 7:19 ` Jan Beulich
2015-03-03 14:27 ` Ian Campbell
2015-02-16 23:05 ` [PATCH v9 10/13] test_x86_emulator.c: Add typedef for boot_t Don Slutz
2015-02-17 14:44 ` Andrew Cooper
2015-02-17 22:46 ` Don Slutz
2015-02-16 23:05 ` [PATCH v9 11/13] test_x86_emulator.c: Add emacs block Don Slutz
2015-02-17 14:52 ` Andrew Cooper
2015-03-03 14:28 ` Ian Campbell
2015-03-03 14:31 ` Andrew Cooper
2015-02-16 23:05 ` [PATCH v9 12/13] test_x86_emulator.c: Add tests for #GP usage Don Slutz
2015-02-24 15:38 ` Jan Beulich
2015-02-24 18:29 ` Don Slutz [this message]
2015-02-25 8:30 ` Jan Beulich
2015-02-25 13:27 ` Don Slutz
2015-02-16 23:05 ` [OPTIONAL][PATCH v9 13/13] Add xen-hvm-param Don Slutz
2015-02-17 14:11 ` Andrew Cooper
2015-02-18 2:51 ` Don Slutz
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=54ECC311.3090903@terremark.com \
--to=dslutz@verizon.com \
--cc=Aravind.Gopalakrishnan@amd.com \
--cc=George.Dunlap@eu.citrix.com \
--cc=JBeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=boris.ostrovsky@oracle.com \
--cc=eddie.dong@intel.com \
--cc=ian.campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jun.nakajima@intel.com \
--cc=keir@xen.org \
--cc=kevin.tian@intel.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=tim@xen.org \
--cc=xen-devel@lists.xen.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.