[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 5/9] x86/vvmx: Replace direct calls to reg_read() with operand_read()



Use operand_read() to read register operands in the following functions:

 * nvmx_handle_vmread()
 * nvmx_handle_vmwrite()
 * nvmx_handle_invept()

Direct reading of memory operands will be replaced in a separate patch.

Signed-off-by: Euan Harris <euan.harris@xxxxxxxxxx>
---
 xen/arch/x86/hvm/vmx/vvmx.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c
index 32c07eca3d..7cda37b136 100644
--- a/xen/arch/x86/hvm/vmx/vvmx.c
+++ b/xen/arch/x86/hvm/vmx/vvmx.c
@@ -1877,6 +1877,7 @@ int nvmx_handle_vmread(struct cpu_user_regs *regs)
     pagefault_info_t pfinfo;
     u64 value = 0;
     int rc;
+    unsigned long vmcs_encoding = 0;
 
     rc = decode_vmx_inst(regs, &decode, NULL, 0);
     if ( rc != X86EMUL_OKAY )
@@ -1888,7 +1889,11 @@ int nvmx_handle_vmread(struct cpu_user_regs *regs)
         return X86EMUL_OKAY;
     }
 
-    rc = get_vvmcs_safe(v, reg_read(regs, decode.op[1].reg_idx), &value);
+    rc = operand_read(&vmcs_encoding, &decode.op[1], regs, decode.op[1].len);
+    if ( rc != X86EMUL_OKAY )
+        return rc;
+
+    rc = get_vvmcs_safe(v, vmcs_encoding, &value);
     if ( rc != VMX_INSN_SUCCEED )
     {
         vmfail(regs, rc);
@@ -1918,9 +1923,10 @@ int nvmx_handle_vmwrite(struct cpu_user_regs *regs)
     struct vcpu *v = current;
     struct vmx_inst_decoded decode;
     unsigned long operand; 
-    u64 vmcs_encoding;
+    unsigned long vmcs_encoding = 0;
     bool_t okay = 1;
     enum vmx_insn_errno err;
+    int rc;
 
     if ( decode_vmx_inst(regs, &decode, &operand, 0)
              != X86EMUL_OKAY )
@@ -1932,7 +1938,10 @@ int nvmx_handle_vmwrite(struct cpu_user_regs *regs)
         return X86EMUL_OKAY;
     }
 
-    vmcs_encoding = reg_read(regs, decode.op[1].reg_idx);
+    rc = operand_read(&vmcs_encoding, &decode.op[1], regs, decode.op[1].len);
+    if ( rc != X86EMUL_OKAY )
+        return rc;
+
     err = set_vvmcs_safe(v, vmcs_encoding, operand);
     if ( err != VMX_INSN_SUCCEED )
     {
@@ -1965,12 +1974,17 @@ int nvmx_handle_invept(struct cpu_user_regs *regs)
 {
     struct vmx_inst_decoded decode;
     unsigned long eptp;
+    unsigned long invept_type = 0;
     int ret;
 
     if ( (ret = decode_vmx_inst(regs, &decode, &eptp, 0)) != X86EMUL_OKAY )
         return ret;
 
-    switch ( reg_read(regs, decode.op[1].reg_idx) )
+    ret = operand_read(&invept_type, &decode.op[1], regs, decode.op[1].len);
+    if ( ret != X86EMUL_OKAY )
+        return ret;
+
+    switch ( invept_type )
     {
     case INVEPT_SINGLE_CONTEXT:
     {
@@ -1992,12 +2006,17 @@ int nvmx_handle_invept(struct cpu_user_regs *regs)
 int nvmx_handle_invvpid(struct cpu_user_regs *regs)
 {
     struct vmx_inst_decoded decode;
+    unsigned long invvpid_type = 0;
     int ret;
 
     if ( (ret = decode_vmx_inst(regs, &decode, NULL, 0)) != X86EMUL_OKAY )
         return ret;
 
-    switch ( reg_read(regs, decode.op[1].reg_idx) )
+    ret = operand_read(&invvpid_type, &decode.op[1], regs, decode.op[1].len);
+    if ( ret != X86EMUL_OKAY )
+        return ret;
+
+    switch ( invvpid_type )
     {
     /* Just invalidate all tlb entries for all types! */
     case INVVPID_INDIVIDUAL_ADDR:
-- 
2.13.6


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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.