grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v4 12/19] xen: add PCI MMIO areas to memory map


From: Juergen Gross
Subject: [PATCH v4 12/19] xen: add PCI MMIO areas to memory map
Date: Fri, 2 Nov 2018 13:37:31 +0100

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 <address@hidden>
---
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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]