Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c
- index aa5c064a6a22..667098989e6e 100644
- --- a/arch/x86/kernel/cpu/mtrr/generic.c
- +++ b/arch/x86/kernel/cpu/mtrr/generic.c
- @@ -459,6 +459,35 @@ void __init mtrr_bp_pat_init(void)
- local_irq_restore(flags);
- }
- +/*
- + * Set the MSR pair relating to a var range.
- + * Returns true if changes are made.
- + */
- +static bool set_mtrr_var_ranges(unsigned int index, struct mtrr_var_range *vr)
- +{
- + unsigned int lo, hi;
- + bool changed = false;
- +
- + rdmsr(MTRRphysBase_MSR(index), lo, hi);
- + if ((vr->base_lo & 0xfffff0ffUL) != (lo & 0xfffff0ffUL)
- + || (vr->base_hi & (size_and_mask >> (32 - PAGE_SHIFT))) !=
- + (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
- +
- + mtrr_wrmsr(MTRRphysBase_MSR(index), vr->base_lo, vr->base_hi);
- + changed = true;
- + }
- +
- + rdmsr(MTRRphysMask_MSR(index), lo, hi);
- +
- + if ((vr->mask_lo & 0xfffff800UL) != (lo & 0xfffff800UL)
- + || (vr->mask_hi & (size_and_mask >> (32 - PAGE_SHIFT))) !=
- + (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
- + mtrr_wrmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi);
- + changed = true;
- + }
- + return changed;
- +}
- +
- /* Grab all of the MTRR state for this CPU into *state */
- bool __init get_mtrr_state(void)
- {
- @@ -471,8 +500,14 @@ bool __init get_mtrr_state(void)
- rdmsr(MSR_MTRRcap, lo, dummy);
- mtrr_state.have_fixed = (lo >> 8) & 1;
- - for (i = 0; i < num_var_ranges; i++)
- + for (i = 0; i < num_var_ranges; i++) {
- get_mtrr_var_range(i, &vrs[i]);
- + // Set all to uncachable
- + if (vrs[i].base_lo & 0xff) {
- + vrs[i].base_lo ^= (vrs[i].base_lo & 0xff);
- + set_mtrr_var_ranges(i, &vrs[i]);
- + }
- + }
- if (mtrr_state.have_fixed)
- get_fixed_ranges(mtrr_state.fixed_ranges);
- @@ -651,34 +686,6 @@ static int set_fixed_ranges(mtrr_type *frs)
- return changed;
- }
- -/*
- - * Set the MSR pair relating to a var range.
- - * Returns true if changes are made.
- - */
- -static bool set_mtrr_var_ranges(unsigned int index, struct mtrr_var_range *vr)
- -{
- - unsigned int lo, hi;
- - bool changed = false;
- -
- - rdmsr(MTRRphysBase_MSR(index), lo, hi);
- - if ((vr->base_lo & 0xfffff0ffUL) != (lo & 0xfffff0ffUL)
- - || (vr->base_hi & (size_and_mask >> (32 - PAGE_SHIFT))) !=
- - (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
- -
- - mtrr_wrmsr(MTRRphysBase_MSR(index), vr->base_lo, vr->base_hi);
- - changed = true;
- - }
- -
- - rdmsr(MTRRphysMask_MSR(index), lo, hi);
- -
- - if ((vr->mask_lo & 0xfffff800UL) != (lo & 0xfffff800UL)
- - || (vr->mask_hi & (size_and_mask >> (32 - PAGE_SHIFT))) !=
- - (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
- - mtrr_wrmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi);
- - changed = true;
- - }
- - return changed;
- -}
- static u32 deftype_lo, deftype_hi;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement