[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] hvmloader: MTRR UC type covers the pci regions only.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1231506010 0 # Node ID 6d040d138e8fb7958bbf7bfd0fee507addb4b99c # Parent b84345ee0d41435766d1fda4658c582446ef5326 hvmloader: MTRR UC type covers the pci regions only. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- tools/firmware/hvmloader/cacheattr.c | 26 +++++++++++++++++++------- 1 files changed, 19 insertions(+), 7 deletions(-) diff -r b84345ee0d41 -r 6d040d138e8f tools/firmware/hvmloader/cacheattr.c --- a/tools/firmware/hvmloader/cacheattr.c Fri Jan 09 12:41:25 2009 +0000 +++ b/tools/firmware/hvmloader/cacheattr.c Fri Jan 09 13:00:10 2009 +0000 @@ -88,13 +88,25 @@ void cacheattr_init(void) nr_var_ranges = (uint8_t)mtrr_cap; if ( nr_var_ranges != 0 ) { - /* A single UC range covering PCI space. */ - /* pci_mem_start must be of the binary form 1....10....0 */ - BUG_ON(~(pci_mem_start | (pci_mem_start - 1))); - wrmsr(MSR_MTRRphysBase(0), pci_mem_start); - wrmsr(MSR_MTRRphysMask(0), - ((uint64_t)(int32_t)pci_mem_start & addr_mask) | (1u << 11)); - printf("var MTRRs ... "); + unsigned long base = pci_mem_start, size; + int i; + + for ( i = 0; (base != pci_mem_end) && (i < nr_var_ranges); i++ ) + { + size = PAGE_SIZE; + while ( !(base & size) ) + size <<= 1; + while ( ((base + size) < base) || ((base + size) > pci_mem_end) ) + size >>= 1; + + wrmsr(MSR_MTRRphysBase(i), base); + wrmsr(MSR_MTRRphysMask(i), + (~(uint64_t)(size-1) & addr_mask) | (1u << 11)); + + base += size; + } + + printf("var MTRRs [%d/%d] ... ", i, nr_var_ranges); } wrmsr(MSR_MTRRdefType, mtrr_def); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |