{
struct vcpu *curr = current;
const struct domain *currd = curr->domain;
+ const struct cpuid_policy *cp = currd->arch.cpuid;
bool vpmu_msr = false;
int ret;
return X86EMUL_OKAY;
case MSR_FS_BASE:
- if ( is_pv_32bit_domain(currd) )
+ if ( !cp->extd.lm )
break;
*val = read_fs_base();
return X86EMUL_OKAY;
case MSR_GS_BASE:
- if ( is_pv_32bit_domain(currd) )
+ if ( !cp->extd.lm )
break;
*val = read_gs_base();
return X86EMUL_OKAY;
case MSR_SHADOW_GS_BASE:
- if ( is_pv_32bit_domain(currd) )
+ if ( !cp->extd.lm )
break;
*val = curr->arch.pv.gs_base_user;
return X86EMUL_OKAY;
{
struct vcpu *curr = current;
const struct domain *currd = curr->domain;
+ const struct cpuid_policy *cp = currd->arch.cpuid;
bool vpmu_msr = false;
int ret;
uint64_t temp;
case MSR_FS_BASE:
- if ( is_pv_32bit_domain(currd) || !is_canonical_address(val) )
- break;
- write_fs_base(val);
- return X86EMUL_OKAY;
-
case MSR_GS_BASE:
- if ( is_pv_32bit_domain(currd) || !is_canonical_address(val) )
- break;
- write_gs_base(val);
- return X86EMUL_OKAY;
-
case MSR_SHADOW_GS_BASE:
- if ( is_pv_32bit_domain(currd) || !is_canonical_address(val) )
+ if ( !cp->extd.lm || !is_canonical_address(val) )
break;
- write_gs_shadow(val);
- curr->arch.pv.gs_base_user = val;
+
+ if ( reg == MSR_FS_BASE )
+ write_fs_base(val);
+ else if ( reg == MSR_GS_BASE )
+ write_gs_base(val);
+ else if ( reg == MSR_SHADOW_GS_BASE )
+ {
+ write_gs_shadow(val);
+ curr->arch.pv.gs_base_user = val;
+ }
+ else
+ ASSERT_UNREACHABLE();
return X86EMUL_OKAY;
case MSR_EFER: