hv: cpu: remove general-purpose register mapping in instruction emulation

The general-purpose register layout is identical to instructio emulation context.
So no need to do the mapping.

Signed-off-by: Binbin Wu <binbin.wu@intel.com>
Reviewed-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
Binbin Wu 2018-07-24 18:45:01 +08:00 committed by lijinxia
parent b2802f3d1d
commit 586b527e2c

View File

@ -214,25 +214,6 @@ static const struct vie_op one_byte_opcodes[256] = {
#define GB (1024 * 1024 * 1024) #define GB (1024 * 1024 * 1024)
static enum cpu_reg_name gpr_map[16] = {
CPU_REG_RAX,
CPU_REG_RCX,
CPU_REG_RDX,
CPU_REG_RBX,
CPU_REG_RSP,
CPU_REG_RBP,
CPU_REG_RSI,
CPU_REG_RDI,
CPU_REG_R8,
CPU_REG_R9,
CPU_REG_R10,
CPU_REG_R11,
CPU_REG_R12,
CPU_REG_R13,
CPU_REG_R14,
CPU_REG_R15
};
static uint64_t size2mask[9] = { static uint64_t size2mask[9] = {
[1] = 0xffUL, [1] = 0xffUL,
[2] = 0xffffUL, [2] = 0xffffUL,
@ -256,7 +237,7 @@ static void
vie_calc_bytereg(struct vie *vie, enum cpu_reg_name *reg, int *lhbr) vie_calc_bytereg(struct vie *vie, enum cpu_reg_name *reg, int *lhbr)
{ {
*lhbr = 0; *lhbr = 0;
*reg = gpr_map[vie->reg]; *reg = vie->reg;
/* /*
* 64-bit mode imposes limitations on accessing legacy high byte * 64-bit mode imposes limitations on accessing legacy high byte
@ -273,7 +254,7 @@ vie_calc_bytereg(struct vie *vie, enum cpu_reg_name *reg, int *lhbr)
if (vie->rex_present == 0U) { if (vie->rex_present == 0U) {
if ((vie->reg & 0x4U) != 0U) { if ((vie->reg & 0x4U) != 0U) {
*lhbr = 1; *lhbr = 1;
*reg = gpr_map[vie->reg & 0x3U]; *reg = vie->reg & 0x3U;
} }
} }
} }
@ -452,7 +433,7 @@ emulate_mov(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
* REX.W + 89/r mov r/m64, r64 * REX.W + 89/r mov r/m64, r64
*/ */
reg = gpr_map[vie->reg]; reg = vie->reg;
error = vie_read_register(vcpu, reg, &val); error = vie_read_register(vcpu, reg, &val);
if (error == 0) { if (error == 0) {
val &= size2mask[size]; val &= size2mask[size];
@ -481,7 +462,7 @@ emulate_mov(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
*/ */
error = memread(vcpu, gpa, &val, size, arg); error = memread(vcpu, gpa, &val, size, arg);
if (error == 0) { if (error == 0) {
reg = gpr_map[vie->reg]; reg = vie->reg;
error = vie_update_register(vcpu, reg, error = vie_update_register(vcpu, reg,
val, size); val, size);
} }
@ -574,7 +555,7 @@ emulate_movx(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
} }
/* get the second operand */ /* get the second operand */
reg = gpr_map[vie->reg]; reg = vie->reg;
/* zero-extend byte */ /* zero-extend byte */
val = (uint8_t)val; val = (uint8_t)val;
@ -595,7 +576,7 @@ emulate_movx(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
return error; return error;
} }
reg = gpr_map[vie->reg]; reg = vie->reg;
/* zero-extend word */ /* zero-extend word */
val = (uint16_t)val; val = (uint16_t)val;
@ -619,7 +600,7 @@ emulate_movx(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
} }
/* get the second operand */ /* get the second operand */
reg = gpr_map[vie->reg]; reg = vie->reg;
/* sign extend byte */ /* sign extend byte */
val = (int8_t)val; val = (int8_t)val;
@ -876,7 +857,7 @@ emulate_test(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
*/ */
/* get the first operand */ /* get the first operand */
reg = gpr_map[vie->reg]; reg = vie->reg;
error = vie_read_register(vcpu, reg, &val1); error = vie_read_register(vcpu, reg, &val1);
if (error != 0) { if (error != 0) {
break; break;
@ -935,7 +916,7 @@ emulate_and(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
*/ */
/* get the first operand */ /* get the first operand */
reg = gpr_map[vie->reg]; reg = vie->reg;
error = vie_read_register(vcpu, reg, &val1); error = vie_read_register(vcpu, reg, &val1);
if (error != 0) { if (error != 0) {
break; break;
@ -1060,7 +1041,7 @@ emulate_or(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
} }
/* get the second operand */ /* get the second operand */
reg = gpr_map[vie->reg]; reg = vie->reg;
error = vie_read_register(vcpu, reg, &val2); error = vie_read_register(vcpu, reg, &val2);
if (error != 0) { if (error != 0) {
break; break;
@ -1121,7 +1102,7 @@ emulate_cmp(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
*/ */
/* Get the register operand */ /* Get the register operand */
reg = gpr_map[vie->reg]; reg = vie->reg;
error = vie_read_register(vcpu, reg, &regop); error = vie_read_register(vcpu, reg, &regop);
if (error != 0) { if (error != 0) {
return error; return error;
@ -1213,7 +1194,7 @@ emulate_sub(struct vcpu *vcpu, uint64_t gpa, struct vie *vie,
*/ */
/* get the first operand */ /* get the first operand */
reg = gpr_map[vie->reg]; reg = vie->reg;
error = vie_read_register(vcpu, reg, &val1); error = vie_read_register(vcpu, reg, &val1);
if (error != 0) { if (error != 0) {
break; break;
@ -2002,7 +1983,7 @@ decode_sib(struct vie *vie)
*/ */
vie->disp_bytes = 4U; vie->disp_bytes = 4U;
} else { } else {
vie->base_register = gpr_map[vie->base]; vie->base_register = vie->base;
} }
/* /*
@ -2013,7 +1994,7 @@ decode_sib(struct vie *vie)
* Table 2-5: Special Cases of REX Encodings * Table 2-5: Special Cases of REX Encodings
*/ */
if (vie->index != 4U) { if (vie->index != 4U) {
vie->index_register = gpr_map[vie->index]; vie->index_register = vie->index;
} }
/* 'scale' makes sense only in the context of an index register */ /* 'scale' makes sense only in the context of an index register */