summaryrefslogtreecommitdiff
path: root/bios
diff options
context:
space:
mode:
authorAlex Williamson <alex.williamson@hp.com>2008-09-25 11:52:29 -0600
committerAvi Kivity <avi@redhat.com>2008-10-02 15:33:36 +0300
commitabab2aa1bba0b1af4d961c158f9bf0850c6af8f7 (patch)
tree86e59950f83eed57f147a25cfb74e9b9d764eb7d /bios
parentdd0f27d08ce415da6a5215f0901e7d98ab084f79 (diff)
kvm: bios: switch MTRRs to cover only the PCI range and default to WB
kvm: bios: switch MTRRs to cover only the PCI range and default to WB This matches how some bare metal machines report MTRRs and avoids the problem of running out of MTRRs to cover all of RAM. Signed-off-by: Alex Williamson <alex.williamson@hp.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'bios')
-rwxr-xr-xbios/rombios32.c24
1 files changed, 4 insertions, 20 deletions
diff --git a/bios/rombios32.c b/bios/rombios32.c
index 8e015710..921e2025 100755
--- a/bios/rombios32.c
+++ b/bios/rombios32.c
@@ -494,7 +494,6 @@ void setup_mtrr(void)
uint8_t valb[8];
uint64_t val;
} u;
- uint64_t vbase, vmask;
mtrr_cap = rdmsr(MSR_MTRRcap);
vcnt = mtrr_cap & 0xff;
@@ -521,25 +520,10 @@ void setup_mtrr(void)
wrmsr_smp(MSR_MTRRfix4K_E8000, 0);
wrmsr_smp(MSR_MTRRfix4K_F0000, 0);
wrmsr_smp(MSR_MTRRfix4K_F8000, 0);
- vbase = 0;
- --vcnt; /* leave one mtrr for VRAM */
- for (i = 0; i < vcnt && vbase < ram_size; ++i) {
- vmask = (1ull << 40) - 1;
- while (vbase + vmask + 1 > ram_size)
- vmask >>= 1;
- wrmsr_smp(MTRRphysBase_MSR(i), vbase | 6);
- wrmsr_smp(MTRRphysMask_MSR(i), (~vmask & 0xfffffff000ull) | 0x800);
- vbase += vmask + 1;
- }
- for (vbase = 1ull << 32; i < vcnt && vbase < ram_end; ++i) {
- vmask = (1ull << 40) - 1;
- while (vbase + vmask + 1 > ram_end)
- vmask >>= 1;
- wrmsr_smp(MTRRphysBase_MSR(i), vbase | 6);
- wrmsr_smp(MTRRphysMask_MSR(i), (~vmask & 0xfffffff000ull) | 0x800);
- vbase += vmask + 1;
- }
- wrmsr_smp(MSR_MTRRdefType, 0xc00);
+ /* Mark 3.5-4GB as UC, anything not specified defaults to WB */
+ wrmsr_smp(MTRRphysBase_MSR(0), 0xe0000000ull | 0);
+ wrmsr_smp(MTRRphysMask_MSR(0), ~(0x20000000ull - 1) | 0x800);
+ wrmsr_smp(MSR_MTRRdefType, 0xc06);
}
void ram_probe(void)