Commit d14049eaec8d9c4349ae21eb276b70de995fdf68
1 parent
ce62e5ba
Partial IDE DVD emulation, by Filip Navara.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3161 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
74 additions
and
2 deletions
hw/ide.c
... | ... | @@ -261,6 +261,7 @@ |
261 | 261 | * older drives only. |
262 | 262 | */ |
263 | 263 | #define GPCMD_GET_MEDIA_STATUS 0xda |
264 | +#define GPCMD_MODE_SENSE_6 0x1a | |
264 | 265 | |
265 | 266 | /* Mode page codes for mode sense/set */ |
266 | 267 | #define GPMODE_R_W_ERROR_PAGE 0x01 |
... | ... | @@ -1329,10 +1330,14 @@ static void ide_atapi_cmd(IDEState *s) |
1329 | 1330 | ASC_MEDIUM_NOT_PRESENT); |
1330 | 1331 | } |
1331 | 1332 | break; |
1333 | + case GPCMD_MODE_SENSE_6: | |
1332 | 1334 | case GPCMD_MODE_SENSE_10: |
1333 | 1335 | { |
1334 | 1336 | int action, code; |
1335 | - max_len = ube16_to_cpu(packet + 7); | |
1337 | + if (packet[0] == GPCMD_MODE_SENSE_10) | |
1338 | + max_len = ube16_to_cpu(packet + 7); | |
1339 | + else | |
1340 | + max_len = packet[4]; | |
1336 | 1341 | action = packet[2] >> 6; |
1337 | 1342 | code = packet[2] & 0x3f; |
1338 | 1343 | switch(action) { |
... | ... | @@ -1368,7 +1373,7 @@ static void ide_atapi_cmd(IDEState *s) |
1368 | 1373 | |
1369 | 1374 | buf[8] = 0x2a; |
1370 | 1375 | buf[9] = 0x12; |
1371 | - buf[10] = 0x00; | |
1376 | + buf[10] = 0x08; | |
1372 | 1377 | buf[11] = 0x00; |
1373 | 1378 | |
1374 | 1379 | buf[12] = 0x70; |
... | ... | @@ -1582,6 +1587,50 @@ static void ide_atapi_cmd(IDEState *s) |
1582 | 1587 | ide_atapi_cmd_reply(s, 8, 8); |
1583 | 1588 | } |
1584 | 1589 | break; |
1590 | + case GPCMD_READ_DVD_STRUCTURE: | |
1591 | + { | |
1592 | + int media = packet[1]; | |
1593 | + int layer = packet[6]; | |
1594 | + int format = packet[2]; | |
1595 | + int64_t total_sectors; | |
1596 | + | |
1597 | + if (media != 0 || layer != 0) | |
1598 | + { | |
1599 | + ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, | |
1600 | + ASC_INV_FIELD_IN_CMD_PACKET); | |
1601 | + } | |
1602 | + | |
1603 | + switch (format) { | |
1604 | + case 0: | |
1605 | + bdrv_get_geometry(s->bs, &total_sectors); | |
1606 | + total_sectors >>= 2; | |
1607 | + | |
1608 | + memset(buf, 0, 2052); | |
1609 | + | |
1610 | + buf[4] = 1; // DVD-ROM, part version 1 | |
1611 | + buf[5] = 0xf; // 120mm disc, maximum rate unspecified | |
1612 | + buf[6] = 0; // one layer, embossed data | |
1613 | + buf[7] = 0; | |
1614 | + | |
1615 | + cpu_to_ube32(buf + 8, 0); | |
1616 | + cpu_to_ube32(buf + 12, total_sectors - 1); | |
1617 | + cpu_to_ube32(buf + 16, total_sectors - 1); | |
1618 | + | |
1619 | + cpu_to_be16wu((uint16_t *)buf, 2048 + 4); | |
1620 | + | |
1621 | + ide_atapi_cmd_reply(s, 2048 + 3, 2048 + 4); | |
1622 | + break; | |
1623 | + | |
1624 | + default: | |
1625 | + ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, | |
1626 | + ASC_INV_FIELD_IN_CMD_PACKET); | |
1627 | + break; | |
1628 | + } | |
1629 | + } | |
1630 | + break; | |
1631 | + case GPCMD_SET_SPEED: | |
1632 | + ide_atapi_cmd_ok(s); | |
1633 | + break; | |
1585 | 1634 | case GPCMD_INQUIRY: |
1586 | 1635 | max_len = packet[4]; |
1587 | 1636 | buf[0] = 0x05; /* CD-ROM */ |
... | ... | @@ -1597,6 +1646,29 @@ static void ide_atapi_cmd(IDEState *s) |
1597 | 1646 | padstr8(buf + 32, 4, QEMU_VERSION); |
1598 | 1647 | ide_atapi_cmd_reply(s, 36, max_len); |
1599 | 1648 | break; |
1649 | + case GPCMD_GET_CONFIGURATION: | |
1650 | + { | |
1651 | + int64_t total_sectors; | |
1652 | + | |
1653 | + /* only feature 0 is supported */ | |
1654 | + if (packet[2] != 0 || packet[3] != 0) { | |
1655 | + ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, | |
1656 | + ASC_INV_FIELD_IN_CMD_PACKET); | |
1657 | + break; | |
1658 | + } | |
1659 | + memset(buf, 0, 32); | |
1660 | + bdrv_get_geometry(s->bs, &total_sectors); | |
1661 | + buf[3] = 16; | |
1662 | + buf[7] = total_sectors <= 1433600 ? 0x08 : 0x10; /* current profile */ | |
1663 | + buf[10] = 0x10 | 0x1; | |
1664 | + buf[11] = 0x08; /* size of profile list */ | |
1665 | + buf[13] = 0x10; /* DVD-ROM profile */ | |
1666 | + buf[14] = buf[7] == 0x10; /* (in)active */ | |
1667 | + buf[17] = 0x08; /* CD-ROM profile */ | |
1668 | + buf[18] = buf[7] == 0x08; /* (in)active */ | |
1669 | + ide_atapi_cmd_reply(s, 32, 32); | |
1670 | + break; | |
1671 | + } | |
1600 | 1672 | default: |
1601 | 1673 | ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, |
1602 | 1674 | ASC_ILLEGAL_OPCODE); | ... | ... |