[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL for-2.2 07/11] ahci: Reorder error cases in handle_cm
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL for-2.2 07/11] ahci: Reorder error cases in handle_cmd |
Date: |
Fri, 14 Nov 2014 11:05:53 +0000 |
From: John Snow <address@hidden>
Error checking in ahci's handle_cmd is re-ordered so that we
initialize as few things as possible before we've done our
sanity checking. This simplifies returning from this call
in case of an error.
A check to make sure the DMA memory map succeeds with the
correct size is also added, and the debug print of the
command fis is cleaned up with its size corrected.
Signed-off-by: John Snow <address@hidden>
Reviewed-by: Paolo Bonzini <address@hidden>
Message-id: address@hidden
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
hw/ide/ahci.c | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 43da363..578a93b 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -961,38 +961,37 @@ static int handle_cmd(AHCIState *s, int port, int slot)
return -1;
}
- cmd = &((AHCICmdHdr *)s->dev[port].lst)[slot];
-
if (!s->dev[port].lst) {
DPRINTF(port, "error: lst not given but cmd handled");
return -1;
}
-
+ cmd = &((AHCICmdHdr *)s->dev[port].lst)[slot];
/* remember current slot handle for later */
s->dev[port].cur_cmd = cmd;
+ /* The device we are working for */
+ ide_state = &s->dev[port].port.ifs[0];
+ if (!ide_state->blk) {
+ DPRINTF(port, "error: guest accessed unused port");
+ return -1;
+ }
+
opts = le32_to_cpu(cmd->opts);
tbl_addr = le64_to_cpu(cmd->tbl_addr);
-
cmd_len = 0x80;
cmd_fis = dma_memory_map(s->as, tbl_addr, &cmd_len,
DMA_DIRECTION_FROM_DEVICE);
-
if (!cmd_fis) {
DPRINTF(port, "error: guest passed us an invalid cmd fis\n");
return -1;
- }
-
- /* The device we are working for */
- ide_state = &s->dev[port].port.ifs[0];
-
- if (!ide_state->blk) {
- DPRINTF(port, "error: guest accessed unused port");
+ } else if (cmd_len != 0x80) {
+ ahci_trigger_irq(s, &s->dev[port], PORT_IRQ_HBUS_ERR);
+ DPRINTF(port, "error: dma_memory_map failed: "
+ "(len(%02"PRIx64") != 0x80)\n",
+ cmd_len);
goto out;
}
-
- debug_print_fis(cmd_fis, 0x90);
- //debug_print_fis(cmd_fis, (opts & AHCI_CMD_HDR_CMD_FIS_LEN) * 4);
+ debug_print_fis(cmd_fis, 0x80);
switch (cmd_fis[0]) {
case SATA_FIS_TYPE_REGISTER_H2D:
--
2.1.0
- [Qemu-devel] [PULL for-2.2 00/11] Block patches, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 01/11] ahci: Fix byte count regression for ATAPI/PIO, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 02/11] ide: repair PIO transfers for cases where nsector > 1, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 03/11] ahci: unify sglist preparation, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 04/11] ide: Correct handling of malformed/short PRDTs, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 05/11] ahci: add is_ncq predicate helper, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 06/11] ahci: Fix FIS decomposition, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 07/11] ahci: Reorder error cases in handle_cmd,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL for-2.2 08/11] ahci: Check cmd_fis[1] more explicitly, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 09/11] ahci: factor out FIS decomposition from handle_cmd, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 10/11] block: Fix max nb_sectors in bdrv_make_zero, Stefan Hajnoczi, 2014/11/14
- [Qemu-devel] [PULL for-2.2 11/11] vmdk: Leave bdi intact if -ENOTSUP in vmdk_get_info, Stefan Hajnoczi, 2014/11/14
- Re: [Qemu-devel] [PULL for-2.2 00/11] Block patches, Peter Maydell, 2014/11/14