|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/vmx: Introduce vmread()
commit 881e5993dff7d8f372efeed7e5a9f255207805ed
Author: Denis Mukhin <dmukhin@xxxxxxxx>
AuthorDate: Sat Apr 26 07:27:29 2025 +0000
Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Mon Apr 28 21:01:20 2025 +0100
x86/vmx: Introduce vmread()
The current implementation of __vmread() is void and returns the result via
pointer argument which leads to excess code in some places.
Introduce a new vmread() function, and implement __vmread() in terms of it.
Suggested-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
xen/arch/x86/include/asm/hvm/vmx/vmx.h | 24 +++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/xen/arch/x86/include/asm/hvm/vmx/vmx.h
b/xen/arch/x86/include/asm/hvm/vmx/vmx.h
index 33d3d43a38..cc8c53fab1 100644
--- a/xen/arch/x86/include/asm/hvm/vmx/vmx.h
+++ b/xen/arch/x86/include/asm/hvm/vmx/vmx.h
@@ -320,16 +320,25 @@ static always_inline void __vmpclear(u64 addr)
BUG();
}
-static always_inline void __vmread(unsigned long field, unsigned long *value)
+static always_inline unsigned long vmread(unsigned long field)
{
- asm volatile ( "vmread %1, %0\n\t"
+ unsigned long value;
+
+ asm volatile ( "vmread %[field], %[value]\n\t"
/* CF==1 or ZF==1 --> BUG() */
UNLIKELY_START(be, vmread)
_ASM_BUGFRAME_TEXT(0)
UNLIKELY_END_SECTION
- : "=rm" (*value)
- : "r" (field),
+ : [value] "=rm" (value)
+ : [field] "r" (field),
_ASM_BUGFRAME_INFO(BUGFRAME_bug, __LINE__, __FILE__, 0) );
+
+ return value;
+}
+
+static always_inline void __vmread(unsigned long field, unsigned long *value)
+{
+ *value = vmread(field);
}
static always_inline void __vmwrite(unsigned long field, unsigned long value)
@@ -363,7 +372,7 @@ static inline enum vmx_insn_errno vmread_safe(unsigned long
field,
if ( unlikely(fail_invalid) )
ret = VMX_INSN_FAIL_INVALID;
else if ( unlikely(fail_valid) )
- __vmread(VM_INSTRUCTION_ERROR, &ret);
+ ret = vmread(VM_INSTRUCTION_ERROR);
return ret;
}
@@ -371,8 +380,6 @@ static inline enum vmx_insn_errno vmread_safe(unsigned long
field,
static inline enum vmx_insn_errno vmwrite_safe(unsigned long field,
unsigned long value)
{
- unsigned long ret;
-
asm goto ( "vmwrite %[value], %[field]\n\t"
"jc %l[vmfail_invalid]\n\t"
"jz %l[vmfail_error]"
@@ -386,8 +393,7 @@ static inline enum vmx_insn_errno vmwrite_safe(unsigned
long field,
return VMX_INSN_FAIL_INVALID;
vmfail_error:
- __vmread(VM_INSTRUCTION_ERROR, &ret);
- return ret;
+ return vmread(VM_INSTRUCTION_ERROR);
}
static always_inline void __invept(unsigned long type, uint64_t eptp)
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |