hv: avoid hardcode cs.limit in set_vcpu_regs()

For SOS BSP, we reuse native saved cs.limit
For UOS BSP, we set cs.limit in DM
For AP, we use initialized data from realmode_init_regs.

Tracked-On: #1231
Signed-off-by: Yin Fengwei <fengwei.yin@intel.com>
Acked-by: Eddie Dong <Eddie.dong@intel.com>
This commit is contained in:
Yin Fengwei 2018-10-29 17:23:12 +08:00 committed by lijinxia
parent 0cd85749fe
commit e32bc9e36d
2 changed files with 12 additions and 7 deletions

View File

@ -189,16 +189,17 @@ void set_vcpu_regs(struct vcpu *vcpu, struct acrn_vcpu_regs *vcpu_regs)
ectx = &(vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].ext_ctx); ectx = &(vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].ext_ctx);
ctx = &(vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].run_ctx); ctx = &(vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].run_ctx);
if (vcpu_regs->cs_ar & (1U << 15U)) { /* NOTE:
limit = 0xFFFFFFFFU; * This is to set the attr and limit to default value.
} else { * If the set_vcpu_regs is used not only for vcpu state
limit = 0xFFFFU; * initialization, this part of code needs be revised.
} */
if (vcpu_regs->cr0 & CR0_PE) { if (vcpu_regs->cr0 & CR0_PE) {
attr = PROTECTED_MODE_DATA_SEG_AR; attr = PROTECTED_MODE_DATA_SEG_AR;
limit = PROTECTED_MODE_SEG_LIMIT;
} else { } else {
attr = REAL_MODE_DATA_SEG_AR; attr = REAL_MODE_DATA_SEG_AR;
limit = REAL_MODE_SEG_LIMIT;
} }
for (seg = &(ectx->cs); seg <= &(ectx->gs); seg++) { for (seg = &(ectx->cs); seg <= &(ectx->gs); seg++) {
@ -209,9 +210,10 @@ void set_vcpu_regs(struct vcpu *vcpu, struct acrn_vcpu_regs *vcpu_regs)
sel++; sel++;
} }
/* override cs attr/base */ /* override cs attr/base/limit */
ectx->cs.attr = vcpu_regs->cs_ar; ectx->cs.attr = vcpu_regs->cs_ar;
ectx->cs.base = vcpu_regs->cs_base; ectx->cs.base = vcpu_regs->cs_base;
ectx->cs.limit = vcpu_regs->cs_limit;
ectx->gdtr.base = vcpu_regs->gdt.base; ectx->gdtr.base = vcpu_regs->gdt.base;
ectx->gdtr.limit = vcpu_regs->gdt.limit; ectx->gdtr.limit = vcpu_regs->gdt.limit;
@ -271,6 +273,7 @@ static struct acrn_vcpu_regs realmode_init_regs = {
.cs_ar = REAL_MODE_CODE_SEG_AR, .cs_ar = REAL_MODE_CODE_SEG_AR,
.cs_sel = REAL_MODE_BSP_INIT_CODE_SEL, .cs_sel = REAL_MODE_BSP_INIT_CODE_SEL,
.cs_base = 0xFFFF0000UL, .cs_base = 0xFFFF0000UL,
.cs_limit = 0xFFFFU,
.rip = 0xFFF0UL, .rip = 0xFFF0UL,
.cr0 = CR0_ET | CR0_NE, .cr0 = CR0_ET | CR0_NE,
.cr3 = 0UL, .cr3 = 0UL,

View File

@ -69,6 +69,8 @@
#define REAL_MODE_CODE_SEG_AR (0x009fU) #define REAL_MODE_CODE_SEG_AR (0x009fU)
#define PROTECTED_MODE_DATA_SEG_AR (0xc093U) #define PROTECTED_MODE_DATA_SEG_AR (0xc093U)
#define PROTECTED_MODE_CODE_SEG_AR (0xc09bU) #define PROTECTED_MODE_CODE_SEG_AR (0xc09bU)
#define REAL_MODE_SEG_LIMIT (0xffffU)
#define PROTECTED_MODE_SEG_LIMIT (0xffffffffU)
#define DR7_INIT_VALUE (0x400UL) #define DR7_INIT_VALUE (0x400UL)
#define LDTR_AR (0x0082U) /* LDT, type must be 2, refer to SDM Vol3 26.3.1.2 */ #define LDTR_AR (0x0082U) /* LDT, type must be 2, refer to SDM Vol3 26.3.1.2 */
#define TR_AR (0x008bU) /* TSS (busy), refer to SDM Vol3 26.3.1.2 */ #define TR_AR (0x008bU) /* TSS (busy), refer to SDM Vol3 26.3.1.2 */