mirror of https://gitee.com/openkylin/qemu.git
scsi: add scsi_req_print()
Handy for debugging. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
ed3a34a3c8
commit
ec76686563
114
hw/scsi-bus.c
114
hw/scsi-bus.c
|
@ -364,6 +364,120 @@ int scsi_req_parse(SCSIRequest *req, uint8_t *buf)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *scsi_command_name(uint8_t cmd)
|
||||||
|
{
|
||||||
|
static const char *names[] = {
|
||||||
|
[ TEST_UNIT_READY ] = "TEST_UNIT_READY",
|
||||||
|
[ REZERO_UNIT ] = "REZERO_UNIT",
|
||||||
|
[ REQUEST_SENSE ] = "REQUEST_SENSE",
|
||||||
|
[ FORMAT_UNIT ] = "FORMAT_UNIT",
|
||||||
|
[ READ_BLOCK_LIMITS ] = "READ_BLOCK_LIMITS",
|
||||||
|
[ REASSIGN_BLOCKS ] = "REASSIGN_BLOCKS",
|
||||||
|
[ READ_6 ] = "READ_6",
|
||||||
|
[ WRITE_6 ] = "WRITE_6",
|
||||||
|
[ SEEK_6 ] = "SEEK_6",
|
||||||
|
[ READ_REVERSE ] = "READ_REVERSE",
|
||||||
|
[ WRITE_FILEMARKS ] = "WRITE_FILEMARKS",
|
||||||
|
[ SPACE ] = "SPACE",
|
||||||
|
[ INQUIRY ] = "INQUIRY",
|
||||||
|
[ RECOVER_BUFFERED_DATA ] = "RECOVER_BUFFERED_DATA",
|
||||||
|
[ MODE_SELECT ] = "MODE_SELECT",
|
||||||
|
[ RESERVE ] = "RESERVE",
|
||||||
|
[ RELEASE ] = "RELEASE",
|
||||||
|
[ COPY ] = "COPY",
|
||||||
|
[ ERASE ] = "ERASE",
|
||||||
|
[ MODE_SENSE ] = "MODE_SENSE",
|
||||||
|
[ START_STOP ] = "START_STOP",
|
||||||
|
[ RECEIVE_DIAGNOSTIC ] = "RECEIVE_DIAGNOSTIC",
|
||||||
|
[ SEND_DIAGNOSTIC ] = "SEND_DIAGNOSTIC",
|
||||||
|
[ ALLOW_MEDIUM_REMOVAL ] = "ALLOW_MEDIUM_REMOVAL",
|
||||||
|
|
||||||
|
[ SET_WINDOW ] = "SET_WINDOW",
|
||||||
|
[ READ_CAPACITY ] = "READ_CAPACITY",
|
||||||
|
[ READ_10 ] = "READ_10",
|
||||||
|
[ WRITE_10 ] = "WRITE_10",
|
||||||
|
[ SEEK_10 ] = "SEEK_10",
|
||||||
|
[ WRITE_VERIFY ] = "WRITE_VERIFY",
|
||||||
|
[ VERIFY ] = "VERIFY",
|
||||||
|
[ SEARCH_HIGH ] = "SEARCH_HIGH",
|
||||||
|
[ SEARCH_EQUAL ] = "SEARCH_EQUAL",
|
||||||
|
[ SEARCH_LOW ] = "SEARCH_LOW",
|
||||||
|
[ SET_LIMITS ] = "SET_LIMITS",
|
||||||
|
[ PRE_FETCH ] = "PRE_FETCH",
|
||||||
|
[ READ_POSITION ] = "READ_POSITION",
|
||||||
|
[ SYNCHRONIZE_CACHE ] = "SYNCHRONIZE_CACHE",
|
||||||
|
[ LOCK_UNLOCK_CACHE ] = "LOCK_UNLOCK_CACHE",
|
||||||
|
[ READ_DEFECT_DATA ] = "READ_DEFECT_DATA",
|
||||||
|
[ MEDIUM_SCAN ] = "MEDIUM_SCAN",
|
||||||
|
[ COMPARE ] = "COMPARE",
|
||||||
|
[ COPY_VERIFY ] = "COPY_VERIFY",
|
||||||
|
[ WRITE_BUFFER ] = "WRITE_BUFFER",
|
||||||
|
[ READ_BUFFER ] = "READ_BUFFER",
|
||||||
|
[ UPDATE_BLOCK ] = "UPDATE_BLOCK",
|
||||||
|
[ READ_LONG ] = "READ_LONG",
|
||||||
|
[ WRITE_LONG ] = "WRITE_LONG",
|
||||||
|
[ CHANGE_DEFINITION ] = "CHANGE_DEFINITION",
|
||||||
|
[ WRITE_SAME ] = "WRITE_SAME",
|
||||||
|
[ READ_TOC ] = "READ_TOC",
|
||||||
|
[ LOG_SELECT ] = "LOG_SELECT",
|
||||||
|
[ LOG_SENSE ] = "LOG_SENSE",
|
||||||
|
[ MODE_SELECT_10 ] = "MODE_SELECT_10",
|
||||||
|
[ RESERVE_10 ] = "RESERVE_10",
|
||||||
|
[ RELEASE_10 ] = "RELEASE_10",
|
||||||
|
[ MODE_SENSE_10 ] = "MODE_SENSE_10",
|
||||||
|
[ PERSISTENT_RESERVE_IN ] = "PERSISTENT_RESERVE_IN",
|
||||||
|
[ PERSISTENT_RESERVE_OUT ] = "PERSISTENT_RESERVE_OUT",
|
||||||
|
[ MOVE_MEDIUM ] = "MOVE_MEDIUM",
|
||||||
|
[ READ_12 ] = "READ_12",
|
||||||
|
[ WRITE_12 ] = "WRITE_12",
|
||||||
|
[ WRITE_VERIFY_12 ] = "WRITE_VERIFY_12",
|
||||||
|
[ SEARCH_HIGH_12 ] = "SEARCH_HIGH_12",
|
||||||
|
[ SEARCH_EQUAL_12 ] = "SEARCH_EQUAL_12",
|
||||||
|
[ SEARCH_LOW_12 ] = "SEARCH_LOW_12",
|
||||||
|
[ READ_ELEMENT_STATUS ] = "READ_ELEMENT_STATUS",
|
||||||
|
[ SEND_VOLUME_TAG ] = "SEND_VOLUME_TAG",
|
||||||
|
[ WRITE_LONG_2 ] = "WRITE_LONG_2",
|
||||||
|
|
||||||
|
[ REWIND ] = "REWIND",
|
||||||
|
[ REPORT_DENSITY_SUPPORT ] = "REPORT_DENSITY_SUPPORT",
|
||||||
|
[ LOAD_UNLOAD ] = "LOAD_UNLOAD",
|
||||||
|
[ SET_CD_SPEED ] = "SET_CD_SPEED",
|
||||||
|
[ BLANK ] = "BLANK",
|
||||||
|
};
|
||||||
|
|
||||||
|
if (cmd >= ARRAY_SIZE(names) || names[cmd] == NULL)
|
||||||
|
return "*UNKNOWN*";
|
||||||
|
return names[cmd];
|
||||||
|
}
|
||||||
|
|
||||||
|
void scsi_req_print(SCSIRequest *req)
|
||||||
|
{
|
||||||
|
FILE *fp = stderr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
fprintf(fp, "[%s id=%d] %s",
|
||||||
|
req->dev->qdev.parent_bus->name,
|
||||||
|
req->dev->id,
|
||||||
|
scsi_command_name(req->cmd.buf[0]));
|
||||||
|
for (i = 1; i < req->cmd.len; i++) {
|
||||||
|
fprintf(fp, " 0x%02x", req->cmd.buf[i]);
|
||||||
|
}
|
||||||
|
switch (req->cmd.mode) {
|
||||||
|
case SCSI_XFER_NONE:
|
||||||
|
fprintf(fp, " - none\n");
|
||||||
|
break;
|
||||||
|
case SCSI_XFER_FROM_DEV:
|
||||||
|
fprintf(fp, " - from-dev len=%zd\n", req->cmd.xfer);
|
||||||
|
break;
|
||||||
|
case SCSI_XFER_TO_DEV:
|
||||||
|
fprintf(fp, " - to-dev len=%zd\n", req->cmd.xfer);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(fp, " - Oops\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void scsi_req_complete(SCSIRequest *req)
|
void scsi_req_complete(SCSIRequest *req)
|
||||||
{
|
{
|
||||||
assert(req->status != -1);
|
assert(req->status != -1);
|
||||||
|
|
|
@ -107,6 +107,7 @@ SCSIRequest *scsi_req_find(SCSIDevice *d, uint32_t tag);
|
||||||
void scsi_req_free(SCSIRequest *req);
|
void scsi_req_free(SCSIRequest *req);
|
||||||
|
|
||||||
int scsi_req_parse(SCSIRequest *req, uint8_t *buf);
|
int scsi_req_parse(SCSIRequest *req, uint8_t *buf);
|
||||||
|
void scsi_req_print(SCSIRequest *req);
|
||||||
void scsi_req_complete(SCSIRequest *req);
|
void scsi_req_complete(SCSIRequest *req);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue