From patchwork Tue Feb 9 16:37:07 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [07/10] PPC: Get rid of segfaults in DBDMA emulation Date: Tue, 09 Feb 2010 06:37:07 -0000 From: Alexander Graf X-Patchwork-Id: 44916 Message-Id: <1265733430-9656-8-git-send-email-agraf@suse.de> To: qemu-devel@nongnu.org Cc: blauwirbel@gmail.com, aurelien@aurel32.net, mst@redhat.com While trying to find the right channel number for the DBDMA emulation I stumbled across segmentation faults that were purely triggered by the guest. The guest should never have the possiblity to segfault us, so let's check all indirect function calls on a channel, so the code even works for channels that have not been reserved. Signed-off-by: Alexander Graf --- hw/mac_dbdma.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/hw/mac_dbdma.c b/hw/mac_dbdma.c index 8ec3d99..8f94c35 100644 --- a/hw/mac_dbdma.c +++ b/hw/mac_dbdma.c @@ -402,7 +402,9 @@ static void start_output(DBDMA_channel *ch, int key, uint32_t addr, ch->io.dma_end = dbdma_end; ch->io.is_dma_out = 1; ch->processing = 1; - ch->rw(&ch->io); + if (ch->rw) { + ch->rw(&ch->io); + } } static void start_input(DBDMA_channel *ch, int key, uint32_t addr, @@ -425,7 +427,9 @@ static void start_input(DBDMA_channel *ch, int key, uint32_t addr, ch->io.dma_end = dbdma_end; ch->io.is_dma_out = 0; ch->processing = 1; - ch->rw(&ch->io); + if (ch->rw) { + ch->rw(&ch->io); + } } static void load_word(DBDMA_channel *ch, int key, uint32_t addr, @@ -688,7 +692,7 @@ dbdma_control_write(DBDMA_channel *ch) if (status & ACTIVE) qemu_bh_schedule(dbdma_bh); - if (status & FLUSH) + if ((status & FLUSH) && ch->flush) ch->flush(&ch->io); }