All of lore.kernel.org
 help / color / mirror / Atom feed
From: Haozhong Zhang <haozhong.zhang@intel.com>
To: xen-devel@lists.xenproject.org
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
	Haozhong Zhang <haozhong.zhang@intel.com>
Subject: [XTF PATCH 05/16] vvmx: add a general error handler for VMX instructions
Date: Fri, 16 Dec 2016 21:43:37 +0800	[thread overview]
Message-ID: <20161216134348.16236-6-haozhong.zhang@intel.com> (raw)
In-Reply-To: <20161216134348.16236-1-haozhong.zhang@intel.com>

handle_vmxinsn_err() is added to check and output the mismatch between
errors in the execution of a VMX instruction and the expected errors.

Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
---
 tests/vvmx/util.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/vvmx/util.h |  17 +++++++++
 2 files changed, 121 insertions(+)

diff --git a/tests/vvmx/util.c b/tests/vvmx/util.c
index 8cd35c5..74b4d01 100644
--- a/tests/vvmx/util.c
+++ b/tests/vvmx/util.c
@@ -2,6 +2,110 @@
 #include <arch/x86/hvm/vmx/vmcs.h>
 #include "util.h"
 
+#define vvmx_failure(prefix, fmt, ...)                       \
+    do {                                                     \
+        xtf_failure("Fail: %s: "fmt, prefix, ##__VA_ARGS__); \
+    } while (0)
+
+bool handle_vmxinsn_err(const char *name, uint8_t err, exinfo_t fault_info,
+                        uint8_t exp_err, exinfo_t exp_fault_info,
+                        enum vmx_insn_errno exp_insn_errno)
+{
+    bool passed = true;
+
+    bool has_fault = !!(err & VMXERR_FAULT);
+    unsigned int fault_vec = exinfo_vec(fault_info);
+    unsigned int fault_ec = exinfo_ec(fault_info);
+    bool exp_fault = !!(exp_err & VMXERR_FAULT);
+    unsigned int exp_fault_vec = exinfo_vec(exp_fault_info);
+    bool ec = !!(exp_fault_vec & X86_EXC_HAVE_EC);
+    unsigned int exp_fault_ec = ec ? exinfo_ec(exp_fault_info) : 0;
+
+    if ( !exp_fault && has_fault )
+    {
+        vvmx_failure(name,
+                     "unexpected fault #%u(%u), but no fault is expected\n",
+                     fault_vec, fault_ec);
+        passed = false;
+    }
+    else if ( exp_fault && !has_fault )
+    {
+        vvmx_failure(name, "no fault, but fault #%u(%u) is expected\n",
+                     exp_fault_vec, exp_fault_ec);
+        passed = false;
+    }
+    else if ( has_fault &&
+              (fault_vec != exp_fault_vec || (ec && fault_ec != exp_fault_ec)) )
+    {
+        vvmx_failure(name,
+                     "unexpected fault #%u(%u), but #%u(%u) is expected\n",
+                     fault_vec, fault_ec, exp_fault_vec, exp_fault_ec);
+        passed = false;
+    }
+
+    /* VMfail bits are not set by VMX instructions when a fault happens */
+    if ( has_fault )
+        goto out;
+
+    bool has_vmfail_valid = !!(err & VMXERR_VMFAIL_VALID);
+    bool exp_vmfail_valid = !!(exp_err & VMXERR_VMFAIL_VALID);
+    bool has_insn_errno = false;
+    uint64_t insn_errno = 0;
+
+    if ( has_vmfail_valid )
+    {
+        has_insn_errno = !!vmread(VM_INSTRUCTION_ERROR, &insn_errno, NULL);
+
+        if ( has_insn_errno )
+        {
+            vvmx_failure(name,
+                         "unexpected error when vmread VM_INSTRUCTION_ERROR\n");
+            passed = false;
+        }
+    }
+
+    if ( !exp_vmfail_valid && has_vmfail_valid )
+    {
+        vvmx_failure(name, "unexpected VMfailvalid(%d), "
+                     "but no VMfailvalid is expected\n",
+                     (enum vmx_insn_errno)insn_errno);
+        passed = false;
+    }
+    else if ( exp_vmfail_valid && !has_vmfail_valid )
+    {
+        vvmx_failure(name, "no VMfailvalid, but VMfailvalid(%d) is expected\n",
+                     exp_insn_errno);
+        passed = false;
+    }
+    else if ( has_vmfail_valid &&
+              has_insn_errno && insn_errno != exp_insn_errno )
+    {
+        vvmx_failure(name, "unexpected VMfailvalid(%d), "
+                     "but VMfailvalid(%d) is expected\n",
+                     (enum vmx_insn_errno)insn_errno, exp_insn_errno);
+        passed = false;
+    }
+
+    bool has_vmfail_invalid = !!(err & VMXERR_VMFAIL_INVALID);
+    bool exp_vmfail_invalid = !!(exp_err & VMXERR_VMFAIL_INVALID);
+
+    if ( !exp_vmfail_invalid && has_vmfail_invalid )
+    {
+        vvmx_failure(name, "unexpected VMfailInvalid, "
+                     "but no VMfailInvalid is expected\n");
+        passed = false;
+    }
+    else if ( exp_vmfail_invalid && !has_vmfail_invalid )
+    {
+        vvmx_failure(name,
+                     "no VMfailInvalid, but VMfailInvalid is expected\n");
+        passed = false;
+    }
+
+out:
+    return passed;
+}
+
 #define VMPTRLD_OPCODE  ".byte 0x0f,0xc7\n"             /* reg/opcode: /6 */
 #define VMREAD_OPCODE   ".byte 0x0f,0x78\n"
 #define VMXON_OPCODE    ".byte 0xf3,0x0f,0xc7\n"
diff --git a/tests/vvmx/util.h b/tests/vvmx/util.h
index 57d3398..f18b9cc 100644
--- a/tests/vvmx/util.h
+++ b/tests/vvmx/util.h
@@ -17,6 +17,23 @@
 #define VMXERR_FAULT          (1 << 2)
 
 /**
+ * A general function to check and output the mismatch between the
+ * error in the execution of a VMX instruction and the expected error.
+ *
+ * Parameters:
+ *  @name:      the name of the test and is included in the error messages
+ *  @err:       VMXERR_ flags returned by the execution of a VMX instruction
+ *  @fault:     the information of the fault if (@err & VMXERR_FAULT)
+ *  @exp_err:   expected VMXERR_ flags
+ *  @exp_fault: the information of the expected fault if (exp_err & VMXERR_FAULT)
+ *  @exp_errno: the expected VMX instruction error number if
+ *              (exp_err & VMXERR_VMFAIL_VALID)
+ */
+bool handle_vmxinsn_err(const char *name, uint8_t err, exinfo_t fault,
+                        uint8_t exp_err, exinfo_t exp_fault,
+                        enum vmx_insn_errno exp_errno);
+
+/**
  * vmxon
  *
  * Parameters:
-- 
2.10.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  parent reply	other threads:[~2016-12-16 13:44 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-16 13:43 [XTF PATCH 00/16] Add test cases for nested vmxon Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 01/16] vvmx: test whether VMX feature is present in CPUID Haozhong Zhang
2016-12-16 14:40   ` Andrew Cooper
2016-12-19  1:51     ` Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 02/16] vvmx: test whether MSR_IA32_FEATURE_CONTROL is set correctly Haozhong Zhang
2016-12-16 16:17   ` Andrew Cooper
2016-12-19  2:20     ` Haozhong Zhang
2016-12-19 15:29       ` Andrew Cooper
2016-12-16 13:43 ` [XTF PATCH 03/16] vvmx: test whether MSR_IA32_VMX_BASIC " Haozhong Zhang
2016-12-16 17:19   ` Andrew Cooper
2016-12-19  2:44     ` Haozhong Zhang
2016-12-19 15:41       ` Andrew Cooper
2016-12-20  2:45         ` Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 04/16] vvmx: add C wrappers of vmxon/vmread/vmptrld Haozhong Zhang
2016-12-16 19:03   ` [licensing] was: " Andrew Cooper
2016-12-19  3:20     ` Haozhong Zhang
2016-12-19 14:41       ` Lars Kurth
2016-12-19 15:51         ` Ian Jackson
2016-12-19 15:58       ` Andrew Cooper
2016-12-19 15:20     ` Roger Pau Monné
2016-12-19 15:24       ` Andrew Cooper
2016-12-16 19:47   ` Andrew Cooper
2016-12-19  3:00     ` Haozhong Zhang
2016-12-16 13:43 ` Haozhong Zhang [this message]
2016-12-16 20:16   ` [XTF PATCH 05/16] vvmx: add a general error handler for VMX instructions Andrew Cooper
2016-12-19  3:24     ` Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 06/16] vvmx: test vmxon with CR4.VMXE cleared Haozhong Zhang
2016-12-16 20:25   ` Andrew Cooper
2016-12-19  3:26     ` Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 07/16] vvmx: test vmxon in CPL=3 and out of VMX operation Haozhong Zhang
2016-12-16 20:33   ` Andrew Cooper
2016-12-19  3:35     ` Haozhong Zhang
2016-12-19 16:02       ` Andrew Cooper
2016-12-19 16:02       ` Andrew Cooper
2016-12-16 13:43 ` [XTF PATCH 08/16] vvmx: test vmxon with invalidly wide VMXON region address Haozhong Zhang
2016-12-16 20:40   ` Andrew Cooper
2016-12-19  3:36     ` Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 09/16] vvmx: test vmxon with unaligned " Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 10/16] vvmx: test vmxon with mismatched VMCS revision ID Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 11/16] vvmx: test vmxon with bit 31 of VMCS revision ID set Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 12/16] vvmx: test the correct vmxon Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 13/16] vvmx: test vmxon in VMX root w/ CPL = 0 and w/o current VMCS Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 14/16] vvmx: test vmxon in VMX root w/ CPL = 3 " Haozhong Zhang
2016-12-16 20:59   ` Andrew Cooper
2016-12-19  3:46     ` Haozhong Zhang
2016-12-19 16:07       ` Andrew Cooper
2016-12-20  2:50         ` Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 15/16] vvmx: test vmxon in VMX root w/ CPL = 0 and w/ " Haozhong Zhang
2016-12-16 13:43 ` [XTF PATCH 16/16] vvmx: test vmxon in VMX root w/ CPL = 3 " Haozhong Zhang
2016-12-16 14:12 ` [XTF PATCH 00/16] Add test cases for nested vmxon Andrew Cooper
2016-12-19  1:44   ` Haozhong Zhang
2016-12-19 16:18     ` Andrew Cooper
2016-12-16 21:26 ` Andrew Cooper
2016-12-19  5:31   ` Haozhong Zhang
2016-12-19 16:34     ` Andrew Cooper
2016-12-20  2:32       ` Haozhong Zhang

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=20161216134348.16236-6-haozhong.zhang@intel.com \
    --to=haozhong.zhang@intel.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=xen-devel@lists.xenproject.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.