|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 4/6] hvm/mtrr: copy hardware state for Dom0
>>> On 15.05.18 at 16:36, <roger.pau@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/hvm/mtrr.c
> +++ b/xen/arch/x86/hvm/mtrr.c
> @@ -185,6 +185,30 @@ int hvm_vcpu_cacheattr_init(struct vcpu *v)
> ((uint64_t)PAT_TYPE_UC_MINUS << 48) | /* PAT6: UC- */
> ((uint64_t)PAT_TYPE_UNCACHABLE << 56); /* PAT7: UC */
>
> + if ( is_hardware_domain(v->domain) )
> + {
> + /* Copy values from the host. */
> + struct domain *d = v->domain;
> + unsigned int i;
> +
> + if ( mtrr_state.have_fixed )
> + for ( i = 0; i < NUM_FIXED_MSR; i++ )
> + mtrr_fix_range_msr_set(d, m, i,
> + ((uint64_t
> *)mtrr_state.fixed_ranges)[i]);
> +
> + for ( i = 0; i < num_var_ranges; i++ )
> + {
> + mtrr_var_range_msr_set(d, m, MSR_IA32_MTRR_PHYSBASE(i),
> + mtrr_state.var_ranges[i].base);
> + mtrr_var_range_msr_set(d, m, MSR_IA32_MTRR_PHYSMASK(i),
> + mtrr_state.var_ranges[i].mask);
> + }
> +
> + mtrr_def_type_msr_set(d, m,
> + mtrr_state.def_type |
> + (mtrr_state.enabled << MTRRdefType_FE_SHIFT));
This is all very clumsy (not your fault of course) - in particular, the
"enabled"
field is a two-bit value. I'd rather not see this to continue to be that way,
and hence I've created a patch to clean this up (see below; I'm intentionally
retaining my own TODO notes in there for your reference, and it's also
unlikely to apply as is because it sits on top of other changes). In that light
I
think I'd prefer if you either (later) re-based this onto my patch or reverted
back to the use of the literal 10 here.
Jan
TODO: rename _enabled to enabled for submission (but keep it this way here to
make sure further possibly necessary adjustments are noticed)
TODO: replace 10 and 11 by manifest constants (Roger supposedly will add those)
x86/mtrr: split "enabled" field into two boolean flags
The code hopefully is more readable this way.
Also switch have_fixed to bool, seeing that it already is used as a
boolean.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
--- unstable.orig/xen/arch/x86/cpu/mtrr/generic.c
+++ unstable/xen/arch/x86/cpu/mtrr/generic.c
@@ -79,7 +79,8 @@ void __init get_mtrr_state(void)
rdmsrl(MSR_MTRRdefType, msr_content);
mtrr_state.def_type = (msr_content & 0xff);
- mtrr_state.enabled = (msr_content & 0xc00) >> 10;
+ mtrr_state._enabled = (msr_content >> 11) & 1;
+ mtrr_state.fixed_enabled = (msr_content >> 10) & 1;
/* Store mtrr_cap for HVM MTRR virtualisation. */
rdmsrl(MSR_MTRRcap, mtrr_state.mtrr_cap);
@@ -158,7 +159,7 @@ static void __init print_mtrr_state(cons
unsigned int base = 0, step = 0x10000;
printk("%sMTRR fixed ranges %sabled:\n", level,
- mtrr_state.enabled & 1 ? "en" : "dis");
+ mtrr_state.fixed_enabled ? "en" : "dis");
for (; block->ranges; ++block, step >>= 2) {
for (i = 0; i < block->ranges; ++i, fr += 8) {
print_fixed(base, step, fr, level);
@@ -168,7 +169,7 @@ static void __init print_mtrr_state(cons
print_fixed_last(level);
}
printk("%sMTRR variable ranges %sabled:\n", level,
- mtrr_state.enabled & 2 ? "en" : "dis");
+ mtrr_state._enabled ? "en" : "dis");
width = (paddr_bits - PAGE_SHIFT + 3) / 4;
for (i = 0; i < num_var_ranges; ++i) {
@@ -382,8 +383,11 @@ static unsigned long set_mtrr_state(void
/* Set_mtrr_restore restores the old value of MTRRdefType,
so to set it we fiddle with the saved value */
if ((deftype & 0xff) != mtrr_state.def_type
- || ((deftype & 0xc00) >> 10) != mtrr_state.enabled) {
- deftype = (deftype & ~0xcff) | mtrr_state.def_type |
(mtrr_state.enabled << 10);
+ || ((deftype >> 11) & 1) != mtrr_state._enabled
+ || ((deftype >> 10) & 1) != mtrr_state.fixed_enabled) {
+ deftype = (deftype & ~0xcff) | mtrr_state.def_type |
+ (mtrr_state._enabled << 11) |
+ (mtrr_state.fixed_enabled << 10);
change_mask |= MTRR_CHANGE_MASK_DEFTYPE;
}
--- unstable.orig/xen/arch/x86/hvm/hvm.c
+++ unstable/xen/arch/x86/hvm/hvm.c
@@ -3497,8 +3497,9 @@ int hvm_msr_read_intercept(unsigned int
case MSR_MTRRdefType:
if ( !d->arch.cpuid->basic.mtrr )
goto gp_fault;
- *msr_content = v->arch.hvm_vcpu.mtrr.def_type
- | (v->arch.hvm_vcpu.mtrr.enabled << 10);
+ *msr_content = v->arch.hvm_vcpu.mtrr.def_type |
+ (v->arch.hvm_vcpu.mtrr._enabled << 11) |
+ (v->arch.hvm_vcpu.mtrr.fixed_enabled << 10);
break;
case MSR_MTRRfix64K_00000:
if ( !d->arch.cpuid->basic.mtrr )
--- unstable.orig/xen/arch/x86/hvm/mtrr.c
+++ unstable/xen/arch/x86/hvm/mtrr.c
@@ -195,11 +195,11 @@ static int get_mtrr_type(const struct mt
uint64_t mask = -(uint64_t)PAGE_SIZE << order;
unsigned int seg, num_var_ranges = m->mtrr_cap & 0xff;
- if ( unlikely(!(m->enabled & 0x2)) )
+ if ( unlikely(!m->_enabled) )
return MTRR_TYPE_UNCACHABLE;
pa &= mask;
- if ( (pa < 0x100000) && (m->enabled & 1) )
+ if ( (pa < 0x100000) && m->fixed_enabled )
{
/* Fixed range MTRR takes effect. */
uint32_t addr = (uint32_t)pa, index;
@@ -391,7 +391,8 @@ bool_t mtrr_def_type_msr_set(struct doma
uint64_t msr_content)
{
uint8_t def_type = msr_content & 0xff;
- uint8_t enabled = (msr_content >> 10) & 0x3;
+ uint8_t fixed_enabled = (msr_content >> 10) & 1;
+ uint8_t enabled = (msr_content >> 11) & 1;
if ( unlikely(!valid_mtrr_type(def_type)) )
{
@@ -406,10 +407,12 @@ bool_t mtrr_def_type_msr_set(struct doma
return 0;
}
- if ( m->enabled != enabled || m->def_type != def_type )
+ if ( m->_enabled != enabled || m->def_type != def_type ||
+ m->fixed_enabled != fixed_enabled )
{
- m->enabled = enabled;
+ m->_enabled = enabled;
m->def_type = def_type;
+ m->fixed_enabled = fixed_enabled;
memory_type_changed(d);
}
@@ -432,7 +435,7 @@ bool_t mtrr_fix_range_msr_set(struct dom
fixed_range_base[row] = msr_content;
- if ( m->enabled == 3 )
+ if ( m->_enabled && m->fixed_enabled )
memory_type_changed(d);
}
@@ -470,7 +473,7 @@ bool_t mtrr_var_range_msr_set(
m->overlapped = is_var_mtrr_overlapped(m);
- if ( m->enabled & 2 )
+ if ( m->_enabled )
memory_type_changed(d);
return 1;
@@ -481,10 +484,10 @@ bool mtrr_pat_not_equal(const struct vcp
const struct mtrr_state *md = &vd->arch.hvm_vcpu.mtrr;
const struct mtrr_state *ms = &vs->arch.hvm_vcpu.mtrr;
- if ( (md->enabled ^ ms->enabled) & 2 )
+ if ( md->_enabled != ms->_enabled )
return true;
- if ( md->enabled & 2 )
+ if ( md->_enabled )
{
unsigned int num_var_ranges = (uint8_t)md->mtrr_cap;
@@ -493,10 +496,10 @@ bool mtrr_pat_not_equal(const struct vcp
return true;
/* Test fixed ranges. */
- if ( (md->enabled ^ ms->enabled) & 1 )
+ if ( md->fixed_enabled != ms->fixed_enabled )
return true;
- if ( (md->enabled & 1) &&
+ if ( md->fixed_enabled &&
memcmp(md->fixed_ranges, ms->fixed_ranges,
sizeof(md->fixed_ranges)) )
return true;
@@ -684,7 +687,8 @@ static int hvm_save_mtrr_msr(struct doma
const struct mtrr_state *mtrr_state = &v->arch.hvm_vcpu.mtrr;
struct hvm_hw_mtrr hw_mtrr = {
.msr_mtrr_def_type = mtrr_state->def_type |
- (mtrr_state->enabled << 10),
+ (mtrr_state->fixed_enabled << 10) |
+ (mtrr_state->_enabled << 11),
.msr_mtrr_cap = mtrr_state->mtrr_cap,
};
unsigned int i;
--- unstable.orig/xen/include/asm-x86/mtrr.h
+++ unstable/xen/include/asm-x86/mtrr.h
@@ -50,8 +50,9 @@ struct mtrr_var_range {
struct mtrr_state {
struct mtrr_var_range *var_ranges;
mtrr_type fixed_ranges[NUM_FIXED_RANGES];
- unsigned char enabled;
- unsigned char have_fixed;
+ bool _enabled;
+ bool fixed_enabled;
+ bool have_fixed;
mtrr_type def_type;
u64 mtrr_cap;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |