|
@@ -67,9 +67,10 @@ static void set_var_mtrr(uint reg, uint type, uint64_t start, uint64_t size)
|
|
|
|
|
|
void mtrr_read_all(struct mtrr_info *info)
|
|
|
{
|
|
|
+ int reg_count = mtrr_get_var_count();
|
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < MTRR_COUNT; i++) {
|
|
|
+ for (i = 0; i < reg_count; i++) {
|
|
|
info->mtrr[i].base = native_read_msr(MTRR_PHYS_BASE_MSR(i));
|
|
|
info->mtrr[i].mask = native_read_msr(MTRR_PHYS_MASK_MSR(i));
|
|
|
}
|
|
@@ -77,10 +78,11 @@ void mtrr_read_all(struct mtrr_info *info)
|
|
|
|
|
|
void mtrr_write_all(struct mtrr_info *info)
|
|
|
{
|
|
|
+ int reg_count = mtrr_get_var_count();
|
|
|
struct mtrr_state state;
|
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < MTRR_COUNT; i++) {
|
|
|
+ for (i = 0; i < reg_count; i++) {
|
|
|
mtrr_open(&state, true);
|
|
|
wrmsrl(MTRR_PHYS_BASE_MSR(i), info->mtrr[i].base);
|
|
|
wrmsrl(MTRR_PHYS_MASK_MSR(i), info->mtrr[i].mask);
|
|
@@ -156,7 +158,7 @@ int mtrr_commit(bool do_caches)
|
|
|
|
|
|
/* Clear the ones that are unused */
|
|
|
debug("clear\n");
|
|
|
- for (; i < MTRR_COUNT; i++)
|
|
|
+ for (; i < MTRR_MAX_COUNT; i++)
|
|
|
wrmsrl(MTRR_PHYS_MASK_MSR(i), 0);
|
|
|
debug("close\n");
|
|
|
mtrr_close(&state, do_caches);
|
|
@@ -196,7 +198,7 @@ int mtrr_add_request(int type, uint64_t start, uint64_t size)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int get_var_mtrr_count(void)
|
|
|
+int mtrr_get_var_count(void)
|
|
|
{
|
|
|
return msr_read(MSR_MTRR_CAP_MSR).lo & MSR_MTRR_CAP_VCNT;
|
|
|
}
|
|
@@ -207,7 +209,7 @@ static int get_free_var_mtrr(void)
|
|
|
int vcnt;
|
|
|
int i;
|
|
|
|
|
|
- vcnt = get_var_mtrr_count();
|
|
|
+ vcnt = mtrr_get_var_count();
|
|
|
|
|
|
/* Identify the first var mtrr which is not valid */
|
|
|
for (i = 0; i < vcnt; i++) {
|