aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/twe/twe_freebsd.c
diff options
context:
space:
mode:
authorScott Long <scottl@FreeBSD.org>2005-02-08 03:43:02 +0000
committerScott Long <scottl@FreeBSD.org>2005-02-08 03:43:02 +0000
commit8a87dc6fd94884daff56bfc794d0d8281a0affad (patch)
tree1fb306fb5eae3d7a82f002359b9883dd51213c5b /sys/dev/twe/twe_freebsd.c
parent699a8a09d6037c70021ad1a2c11f14d5e30a6b4e (diff)
downloadsrc-8a87dc6fd94884daff56bfc794d0d8281a0affad.tar.gz
src-8a87dc6fd94884daff56bfc794d0d8281a0affad.zip
Fix crashdumps on twe. The twe_immediate_request() path was not only
copying data to a temporary buffer before the I/O, but also copying that temporary buffer back to the original data location after the I/O. When you're dumping kernel heap and stack and protected pages, this is very very bad. A belated thanks to Robert Watson for donating hardware for this (and future) work. MFC after: 3 days
Notes
Notes: svn path=/head/; revision=141492
Diffstat (limited to 'sys/dev/twe/twe_freebsd.c')
-rw-r--r--sys/dev/twe/twe_freebsd.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/sys/dev/twe/twe_freebsd.c b/sys/dev/twe/twe_freebsd.c
index a29b3ddb76a3..fd0a99319b99 100644
--- a/sys/dev/twe/twe_freebsd.c
+++ b/sys/dev/twe/twe_freebsd.c
@@ -1069,9 +1069,8 @@ twe_map_request(struct twe_request *tr)
* Map the data buffer into bus space and build the s/g list.
*/
if (tr->tr_flags & TWE_CMD_IMMEDIATE) {
- bcopy(tr->tr_data, sc->twe_immediate, tr->tr_length);
error = bus_dmamap_load(sc->twe_immediate_dmat, sc->twe_immediate_map, sc->twe_immediate,
- tr->tr_length, twe_setup_data_dmamap, tr, 0);
+ tr->tr_length, twe_setup_data_dmamap, tr, BUS_DMA_NOWAIT);
} else {
error = bus_dmamap_load(sc->twe_buffer_dmat, tr->tr_dmamap, tr->tr_data, tr->tr_length,
twe_setup_data_dmamap, tr, 0);
@@ -1127,7 +1126,6 @@ twe_unmap_request(struct twe_request *tr)
}
if (tr->tr_flags & TWE_CMD_IMMEDIATE) {
- bcopy(sc->twe_immediate, tr->tr_data, tr->tr_length);
bus_dmamap_unload(sc->twe_immediate_dmat, sc->twe_immediate_map);
} else {
bus_dmamap_unload(sc->twe_buffer_dmat, tr->tr_dmamap);