From e32bc9e36d5cfa4fb9f0acc12318b971b407bcc7 Mon Sep 17 00:00:00 2001 From: Yin Fengwei Date: Mon, 29 Oct 2018 17:23:12 +0800 Subject: [PATCH] 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 Acked-by: Eddie Dong --- hypervisor/arch/x86/guest/vcpu.c | 17 ++++++++++------- hypervisor/include/arch/x86/guest/guest.h | 2 ++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/hypervisor/arch/x86/guest/vcpu.c b/hypervisor/arch/x86/guest/vcpu.c index 360f68f63..d95c8c8f1 100644 --- a/hypervisor/arch/x86/guest/vcpu.c +++ b/hypervisor/arch/x86/guest/vcpu.c @@ -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); ctx = &(vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].run_ctx); - if (vcpu_regs->cs_ar & (1U << 15U)) { - limit = 0xFFFFFFFFU; - } else { - limit = 0xFFFFU; - } - + /* NOTE: + * This is to set the attr and limit to default value. + * If the set_vcpu_regs is used not only for vcpu state + * initialization, this part of code needs be revised. + */ if (vcpu_regs->cr0 & CR0_PE) { attr = PROTECTED_MODE_DATA_SEG_AR; + limit = PROTECTED_MODE_SEG_LIMIT; } else { attr = REAL_MODE_DATA_SEG_AR; + limit = REAL_MODE_SEG_LIMIT; } 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++; } - /* override cs attr/base */ + /* override cs attr/base/limit */ ectx->cs.attr = vcpu_regs->cs_ar; ectx->cs.base = vcpu_regs->cs_base; + ectx->cs.limit = vcpu_regs->cs_limit; ectx->gdtr.base = vcpu_regs->gdt.base; 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_sel = REAL_MODE_BSP_INIT_CODE_SEL, .cs_base = 0xFFFF0000UL, + .cs_limit = 0xFFFFU, .rip = 0xFFF0UL, .cr0 = CR0_ET | CR0_NE, .cr3 = 0UL, diff --git a/hypervisor/include/arch/x86/guest/guest.h b/hypervisor/include/arch/x86/guest/guest.h index 8089b1647..5b6d56ca0 100644 --- a/hypervisor/include/arch/x86/guest/guest.h +++ b/hypervisor/include/arch/x86/guest/guest.h @@ -69,6 +69,8 @@ #define REAL_MODE_CODE_SEG_AR (0x009fU) #define PROTECTED_MODE_DATA_SEG_AR (0xc093U) #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 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 */