|
@@ -27,6 +27,7 @@
|
|
#include "hw/ide/internal.h"
|
|
#include "hw/ide/internal.h"
|
|
#include "hw/scsi/scsi.h"
|
|
#include "hw/scsi/scsi.h"
|
|
#include "sysemu/block-backend.h"
|
|
#include "sysemu/block-backend.h"
|
|
|
|
+#include "trace.h"
|
|
|
|
|
|
#define ATAPI_SECTOR_BITS (2 + BDRV_SECTOR_BITS)
|
|
#define ATAPI_SECTOR_BITS (2 + BDRV_SECTOR_BITS)
|
|
#define ATAPI_SECTOR_SIZE (1 << ATAPI_SECTOR_BITS)
|
|
#define ATAPI_SECTOR_SIZE (1 << ATAPI_SECTOR_BITS)
|
|
@@ -116,9 +117,7 @@ cd_read_sector_sync(IDEState *s)
|
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
|
ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ);
|
|
ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ);
|
|
|
|
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("cd_read_sector_sync: lba=%d\n", s->lba);
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_cd_read_sector_sync(s->lba);
|
|
|
|
|
|
switch (s->cd_sector_size) {
|
|
switch (s->cd_sector_size) {
|
|
case 2048:
|
|
case 2048:
|
|
@@ -152,9 +151,7 @@ static void cd_read_sector_cb(void *opaque, int ret)
|
|
{
|
|
{
|
|
IDEState *s = opaque;
|
|
IDEState *s = opaque;
|
|
|
|
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("cd_read_sector_cb: lba=%d ret=%d\n", s->lba, ret);
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_cd_read_sector_cb(s->lba, ret);
|
|
|
|
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
block_acct_failed(blk_get_stats(s->blk), &s->acct);
|
|
block_acct_failed(blk_get_stats(s->blk), &s->acct);
|
|
@@ -188,9 +185,7 @@ static int cd_read_sector(IDEState *s)
|
|
s->iov.iov_len = ATAPI_SECTOR_SIZE;
|
|
s->iov.iov_len = ATAPI_SECTOR_SIZE;
|
|
qemu_iovec_init_external(&s->qiov, &s->iov, 1);
|
|
qemu_iovec_init_external(&s->qiov, &s->iov, 1);
|
|
|
|
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("cd_read_sector: lba=%d\n", s->lba);
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_cd_read_sector(s->lba);
|
|
|
|
|
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
|
block_acct_start(blk_get_stats(s->blk), &s->acct,
|
|
ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ);
|
|
ATAPI_SECTOR_SIZE, BLOCK_ACCT_READ);
|
|
@@ -213,9 +208,7 @@ void ide_atapi_cmd_ok(IDEState *s)
|
|
|
|
|
|
void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc)
|
|
void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc)
|
|
{
|
|
{
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("atapi_cmd_error: sense=0x%x asc=0x%x\n", sense_key, asc);
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_ide_atapi_cmd_error(s, sense_key, asc);
|
|
s->error = sense_key << 4;
|
|
s->error = sense_key << 4;
|
|
s->status = READY_STAT | ERR_STAT;
|
|
s->status = READY_STAT | ERR_STAT;
|
|
s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
|
|
s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
|
|
@@ -252,19 +245,14 @@ static uint16_t atapi_byte_count_limit(IDEState *s)
|
|
void ide_atapi_cmd_reply_end(IDEState *s)
|
|
void ide_atapi_cmd_reply_end(IDEState *s)
|
|
{
|
|
{
|
|
int byte_count_limit, size, ret;
|
|
int byte_count_limit, size, ret;
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("reply: tx_size=%d elem_tx_size=%d index=%d\n",
|
|
|
|
- s->packet_transfer_size,
|
|
|
|
- s->elementary_transfer_size,
|
|
|
|
- s->io_buffer_index);
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_ide_atapi_cmd_reply_end(s, s->packet_transfer_size,
|
|
|
|
+ s->elementary_transfer_size,
|
|
|
|
+ s->io_buffer_index);
|
|
if (s->packet_transfer_size <= 0) {
|
|
if (s->packet_transfer_size <= 0) {
|
|
/* end of transfer */
|
|
/* end of transfer */
|
|
ide_atapi_cmd_ok(s);
|
|
ide_atapi_cmd_ok(s);
|
|
ide_set_irq(s->bus);
|
|
ide_set_irq(s->bus);
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("end of transfer, status=0x%x\n", s->status);
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_ide_atapi_cmd_reply_end_eot(s, s->status);
|
|
} else {
|
|
} else {
|
|
/* see if a new sector must be read */
|
|
/* see if a new sector must be read */
|
|
if (s->lba != -1 && s->io_buffer_index >= s->cd_sector_size) {
|
|
if (s->lba != -1 && s->io_buffer_index >= s->cd_sector_size) {
|
|
@@ -300,9 +288,7 @@ void ide_atapi_cmd_reply_end(IDEState *s)
|
|
/* a new transfer is needed */
|
|
/* a new transfer is needed */
|
|
s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO;
|
|
s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO;
|
|
byte_count_limit = atapi_byte_count_limit(s);
|
|
byte_count_limit = atapi_byte_count_limit(s);
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("byte_count_limit=%d\n", byte_count_limit);
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_ide_atapi_cmd_reply_end_bcl(s, byte_count_limit);
|
|
size = s->packet_transfer_size;
|
|
size = s->packet_transfer_size;
|
|
if (size > byte_count_limit) {
|
|
if (size > byte_count_limit) {
|
|
/* byte count limit must be even if this case */
|
|
/* byte count limit must be even if this case */
|
|
@@ -324,9 +310,7 @@ void ide_atapi_cmd_reply_end(IDEState *s)
|
|
ide_transfer_start(s, s->io_buffer + s->io_buffer_index - size,
|
|
ide_transfer_start(s, s->io_buffer + s->io_buffer_index - size,
|
|
size, ide_atapi_cmd_reply_end);
|
|
size, ide_atapi_cmd_reply_end);
|
|
ide_set_irq(s->bus);
|
|
ide_set_irq(s->bus);
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("status=0x%x\n", s->status);
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_ide_atapi_cmd_reply_end_new(s, s->status);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -368,9 +352,7 @@ static void ide_atapi_cmd_read_pio(IDEState *s, int lba, int nb_sectors,
|
|
|
|
|
|
static void ide_atapi_cmd_check_status(IDEState *s)
|
|
static void ide_atapi_cmd_check_status(IDEState *s)
|
|
{
|
|
{
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("atapi_cmd_check_status\n");
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_ide_atapi_cmd_check_status(s);
|
|
s->error = MC_ERR | (UNIT_ATTENTION << 4);
|
|
s->error = MC_ERR | (UNIT_ATTENTION << 4);
|
|
s->status = ERR_STAT;
|
|
s->status = ERR_STAT;
|
|
s->nsector = 0;
|
|
s->nsector = 0;
|
|
@@ -477,10 +459,8 @@ static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors,
|
|
static void ide_atapi_cmd_read(IDEState *s, int lba, int nb_sectors,
|
|
static void ide_atapi_cmd_read(IDEState *s, int lba, int nb_sectors,
|
|
int sector_size)
|
|
int sector_size)
|
|
{
|
|
{
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- printf("read %s: LBA=%d nb_sectors=%d\n", s->atapi_dma ? "dma" : "pio",
|
|
|
|
- lba, nb_sectors);
|
|
|
|
-#endif
|
|
|
|
|
|
+ trace_ide_atapi_cmd_read(s, s->atapi_dma ? "dma" : "pio",
|
|
|
|
+ lba, nb_sectors);
|
|
if (s->atapi_dma) {
|
|
if (s->atapi_dma) {
|
|
ide_atapi_cmd_read_dma(s, lba, nb_sectors, sector_size);
|
|
ide_atapi_cmd_read_dma(s, lba, nb_sectors, sector_size);
|
|
} else {
|
|
} else {
|
|
@@ -1330,16 +1310,18 @@ void ide_atapi_cmd(IDEState *s)
|
|
uint8_t *buf = s->io_buffer;
|
|
uint8_t *buf = s->io_buffer;
|
|
const struct AtapiCmd *cmd = &atapi_cmd_table[s->io_buffer[0]];
|
|
const struct AtapiCmd *cmd = &atapi_cmd_table[s->io_buffer[0]];
|
|
|
|
|
|
-#ifdef DEBUG_IDE_ATAPI
|
|
|
|
- {
|
|
|
|
|
|
+ trace_ide_atapi_cmd(s, s->io_buffer[0]);
|
|
|
|
+
|
|
|
|
+ if (trace_event_get_state_backends(TRACE_IDE_ATAPI_CMD_PACKET)) {
|
|
|
|
+ /* Each pretty-printed byte needs two bytes and a space; */
|
|
|
|
+ char *ppacket = g_malloc(ATAPI_PACKET_SIZE * 3 + 1);
|
|
int i;
|
|
int i;
|
|
- printf("ATAPI limit=0x%x packet:", s->lcyl | (s->hcyl << 8));
|
|
|
|
- for(i = 0; i < ATAPI_PACKET_SIZE; i++) {
|
|
|
|
- printf(" %02x", buf[i]);
|
|
|
|
|
|
+ for (i = 0; i < ATAPI_PACKET_SIZE; i++) {
|
|
|
|
+ sprintf(ppacket + (i * 3), "%02x ", buf[i]);
|
|
}
|
|
}
|
|
- printf("\n");
|
|
|
|
|
|
+ trace_ide_atapi_cmd_packet(s, s->lcyl | (s->hcyl << 8), ppacket);
|
|
|
|
+ g_free(ppacket);
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
* If there's a UNIT_ATTENTION condition pending, only command flagged with
|
|
* If there's a UNIT_ATTENTION condition pending, only command flagged with
|