Advertisement
Guest User

Untitled

a guest
Sep 3rd, 2019
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1. diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c
  2. index aa5c064a6a22..667098989e6e 100644
  3. --- a/arch/x86/kernel/cpu/mtrr/generic.c
  4. +++ b/arch/x86/kernel/cpu/mtrr/generic.c
  5. @@ -459,6 +459,35 @@ void __init mtrr_bp_pat_init(void)
  6. local_irq_restore(flags);
  7. }
  8.  
  9. +/*
  10. + * Set the MSR pair relating to a var range.
  11. + * Returns true if changes are made.
  12. + */
  13. +static bool set_mtrr_var_ranges(unsigned int index, struct mtrr_var_range *vr)
  14. +{
  15. + unsigned int lo, hi;
  16. + bool changed = false;
  17. +
  18. + rdmsr(MTRRphysBase_MSR(index), lo, hi);
  19. + if ((vr->base_lo & 0xfffff0ffUL) != (lo & 0xfffff0ffUL)
  20. + || (vr->base_hi & (size_and_mask >> (32 - PAGE_SHIFT))) !=
  21. + (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
  22. +
  23. + mtrr_wrmsr(MTRRphysBase_MSR(index), vr->base_lo, vr->base_hi);
  24. + changed = true;
  25. + }
  26. +
  27. + rdmsr(MTRRphysMask_MSR(index), lo, hi);
  28. +
  29. + if ((vr->mask_lo & 0xfffff800UL) != (lo & 0xfffff800UL)
  30. + || (vr->mask_hi & (size_and_mask >> (32 - PAGE_SHIFT))) !=
  31. + (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
  32. + mtrr_wrmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi);
  33. + changed = true;
  34. + }
  35. + return changed;
  36. +}
  37. +
  38. /* Grab all of the MTRR state for this CPU into *state */
  39. bool __init get_mtrr_state(void)
  40. {
  41. @@ -471,8 +500,14 @@ bool __init get_mtrr_state(void)
  42. rdmsr(MSR_MTRRcap, lo, dummy);
  43. mtrr_state.have_fixed = (lo >> 8) & 1;
  44.  
  45. - for (i = 0; i < num_var_ranges; i++)
  46. + for (i = 0; i < num_var_ranges; i++) {
  47. get_mtrr_var_range(i, &vrs[i]);
  48. + // Set all to uncachable
  49. + if (vrs[i].base_lo & 0xff) {
  50. + vrs[i].base_lo ^= (vrs[i].base_lo & 0xff);
  51. + set_mtrr_var_ranges(i, &vrs[i]);
  52. + }
  53. + }
  54. if (mtrr_state.have_fixed)
  55. get_fixed_ranges(mtrr_state.fixed_ranges);
  56.  
  57. @@ -651,34 +686,6 @@ static int set_fixed_ranges(mtrr_type *frs)
  58. return changed;
  59. }
  60.  
  61. -/*
  62. - * Set the MSR pair relating to a var range.
  63. - * Returns true if changes are made.
  64. - */
  65. -static bool set_mtrr_var_ranges(unsigned int index, struct mtrr_var_range *vr)
  66. -{
  67. - unsigned int lo, hi;
  68. - bool changed = false;
  69. -
  70. - rdmsr(MTRRphysBase_MSR(index), lo, hi);
  71. - if ((vr->base_lo & 0xfffff0ffUL) != (lo & 0xfffff0ffUL)
  72. - || (vr->base_hi & (size_and_mask >> (32 - PAGE_SHIFT))) !=
  73. - (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
  74. -
  75. - mtrr_wrmsr(MTRRphysBase_MSR(index), vr->base_lo, vr->base_hi);
  76. - changed = true;
  77. - }
  78. -
  79. - rdmsr(MTRRphysMask_MSR(index), lo, hi);
  80. -
  81. - if ((vr->mask_lo & 0xfffff800UL) != (lo & 0xfffff800UL)
  82. - || (vr->mask_hi & (size_and_mask >> (32 - PAGE_SHIFT))) !=
  83. - (hi & (size_and_mask >> (32 - PAGE_SHIFT)))) {
  84. - mtrr_wrmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi);
  85. - changed = true;
  86. - }
  87. - return changed;
  88. -}
  89.  
  90. static u32 deftype_lo, deftype_hi;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement