Add possible PCI space MMIO areas as "Reserved" to the memory map in order to avoid using those areas for special Xen pages later.
Signed-off-by: Juergen Gross <jgr...@suse.com> --- V4: new patch (Roger Pau Monné) --- grub-core/kern/i386/xen/pvh.c | 70 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/grub-core/kern/i386/xen/pvh.c b/grub-core/kern/i386/xen/pvh.c index 58e6fefd5..442351d1d 100644 --- a/grub-core/kern/i386/xen/pvh.c +++ b/grub-core/kern/i386/xen/pvh.c @@ -20,6 +20,7 @@ #include <grub/misc.h> #include <grub/memory.h> #include <grub/mm.h> +#include <grub/pci.h> #include <grub/i386/cpuid.h> #include <grub/i386/io.h> #include <grub/xen.h> @@ -170,6 +171,73 @@ grub_xen_sort_mmap (void) } } +static grub_uint64_t +grub_xen_pci_read (grub_pci_address_t addr, grub_uint32_t is_64bit) +{ + grub_uint64_t val; + + val = grub_pci_read (addr); + if (is_64bit) + { + addr += sizeof (grub_uint32_t); + val |= ((grub_uint64_t) grub_pci_read (addr)) << 32; + } + + return val; +} + +static void +grub_xen_pci_write (grub_pci_address_t addr, grub_uint64_t val, + grub_uint32_t is_64bit) +{ + grub_pci_write (addr, (grub_uint32_t) val); + if (is_64bit) + { + addr += sizeof (grub_uint32_t); + grub_pci_write (addr, val >> 32); + } +} + +static int +grub_xen_pci_mmap (grub_pci_device_t dev, + grub_pci_id_t pciid __attribute__ ((unused)), + void *data __attribute__ ((unused))) +{ + int reg; + grub_pci_address_t addr; + grub_uint32_t val; + grub_uint64_t mmio_addr, mmio_size; + + if (nr_map_entries == ARRAY_SIZE (map)) + return 1; + + for (reg = GRUB_PCI_REG_ADDRESSES; reg < GRUB_PCI_REG_CIS_POINTER; + reg += sizeof (grub_uint32_t)) + { + addr = grub_pci_make_address (dev, reg); + val = grub_pci_read (addr); + if (val == 0 || + (val & GRUB_PCI_ADDR_SPACE_MASK) != GRUB_PCI_ADDR_SPACE_MEMORY) + continue; + + val &= GRUB_PCI_ADDR_MEM_TYPE_MASK; + mmio_addr = grub_xen_pci_read (addr, val); + grub_xen_pci_write (addr, ~0ULL, val); + mmio_size = ~(grub_xen_pci_read (addr, val) & ~0x0fULL) + 1; + grub_xen_pci_write (addr, mmio_addr, val); + + map[nr_map_entries].type = GRUB_MEMORY_RESERVED; + map[nr_map_entries].addr = mmio_addr; + map[nr_map_entries].len = mmio_size; + nr_map_entries++; + + if (val) + reg += sizeof (grub_uint32_t); + } + + return 0; +} + static void grub_xen_get_mmap (void) { @@ -182,6 +250,8 @@ grub_xen_get_mmap (void) grub_xen_panic ("Could not get memory map from Xen.\n"); nr_map_entries = memmap.nr_entries; + grub_pci_iterate (grub_xen_pci_mmap, NULL); + grub_xen_sort_mmap (); } -- 2.16.4 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel