Skip to content

Commit ab156c9

Browse files
junjiemao1lijinxia
authored andcommitted
HV: instr_emul: convert return value of get_vmcs_field to unsigned
get_vmcs_field() returns a VMCS field offset which is normally unsigned, but it also returns negatives (-1 here) on invalid arguments. Following the convention we use for vectors, pins, etc., use a special unsigned value to indicate such errors. v1 -> v2: * Use a special value (VMX_INVALID_VMCS_FIELD) instead of a seperate output parameter to indicate errors. Signed-off-by: Junjie Mao <junjie.mao@intel.com>
1 parent d457874 commit ab156c9

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

hypervisor/arch/x86/guest/instr_emul_wrapper.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
#include "instr_emul_wrapper.h"
1010
#include "instr_emul.h"
1111

12+
#define VMX_INVALID_VMCS_FIELD 0xffffffffU
13+
1214
static int
1315
encode_vmcs_seg_desc(enum cpu_reg_name seg,
1416
uint32_t *base, uint32_t *lim, uint32_t *acc);
1517

16-
static int32_t
18+
static uint32_t
1719
get_vmcs_field(enum cpu_reg_name ident);
1820

1921
static bool
@@ -36,9 +38,9 @@ int vm_get_register(struct vcpu *vcpu, enum cpu_reg_name reg, uint64_t *retval)
3638
&vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context];
3739
*retval = cur_context->guest_cpu_regs.longs[reg];
3840
} else if ((reg > CPU_REG_RDI) && (reg < CPU_REG_LAST)) {
39-
int32_t field = get_vmcs_field(reg);
41+
uint32_t field = get_vmcs_field(reg);
4042

41-
if (field != -1)
43+
if (field != VMX_INVALID_VMCS_FIELD)
4244
*retval = exec_vmread(field);
4345
else
4446
return -EINVAL;
@@ -61,9 +63,9 @@ int vm_set_register(struct vcpu *vcpu, enum cpu_reg_name reg, uint64_t val)
6163
&vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context];
6264
cur_context->guest_cpu_regs.longs[reg] = val;
6365
} else if ((reg > CPU_REG_RDI) && (reg < CPU_REG_LAST)) {
64-
int32_t field = get_vmcs_field(reg);
66+
uint32_t field = get_vmcs_field(reg);
6567

66-
if (field != -1)
68+
if (field != VMX_INVALID_VMCS_FIELD)
6769
exec_vmwrite(field, val);
6870
else
6971
return -EINVAL;
@@ -208,7 +210,7 @@ encode_vmcs_seg_desc(enum cpu_reg_name seg,
208210
return 0;
209211
}
210212

211-
static int32_t get_vmcs_field(enum cpu_reg_name ident)
213+
static uint32_t get_vmcs_field(enum cpu_reg_name ident)
212214
{
213215
switch (ident) {
214216
case CPU_REG_CR0:
@@ -252,7 +254,7 @@ static int32_t get_vmcs_field(enum cpu_reg_name ident)
252254
case CPU_REG_PDPTE3:
253255
return VMX_GUEST_PDPTE3_FULL;
254256
default:
255-
return -1;
257+
return VMX_INVALID_VMCS_FIELD;
256258
}
257259
}
258260

0 commit comments

Comments
 (0)