[haiku-commits] haiku: hrev52715 - src/libs/compat/freebsd_network

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 5 Jan 2019 14:47:28 -0500 (EST)

hrev52715 adds 1 changeset to branch 'master'
old head: a29a8f98ed238d66c21b63028e91e6a7f6ef04cf
new head: b98f12a6017e258f010bed4d3ed5eea6ae09afac
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=b98f12a6017e+%5Ea29a8f98ed23

----------------------------------------------------------------------------

b98f12a6017e: freebsd_network: use proper BAR size in bus_alloc_mem_resource
  
  This time we use the pci_info directly, it avoids a possible race with
  PCI config regs, and we already have the value there anyway.
  
  Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>
  One crucial fix by me: check if size == 0. This avoids the deadlock
  seen in #14795.

                                          [ François Revol <revol@xxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev52715
Commit:      b98f12a6017e258f010bed4d3ed5eea6ae09afac
URL:         https://git.haiku-os.org/haiku/commit/?id=b98f12a6017e
Author:      François Revol <revol@xxxxxxx>
Date:        Sat Jan  5 19:45:54 2019 UTC
Committer:   Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Sat Jan  5 19:45:54 2019 UTC

Ticket:      https://dev.haiku-os.org/ticket/14795

----------------------------------------------------------------------------

1 file changed, 25 insertions(+), 8 deletions(-)
src/libs/compat/freebsd_network/bus.cpp | 33 ++++++++++++++++++++++-------

----------------------------------------------------------------------------

diff --git a/src/libs/compat/freebsd_network/bus.cpp 
b/src/libs/compat/freebsd_network/bus.cpp
index 91d9e2f456..0c96448391 100644
--- a/src/libs/compat/freebsd_network/bus.cpp
+++ b/src/libs/compat/freebsd_network/bus.cpp
@@ -112,14 +112,31 @@ bus_alloc_irq_resource(device_t dev, struct resource *res)
 static int
 bus_alloc_mem_resource(device_t dev, struct resource *res, int regid)
 {
-       /* TODO: check the offset really is of a BAR */
-       uint32 bar = pci_read_config(dev, regid, 4);
-       uint32 addr = bar & PCI_address_memory_32_mask;
-       pci_write_config(dev, regid, ~0, 4);
-       uint32 size = pci_read_config(dev, regid, 4) & 
PCI_address_memory_32_mask;
-       //size = (~size) + 1;
-       size = 1024 * 128; /* XXX */
-       pci_write_config(dev, regid, bar, 4);
+       pci_info *info = &((struct root_device_softc 
*)dev->root->softc)->pci_info;
+
+       // check the offset really is of a BAR
+       if (regid < PCI_base_registers || (regid % sizeof(uint32) != 0)
+               || (regid >= PCI_base_registers + 6 * (int)sizeof(uint32)))
+               return -1;
+
+       // turn offset into array index
+       regid -= PCI_base_registers;
+       regid /= sizeof(uint32);
+
+       uint32 addr = info->u.h0.base_registers[regid];
+       uint32 size = info->u.h0.base_register_sizes[regid];
+       uchar flags = info->u.h0.base_register_flags[regid];
+
+       // reject empty regions
+       if (size == 0)
+               return -1;
+
+       // reject I/O space
+       if (flags & PCI_address_space)
+               return -1;
+
+       // TODO: check flags & PCI_address_prefetchable ?
+
        void *virtualAddr;
 
        res->r_mapped_area = map_mem(&virtualAddr, addr, size, 0,


Other related posts:

  • » [haiku-commits] haiku: hrev52715 - src/libs/compat/freebsd_network - waddlesplash