hrev56191 adds 2 changesets to branch 'master'
old head: e206b2f350bee2c103529de8eb388c51ac88b15a
new head: d621ee6564d749847029b0f0e1b8a7e46f6d7831
overview:
https://git.haiku-os.org/haiku/log/?qt=range&q=d621ee6564d7+%5Ee206b2f350be
----------------------------------------------------------------------------
c6c03b01c33c: freebsd_network: Validate ranges but not alignment when
coalescing in bus_dma.
d621ee6564d7: freebsd_network: Move up Giant ownership during attach.
device_attach can be recursed for MIIbus drivers, so avoid the complexity
and lock Giant from init_drivers() instead.
[ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]
----------------------------------------------------------------------------
3 files changed, 10 insertions(+), 7 deletions(-)
src/libs/compat/freebsd_network/bus_dma.cpp | 8 +++++---
src/libs/compat/freebsd_network/device.c | 4 ----
src/libs/compat/freebsd_network/driver.c | 5 +++++
############################################################################
Commit: c6c03b01c33c524daf8b85cb3a578f155c4d445a
URL: https://git.haiku-os.org/haiku/commit/?id=c6c03b01c33c
Author: Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date: Tue Jun 14 04:30:14 2022 UTC
freebsd_network: Validate ranges but not alignment when coalescing in bus_dma.
----------------------------------------------------------------------------
diff --git a/src/libs/compat/freebsd_network/bus_dma.cpp
b/src/libs/compat/freebsd_network/bus_dma.cpp
index d11faddcf2..a65fbcd793 100644
--- a/src/libs/compat/freebsd_network/bus_dma.cpp
+++ b/src/libs/compat/freebsd_network/bus_dma.cpp
@@ -310,7 +310,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void* vaddr,
bus_dmamap_t map)
static bool
-_validate_address(bus_dma_tag_t dmat, bus_addr_t paddr)
+_validate_address(bus_dma_tag_t dmat, bus_addr_t paddr, bool
validate_alignment = true)
{
do {
if (dmat->filter != NULL) {
@@ -319,7 +319,7 @@ _validate_address(bus_dma_tag_t dmat, bus_addr_t paddr)
} else {
if (paddr > dmat->lowaddr && paddr <= dmat->highaddr)
return false;
- if (!vm_addr_align_ok(paddr, dmat->alignment))
+ if (validate_alignment && !vm_addr_align_ok(paddr,
dmat->alignment))
return false;
}
@@ -360,7 +360,9 @@ _bus_load_buffer(bus_dma_tag_t dmat, void* buf, bus_size_t
buflen,
&& (dmat->boundary == 0
|| (segs[seg].ds_addr & boundary_mask)
== (phys_addr &
boundary_mask))) {
- // No need to validate the address here.
+ if (!_validate_address(dmat, phys_addr, false))
+ return ERANGE;
+
segs[seg].ds_len += segment_size;
} else {
if (first)
############################################################################
Revision: hrev56191
Commit: d621ee6564d749847029b0f0e1b8a7e46f6d7831
URL: https://git.haiku-os.org/haiku/commit/?id=d621ee6564d7
Author: Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date: Tue Jun 14 04:34:46 2022 UTC
freebsd_network: Move up Giant ownership during attach.
device_attach can be recursed for MIIbus drivers, so avoid the complexity
and lock Giant from init_drivers() instead.
----------------------------------------------------------------------------
diff --git a/src/libs/compat/freebsd_network/device.c
b/src/libs/compat/freebsd_network/device.c
index 05adbf5505..7504d35cc0 100644
--- a/src/libs/compat/freebsd_network/device.c
+++ b/src/libs/compat/freebsd_network/device.c
@@ -481,9 +481,6 @@ device_attach(device_t device)
|| device->methods.attach == NULL)
return B_ERROR;
- // Always hold the giant lock during attach.
- mtx_lock(&Giant);
-
result = device->methods.attach(device);
if (result == 0)
@@ -492,7 +489,6 @@ device_attach(device_t device)
if (result == 0 && HAIKU_DRIVER_REQUIRES(FBSD_WLAN_FEATURE))
result = start_wlan(device);
- mtx_unlock(&Giant);
return result;
}
diff --git a/src/libs/compat/freebsd_network/driver.c
b/src/libs/compat/freebsd_network/driver.c
index 4eada982ff..762e392e9a 100644
--- a/src/libs/compat/freebsd_network/driver.c
+++ b/src/libs/compat/freebsd_network/driver.c
@@ -310,6 +310,9 @@ _fbsd_init_drivers()
if (status < B_OK)
goto err6;
+ // Always hold the giant lock during attach.
+ mtx_lock(&Giant);
+
for (int p = 0; sProbedDevices[p].bus != BUS_INVALID; p++) {
device_t root, device = NULL;
status = init_root_device(&root, sProbedDevices[p].bus);
@@ -341,6 +344,8 @@ _fbsd_init_drivers()
device_delete_child(NULL, root);
}
+ mtx_unlock(&Giant);
+
if (gDeviceCount > 0)
return B_OK;