Annotation of qemu/hw/ide/core.c, revision 1.1.1.4

1.1       root        1: /*
                      2:  * QEMU IDE disk and CD/DVD-ROM Emulator
                      3:  *
                      4:  * Copyright (c) 2003 Fabrice Bellard
                      5:  * Copyright (c) 2006 Openedhand Ltd.
                      6:  *
                      7:  * Permission is hereby granted, free of charge, to any person obtaining a copy
                      8:  * of this software and associated documentation files (the "Software"), to deal
                      9:  * in the Software without restriction, including without limitation the rights
                     10:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
                     11:  * copies of the Software, and to permit persons to whom the Software is
                     12:  * furnished to do so, subject to the following conditions:
                     13:  *
                     14:  * The above copyright notice and this permission notice shall be included in
                     15:  * all copies or substantial portions of the Software.
                     16:  *
                     17:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
                     18:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
                     19:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
                     20:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
                     21:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
                     22:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
                     23:  * THE SOFTWARE.
                     24:  */
                     25: #include <hw/hw.h>
                     26: #include <hw/pc.h>
                     27: #include <hw/pci.h>
                     28: #include <hw/scsi.h>
1.1.1.4 ! root       29: #include "qemu-error.h"
1.1       root       30: #include "qemu-timer.h"
                     31: #include "sysemu.h"
                     32: #include "dma.h"
                     33: 
                     34: #include <hw/ide/internal.h>
                     35: 
1.1.1.4 ! root       36: #define IDE_PAGE_SIZE 4096
        !            37: 
        !            38: static const int smart_attributes[][5] = {
1.1       root       39:     /* id,  flags, val, wrst, thrsh */
                     40:     { 0x01, 0x03, 0x64, 0x64, 0x06}, /* raw read */
                     41:     { 0x03, 0x03, 0x64, 0x64, 0x46}, /* spin up */
                     42:     { 0x04, 0x02, 0x64, 0x64, 0x14}, /* start stop count */
                     43:     { 0x05, 0x03, 0x64, 0x64, 0x36}, /* remapped sectors */
                     44:     { 0x00, 0x00, 0x00, 0x00, 0x00}
                     45: };
                     46: 
                     47: /* XXX: DVDs that could fit on a CD will be reported as a CD */
                     48: static inline int media_present(IDEState *s)
                     49: {
                     50:     return (s->nb_sectors > 0);
                     51: }
                     52: 
                     53: static inline int media_is_dvd(IDEState *s)
                     54: {
                     55:     return (media_present(s) && s->nb_sectors > CD_MAX_SECTORS);
                     56: }
                     57: 
                     58: static inline int media_is_cd(IDEState *s)
                     59: {
                     60:     return (media_present(s) && s->nb_sectors <= CD_MAX_SECTORS);
                     61: }
                     62: 
                     63: static void ide_dma_start(IDEState *s, BlockDriverCompletionFunc *dma_cb);
                     64: static void ide_dma_restart(IDEState *s, int is_read);
                     65: static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret);
                     66: static int ide_handle_rw_error(IDEState *s, int error, int op);
                     67: 
                     68: static void padstr(char *str, const char *src, int len)
                     69: {
                     70:     int i, v;
                     71:     for(i = 0; i < len; i++) {
                     72:         if (*src)
                     73:             v = *src++;
                     74:         else
                     75:             v = ' ';
                     76:         str[i^1] = v;
                     77:     }
                     78: }
                     79: 
                     80: static void padstr8(uint8_t *buf, int buf_size, const char *src)
                     81: {
                     82:     int i;
                     83:     for(i = 0; i < buf_size; i++) {
                     84:         if (*src)
                     85:             buf[i] = *src++;
                     86:         else
                     87:             buf[i] = ' ';
                     88:     }
                     89: }
                     90: 
                     91: static void put_le16(uint16_t *p, unsigned int v)
                     92: {
                     93:     *p = cpu_to_le16(v);
                     94: }
                     95: 
                     96: static void ide_identify(IDEState *s)
                     97: {
                     98:     uint16_t *p;
                     99:     unsigned int oldsize;
1.1.1.4 ! root      100:     IDEDevice *dev;
1.1       root      101: 
                    102:     if (s->identify_set) {
                    103:        memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
                    104:        return;
                    105:     }
                    106: 
                    107:     memset(s->io_buffer, 0, 512);
                    108:     p = (uint16_t *)s->io_buffer;
                    109:     put_le16(p + 0, 0x0040);
                    110:     put_le16(p + 1, s->cylinders);
                    111:     put_le16(p + 3, s->heads);
                    112:     put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
                    113:     put_le16(p + 5, 512); /* XXX: retired, remove ? */
                    114:     put_le16(p + 6, s->sectors);
                    115:     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
                    116:     put_le16(p + 20, 3); /* XXX: retired, remove ? */
                    117:     put_le16(p + 21, 512); /* cache size in sectors */
                    118:     put_le16(p + 22, 4); /* ecc bytes */
1.1.1.2   root      119:     padstr((char *)(p + 23), s->version, 8); /* firmware version */
1.1       root      120:     padstr((char *)(p + 27), "QEMU HARDDISK", 40); /* model */
                    121: #if MAX_MULT_SECTORS > 1
                    122:     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
                    123: #endif
                    124:     put_le16(p + 48, 1); /* dword I/O */
                    125:     put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
                    126:     put_le16(p + 51, 0x200); /* PIO transfer cycle */
                    127:     put_le16(p + 52, 0x200); /* DMA transfer cycle */
                    128:     put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
                    129:     put_le16(p + 54, s->cylinders);
                    130:     put_le16(p + 55, s->heads);
                    131:     put_le16(p + 56, s->sectors);
                    132:     oldsize = s->cylinders * s->heads * s->sectors;
                    133:     put_le16(p + 57, oldsize);
                    134:     put_le16(p + 58, oldsize >> 16);
                    135:     if (s->mult_sectors)
                    136:         put_le16(p + 59, 0x100 | s->mult_sectors);
                    137:     put_le16(p + 60, s->nb_sectors);
                    138:     put_le16(p + 61, s->nb_sectors >> 16);
                    139:     put_le16(p + 62, 0x07); /* single word dma0-2 supported */
                    140:     put_le16(p + 63, 0x07); /* mdma0-2 supported */
                    141:     put_le16(p + 65, 120);
                    142:     put_le16(p + 66, 120);
                    143:     put_le16(p + 67, 120);
                    144:     put_le16(p + 68, 120);
                    145:     put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
                    146:     put_le16(p + 81, 0x16); /* conforms to ata5 */
                    147:     /* 14=NOP supported, 0=SMART supported */
                    148:     put_le16(p + 82, (1 << 14) | 1);
                    149:     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
                    150:     put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
                    151:     /* 14=set to 1, 1=SMART self test, 0=SMART error logging */
                    152:     put_le16(p + 84, (1 << 14) | 0);
                    153:     /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
                    154:     if (bdrv_enable_write_cache(s->bs))
                    155:          put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
                    156:     else
                    157:          put_le16(p + 85, (1 << 14) | 1);
                    158:     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
                    159:     put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
                    160:     /* 14=set to 1, 1=smart self test, 0=smart error logging */
                    161:     put_le16(p + 87, (1 << 14) | 0);
                    162:     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
                    163:     put_le16(p + 93, 1 | (1 << 14) | 0x2000);
                    164:     put_le16(p + 100, s->nb_sectors);
                    165:     put_le16(p + 101, s->nb_sectors >> 16);
                    166:     put_le16(p + 102, s->nb_sectors >> 32);
                    167:     put_le16(p + 103, s->nb_sectors >> 48);
1.1.1.4 ! root      168:     dev = s->unit ? s->bus->slave : s->bus->master;
        !           169:     if (dev && dev->conf.physical_block_size)
        !           170:         put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
1.1       root      171: 
                    172:     memcpy(s->identify_data, p, sizeof(s->identify_data));
                    173:     s->identify_set = 1;
                    174: }
                    175: 
                    176: static void ide_atapi_identify(IDEState *s)
                    177: {
                    178:     uint16_t *p;
                    179: 
                    180:     if (s->identify_set) {
                    181:        memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
                    182:        return;
                    183:     }
                    184: 
                    185:     memset(s->io_buffer, 0, 512);
                    186:     p = (uint16_t *)s->io_buffer;
                    187:     /* Removable CDROM, 50us response, 12 byte packets */
                    188:     put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
                    189:     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
                    190:     put_le16(p + 20, 3); /* buffer type */
                    191:     put_le16(p + 21, 512); /* cache size in sectors */
                    192:     put_le16(p + 22, 4); /* ecc bytes */
1.1.1.2   root      193:     padstr((char *)(p + 23), s->version, 8); /* firmware version */
1.1       root      194:     padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */
                    195:     put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
                    196: #ifdef USE_DMA_CDROM
                    197:     put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
                    198:     put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
                    199:     put_le16(p + 62, 7);  /* single word dma0-2 supported */
                    200:     put_le16(p + 63, 7);  /* mdma0-2 supported */
                    201:     put_le16(p + 64, 0x3f); /* PIO modes supported */
                    202: #else
                    203:     put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
                    204:     put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
                    205:     put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
                    206:     put_le16(p + 64, 1); /* PIO modes */
                    207: #endif
                    208:     put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
                    209:     put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
                    210:     put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
                    211:     put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
                    212: 
                    213:     put_le16(p + 71, 30); /* in ns */
                    214:     put_le16(p + 72, 30); /* in ns */
                    215: 
                    216:     put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
                    217: #ifdef USE_DMA_CDROM
                    218:     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
                    219: #endif
                    220:     memcpy(s->identify_data, p, sizeof(s->identify_data));
                    221:     s->identify_set = 1;
                    222: }
                    223: 
                    224: static void ide_cfata_identify(IDEState *s)
                    225: {
                    226:     uint16_t *p;
                    227:     uint32_t cur_sec;
                    228: 
                    229:     p = (uint16_t *) s->identify_data;
                    230:     if (s->identify_set)
                    231:         goto fill_buffer;
                    232: 
                    233:     memset(p, 0, sizeof(s->identify_data));
                    234: 
                    235:     cur_sec = s->cylinders * s->heads * s->sectors;
                    236: 
                    237:     put_le16(p + 0, 0x848a);                   /* CF Storage Card signature */
                    238:     put_le16(p + 1, s->cylinders);             /* Default cylinders */
                    239:     put_le16(p + 3, s->heads);                 /* Default heads */
                    240:     put_le16(p + 6, s->sectors);               /* Default sectors per track */
                    241:     put_le16(p + 7, s->nb_sectors >> 16);      /* Sectors per card */
                    242:     put_le16(p + 8, s->nb_sectors);            /* Sectors per card */
                    243:     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
                    244:     put_le16(p + 22, 0x0004);                  /* ECC bytes */
1.1.1.2   root      245:     padstr((char *) (p + 23), s->version, 8);  /* Firmware Revision */
1.1       root      246:     padstr((char *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */
                    247: #if MAX_MULT_SECTORS > 1
                    248:     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
                    249: #else
                    250:     put_le16(p + 47, 0x0000);
                    251: #endif
                    252:     put_le16(p + 49, 0x0f00);                  /* Capabilities */
                    253:     put_le16(p + 51, 0x0002);                  /* PIO cycle timing mode */
                    254:     put_le16(p + 52, 0x0001);                  /* DMA cycle timing mode */
                    255:     put_le16(p + 53, 0x0003);                  /* Translation params valid */
                    256:     put_le16(p + 54, s->cylinders);            /* Current cylinders */
                    257:     put_le16(p + 55, s->heads);                        /* Current heads */
                    258:     put_le16(p + 56, s->sectors);              /* Current sectors */
                    259:     put_le16(p + 57, cur_sec);                 /* Current capacity */
                    260:     put_le16(p + 58, cur_sec >> 16);           /* Current capacity */
                    261:     if (s->mult_sectors)                       /* Multiple sector setting */
                    262:         put_le16(p + 59, 0x100 | s->mult_sectors);
                    263:     put_le16(p + 60, s->nb_sectors);           /* Total LBA sectors */
                    264:     put_le16(p + 61, s->nb_sectors >> 16);     /* Total LBA sectors */
                    265:     put_le16(p + 63, 0x0203);                  /* Multiword DMA capability */
                    266:     put_le16(p + 64, 0x0001);                  /* Flow Control PIO support */
                    267:     put_le16(p + 65, 0x0096);                  /* Min. Multiword DMA cycle */
                    268:     put_le16(p + 66, 0x0096);                  /* Rec. Multiword DMA cycle */
                    269:     put_le16(p + 68, 0x00b4);                  /* Min. PIO cycle time */
                    270:     put_le16(p + 82, 0x400c);                  /* Command Set supported */
                    271:     put_le16(p + 83, 0x7068);                  /* Command Set supported */
                    272:     put_le16(p + 84, 0x4000);                  /* Features supported */
                    273:     put_le16(p + 85, 0x000c);                  /* Command Set enabled */
                    274:     put_le16(p + 86, 0x7044);                  /* Command Set enabled */
                    275:     put_le16(p + 87, 0x4000);                  /* Features enabled */
                    276:     put_le16(p + 91, 0x4060);                  /* Current APM level */
                    277:     put_le16(p + 129, 0x0002);                 /* Current features option */
                    278:     put_le16(p + 130, 0x0005);                 /* Reassigned sectors */
                    279:     put_le16(p + 131, 0x0001);                 /* Initial power mode */
                    280:     put_le16(p + 132, 0x0000);                 /* User signature */
                    281:     put_le16(p + 160, 0x8100);                 /* Power requirement */
                    282:     put_le16(p + 161, 0x8001);                 /* CF command set */
                    283: 
                    284:     s->identify_set = 1;
                    285: 
                    286: fill_buffer:
                    287:     memcpy(s->io_buffer, p, sizeof(s->identify_data));
                    288: }
                    289: 
                    290: static void ide_set_signature(IDEState *s)
                    291: {
                    292:     s->select &= 0xf0; /* clear head */
                    293:     /* put signature */
                    294:     s->nsector = 1;
                    295:     s->sector = 1;
1.1.1.4 ! root      296:     if (s->drive_kind == IDE_CD) {
1.1       root      297:         s->lcyl = 0x14;
                    298:         s->hcyl = 0xeb;
                    299:     } else if (s->bs) {
                    300:         s->lcyl = 0;
                    301:         s->hcyl = 0;
                    302:     } else {
                    303:         s->lcyl = 0xff;
                    304:         s->hcyl = 0xff;
                    305:     }
                    306: }
                    307: 
                    308: static inline void ide_abort_command(IDEState *s)
                    309: {
                    310:     s->status = READY_STAT | ERR_STAT;
                    311:     s->error = ABRT_ERR;
                    312: }
                    313: 
                    314: static inline void ide_dma_submit_check(IDEState *s,
                    315:           BlockDriverCompletionFunc *dma_cb, BMDMAState *bm)
                    316: {
                    317:     if (bm->aiocb)
                    318:        return;
                    319:     dma_cb(bm, -1);
                    320: }
                    321: 
                    322: /* prepare data transfer and tell what to do after */
                    323: static void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
                    324:                                EndTransferFunc *end_transfer_func)
                    325: {
                    326:     s->end_transfer_func = end_transfer_func;
                    327:     s->data_ptr = buf;
                    328:     s->data_end = buf + size;
                    329:     if (!(s->status & ERR_STAT))
                    330:         s->status |= DRQ_STAT;
                    331: }
                    332: 
                    333: static void ide_transfer_stop(IDEState *s)
                    334: {
                    335:     s->end_transfer_func = ide_transfer_stop;
                    336:     s->data_ptr = s->io_buffer;
                    337:     s->data_end = s->io_buffer;
                    338:     s->status &= ~DRQ_STAT;
                    339: }
                    340: 
                    341: int64_t ide_get_sector(IDEState *s)
                    342: {
                    343:     int64_t sector_num;
                    344:     if (s->select & 0x40) {
                    345:         /* lba */
                    346:        if (!s->lba48) {
                    347:            sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
                    348:                (s->lcyl << 8) | s->sector;
                    349:        } else {
                    350:            sector_num = ((int64_t)s->hob_hcyl << 40) |
                    351:                ((int64_t) s->hob_lcyl << 32) |
                    352:                ((int64_t) s->hob_sector << 24) |
                    353:                ((int64_t) s->hcyl << 16) |
                    354:                ((int64_t) s->lcyl << 8) | s->sector;
                    355:        }
                    356:     } else {
                    357:         sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
                    358:             (s->select & 0x0f) * s->sectors + (s->sector - 1);
                    359:     }
                    360:     return sector_num;
                    361: }
                    362: 
                    363: void ide_set_sector(IDEState *s, int64_t sector_num)
                    364: {
                    365:     unsigned int cyl, r;
                    366:     if (s->select & 0x40) {
                    367:        if (!s->lba48) {
                    368:             s->select = (s->select & 0xf0) | (sector_num >> 24);
                    369:             s->hcyl = (sector_num >> 16);
                    370:             s->lcyl = (sector_num >> 8);
                    371:             s->sector = (sector_num);
                    372:        } else {
                    373:            s->sector = sector_num;
                    374:            s->lcyl = sector_num >> 8;
                    375:            s->hcyl = sector_num >> 16;
                    376:            s->hob_sector = sector_num >> 24;
                    377:            s->hob_lcyl = sector_num >> 32;
                    378:            s->hob_hcyl = sector_num >> 40;
                    379:        }
                    380:     } else {
                    381:         cyl = sector_num / (s->heads * s->sectors);
                    382:         r = sector_num % (s->heads * s->sectors);
                    383:         s->hcyl = cyl >> 8;
                    384:         s->lcyl = cyl;
                    385:         s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
                    386:         s->sector = (r % s->sectors) + 1;
                    387:     }
                    388: }
                    389: 
                    390: static void ide_rw_error(IDEState *s) {
                    391:     ide_abort_command(s);
                    392:     ide_set_irq(s->bus);
                    393: }
                    394: 
                    395: static void ide_sector_read(IDEState *s)
                    396: {
                    397:     int64_t sector_num;
                    398:     int ret, n;
                    399: 
                    400:     s->status = READY_STAT | SEEK_STAT;
                    401:     s->error = 0; /* not needed by IDE spec, but needed by Windows */
                    402:     sector_num = ide_get_sector(s);
                    403:     n = s->nsector;
                    404:     if (n == 0) {
                    405:         /* no more sector to read from disk */
                    406:         ide_transfer_stop(s);
                    407:     } else {
                    408: #if defined(DEBUG_IDE)
                    409:         printf("read sector=%" PRId64 "\n", sector_num);
                    410: #endif
                    411:         if (n > s->req_nb_sectors)
                    412:             n = s->req_nb_sectors;
                    413:         ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
                    414:         if (ret != 0) {
                    415:             if (ide_handle_rw_error(s, -ret,
                    416:                 BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ))
                    417:             {
                    418:                 return;
                    419:             }
                    420:         }
                    421:         ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
                    422:         ide_set_irq(s->bus);
                    423:         ide_set_sector(s, sector_num + n);
                    424:         s->nsector -= n;
                    425:     }
                    426: }
                    427: 
                    428: 
                    429: /* return 0 if buffer completed */
                    430: static int dma_buf_prepare(BMDMAState *bm, int is_write)
                    431: {
                    432:     IDEState *s = bmdma_active_if(bm);
                    433:     struct {
                    434:         uint32_t addr;
                    435:         uint32_t size;
                    436:     } prd;
                    437:     int l, len;
                    438: 
1.1.1.4 ! root      439:     qemu_sglist_init(&s->sg, s->nsector / (IDE_PAGE_SIZE / 512) + 1);
1.1       root      440:     s->io_buffer_size = 0;
                    441:     for(;;) {
                    442:         if (bm->cur_prd_len == 0) {
                    443:             /* end of table (with a fail safe of one page) */
                    444:             if (bm->cur_prd_last ||
1.1.1.4 ! root      445:                 (bm->cur_addr - bm->addr) >= IDE_PAGE_SIZE)
1.1       root      446:                 return s->io_buffer_size != 0;
                    447:             cpu_physical_memory_read(bm->cur_addr, (uint8_t *)&prd, 8);
                    448:             bm->cur_addr += 8;
                    449:             prd.addr = le32_to_cpu(prd.addr);
                    450:             prd.size = le32_to_cpu(prd.size);
                    451:             len = prd.size & 0xfffe;
                    452:             if (len == 0)
                    453:                 len = 0x10000;
                    454:             bm->cur_prd_len = len;
                    455:             bm->cur_prd_addr = prd.addr;
                    456:             bm->cur_prd_last = (prd.size & 0x80000000);
                    457:         }
                    458:         l = bm->cur_prd_len;
                    459:         if (l > 0) {
                    460:             qemu_sglist_add(&s->sg, bm->cur_prd_addr, l);
                    461:             bm->cur_prd_addr += l;
                    462:             bm->cur_prd_len -= l;
                    463:             s->io_buffer_size += l;
                    464:         }
                    465:     }
                    466:     return 1;
                    467: }
                    468: 
                    469: static void dma_buf_commit(IDEState *s, int is_write)
                    470: {
                    471:     qemu_sglist_destroy(&s->sg);
                    472: }
                    473: 
                    474: void ide_dma_error(IDEState *s)
                    475: {
                    476:     ide_transfer_stop(s);
                    477:     s->error = ABRT_ERR;
                    478:     s->status = READY_STAT | ERR_STAT;
                    479:     ide_set_irq(s->bus);
                    480: }
                    481: 
                    482: static int ide_handle_rw_error(IDEState *s, int error, int op)
                    483: {
                    484:     int is_read = (op & BM_STATUS_RETRY_READ);
1.1.1.4 ! root      485:     BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
1.1       root      486: 
1.1.1.4 ! root      487:     if (action == BLOCK_ERR_IGNORE) {
        !           488:         bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);
1.1       root      489:         return 0;
1.1.1.4 ! root      490:     }
1.1       root      491: 
                    492:     if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
                    493:             || action == BLOCK_ERR_STOP_ANY) {
                    494:         s->bus->bmdma->unit = s->unit;
                    495:         s->bus->bmdma->status |= op;
1.1.1.4 ! root      496:         bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
1.1       root      497:         vm_stop(0);
                    498:     } else {
                    499:         if (op & BM_STATUS_DMA_RETRY) {
                    500:             dma_buf_commit(s, 0);
                    501:             ide_dma_error(s);
                    502:         } else {
                    503:             ide_rw_error(s);
                    504:         }
1.1.1.4 ! root      505:         bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
1.1       root      506:     }
                    507: 
                    508:     return 1;
                    509: }
                    510: 
                    511: /* return 0 if buffer completed */
                    512: static int dma_buf_rw(BMDMAState *bm, int is_write)
                    513: {
                    514:     IDEState *s = bmdma_active_if(bm);
                    515:     struct {
                    516:         uint32_t addr;
                    517:         uint32_t size;
                    518:     } prd;
                    519:     int l, len;
                    520: 
                    521:     for(;;) {
                    522:         l = s->io_buffer_size - s->io_buffer_index;
                    523:         if (l <= 0)
                    524:             break;
                    525:         if (bm->cur_prd_len == 0) {
                    526:             /* end of table (with a fail safe of one page) */
                    527:             if (bm->cur_prd_last ||
1.1.1.4 ! root      528:                 (bm->cur_addr - bm->addr) >= IDE_PAGE_SIZE)
1.1       root      529:                 return 0;
                    530:             cpu_physical_memory_read(bm->cur_addr, (uint8_t *)&prd, 8);
                    531:             bm->cur_addr += 8;
                    532:             prd.addr = le32_to_cpu(prd.addr);
                    533:             prd.size = le32_to_cpu(prd.size);
                    534:             len = prd.size & 0xfffe;
                    535:             if (len == 0)
                    536:                 len = 0x10000;
                    537:             bm->cur_prd_len = len;
                    538:             bm->cur_prd_addr = prd.addr;
                    539:             bm->cur_prd_last = (prd.size & 0x80000000);
                    540:         }
                    541:         if (l > bm->cur_prd_len)
                    542:             l = bm->cur_prd_len;
                    543:         if (l > 0) {
                    544:             if (is_write) {
                    545:                 cpu_physical_memory_write(bm->cur_prd_addr,
                    546:                                           s->io_buffer + s->io_buffer_index, l);
                    547:             } else {
                    548:                 cpu_physical_memory_read(bm->cur_prd_addr,
                    549:                                           s->io_buffer + s->io_buffer_index, l);
                    550:             }
                    551:             bm->cur_prd_addr += l;
                    552:             bm->cur_prd_len -= l;
                    553:             s->io_buffer_index += l;
                    554:         }
                    555:     }
                    556:     return 1;
                    557: }
                    558: 
                    559: static void ide_read_dma_cb(void *opaque, int ret)
                    560: {
                    561:     BMDMAState *bm = opaque;
                    562:     IDEState *s = bmdma_active_if(bm);
                    563:     int n;
                    564:     int64_t sector_num;
                    565: 
                    566:     if (ret < 0) {
                    567:         if (ide_handle_rw_error(s, -ret,
                    568:             BM_STATUS_DMA_RETRY | BM_STATUS_RETRY_READ))
                    569:         {
                    570:             return;
                    571:         }
                    572:     }
                    573: 
                    574:     n = s->io_buffer_size >> 9;
                    575:     sector_num = ide_get_sector(s);
                    576:     if (n > 0) {
                    577:         dma_buf_commit(s, 1);
                    578:         sector_num += n;
                    579:         ide_set_sector(s, sector_num);
                    580:         s->nsector -= n;
                    581:     }
                    582: 
                    583:     /* end of transfer ? */
                    584:     if (s->nsector == 0) {
                    585:         s->status = READY_STAT | SEEK_STAT;
                    586:         ide_set_irq(s->bus);
                    587:     eot:
                    588:         bm->status &= ~BM_STATUS_DMAING;
                    589:         bm->status |= BM_STATUS_INT;
                    590:         bm->dma_cb = NULL;
                    591:         bm->unit = -1;
                    592:         bm->aiocb = NULL;
                    593:         return;
                    594:     }
                    595: 
                    596:     /* launch next transfer */
                    597:     n = s->nsector;
                    598:     s->io_buffer_index = 0;
                    599:     s->io_buffer_size = n * 512;
                    600:     if (dma_buf_prepare(bm, 1) == 0)
                    601:         goto eot;
                    602: #ifdef DEBUG_AIO
                    603:     printf("aio_read: sector_num=%" PRId64 " n=%d\n", sector_num, n);
                    604: #endif
                    605:     bm->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num, ide_read_dma_cb, bm);
                    606:     ide_dma_submit_check(s, ide_read_dma_cb, bm);
                    607: }
                    608: 
                    609: static void ide_sector_read_dma(IDEState *s)
                    610: {
                    611:     s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
                    612:     s->io_buffer_index = 0;
                    613:     s->io_buffer_size = 0;
                    614:     s->is_read = 1;
                    615:     ide_dma_start(s, ide_read_dma_cb);
                    616: }
                    617: 
                    618: static void ide_sector_write_timer_cb(void *opaque)
                    619: {
                    620:     IDEState *s = opaque;
                    621:     ide_set_irq(s->bus);
                    622: }
                    623: 
                    624: static void ide_sector_write(IDEState *s)
                    625: {
                    626:     int64_t sector_num;
                    627:     int ret, n, n1;
                    628: 
                    629:     s->status = READY_STAT | SEEK_STAT;
                    630:     sector_num = ide_get_sector(s);
                    631: #if defined(DEBUG_IDE)
                    632:     printf("write sector=%" PRId64 "\n", sector_num);
                    633: #endif
                    634:     n = s->nsector;
                    635:     if (n > s->req_nb_sectors)
                    636:         n = s->req_nb_sectors;
                    637:     ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
                    638: 
                    639:     if (ret != 0) {
                    640:         if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY))
                    641:             return;
                    642:     }
                    643: 
                    644:     s->nsector -= n;
                    645:     if (s->nsector == 0) {
                    646:         /* no more sectors to write */
                    647:         ide_transfer_stop(s);
                    648:     } else {
                    649:         n1 = s->nsector;
                    650:         if (n1 > s->req_nb_sectors)
                    651:             n1 = s->req_nb_sectors;
                    652:         ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
                    653:     }
                    654:     ide_set_sector(s, sector_num + n);
                    655: 
                    656:     if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
                    657:         /* It seems there is a bug in the Windows 2000 installer HDD
                    658:            IDE driver which fills the disk with empty logs when the
                    659:            IDE write IRQ comes too early. This hack tries to correct
                    660:            that at the expense of slower write performances. Use this
                    661:            option _only_ to install Windows 2000. You must disable it
                    662:            for normal use. */
1.1.1.4 ! root      663:         qemu_mod_timer(s->sector_write_timer,
1.1       root      664:                        qemu_get_clock(vm_clock) + (get_ticks_per_sec() / 1000));
1.1.1.4 ! root      665:     } else {
1.1       root      666:         ide_set_irq(s->bus);
                    667:     }
                    668: }
                    669: 
                    670: static void ide_dma_restart_bh(void *opaque)
                    671: {
                    672:     BMDMAState *bm = opaque;
                    673:     int is_read;
                    674: 
                    675:     qemu_bh_delete(bm->bh);
                    676:     bm->bh = NULL;
                    677: 
                    678:     is_read = !!(bm->status & BM_STATUS_RETRY_READ);
                    679: 
                    680:     if (bm->status & BM_STATUS_DMA_RETRY) {
                    681:         bm->status &= ~(BM_STATUS_DMA_RETRY | BM_STATUS_RETRY_READ);
                    682:         ide_dma_restart(bmdma_active_if(bm), is_read);
                    683:     } else if (bm->status & BM_STATUS_PIO_RETRY) {
                    684:         bm->status &= ~(BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ);
                    685:         if (is_read) {
                    686:             ide_sector_read(bmdma_active_if(bm));
                    687:         } else {
                    688:             ide_sector_write(bmdma_active_if(bm));
                    689:         }
                    690:     }
                    691: }
                    692: 
                    693: void ide_dma_restart_cb(void *opaque, int running, int reason)
                    694: {
                    695:     BMDMAState *bm = opaque;
                    696: 
                    697:     if (!running)
                    698:         return;
                    699: 
                    700:     if (!bm->bh) {
                    701:         bm->bh = qemu_bh_new(ide_dma_restart_bh, bm);
                    702:         qemu_bh_schedule(bm->bh);
                    703:     }
                    704: }
                    705: 
                    706: static void ide_write_dma_cb(void *opaque, int ret)
                    707: {
                    708:     BMDMAState *bm = opaque;
                    709:     IDEState *s = bmdma_active_if(bm);
                    710:     int n;
                    711:     int64_t sector_num;
                    712: 
                    713:     if (ret < 0) {
                    714:         if (ide_handle_rw_error(s, -ret,  BM_STATUS_DMA_RETRY))
                    715:             return;
                    716:     }
                    717: 
                    718:     n = s->io_buffer_size >> 9;
                    719:     sector_num = ide_get_sector(s);
                    720:     if (n > 0) {
                    721:         dma_buf_commit(s, 0);
                    722:         sector_num += n;
                    723:         ide_set_sector(s, sector_num);
                    724:         s->nsector -= n;
                    725:     }
                    726: 
                    727:     /* end of transfer ? */
                    728:     if (s->nsector == 0) {
                    729:         s->status = READY_STAT | SEEK_STAT;
                    730:         ide_set_irq(s->bus);
                    731:     eot:
                    732:         bm->status &= ~BM_STATUS_DMAING;
                    733:         bm->status |= BM_STATUS_INT;
                    734:         bm->dma_cb = NULL;
                    735:         bm->unit = -1;
                    736:         bm->aiocb = NULL;
                    737:         return;
                    738:     }
                    739: 
                    740:     n = s->nsector;
                    741:     s->io_buffer_size = n * 512;
                    742:     /* launch next transfer */
                    743:     if (dma_buf_prepare(bm, 0) == 0)
                    744:         goto eot;
                    745: #ifdef DEBUG_AIO
                    746:     printf("aio_write: sector_num=%" PRId64 " n=%d\n", sector_num, n);
                    747: #endif
                    748:     bm->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num, ide_write_dma_cb, bm);
                    749:     ide_dma_submit_check(s, ide_write_dma_cb, bm);
                    750: }
                    751: 
                    752: static void ide_sector_write_dma(IDEState *s)
                    753: {
                    754:     s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
                    755:     s->io_buffer_index = 0;
                    756:     s->io_buffer_size = 0;
                    757:     s->is_read = 0;
                    758:     ide_dma_start(s, ide_write_dma_cb);
                    759: }
                    760: 
                    761: void ide_atapi_cmd_ok(IDEState *s)
                    762: {
                    763:     s->error = 0;
                    764:     s->status = READY_STAT | SEEK_STAT;
                    765:     s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
                    766:     ide_set_irq(s->bus);
                    767: }
                    768: 
                    769: void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc)
                    770: {
                    771: #ifdef DEBUG_IDE_ATAPI
                    772:     printf("atapi_cmd_error: sense=0x%x asc=0x%x\n", sense_key, asc);
                    773: #endif
                    774:     s->error = sense_key << 4;
                    775:     s->status = READY_STAT | ERR_STAT;
                    776:     s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
                    777:     s->sense_key = sense_key;
                    778:     s->asc = asc;
                    779:     ide_set_irq(s->bus);
                    780: }
                    781: 
                    782: static void ide_atapi_cmd_check_status(IDEState *s)
                    783: {
                    784: #ifdef DEBUG_IDE_ATAPI
                    785:     printf("atapi_cmd_check_status\n");
                    786: #endif
                    787:     s->error = MC_ERR | (SENSE_UNIT_ATTENTION << 4);
                    788:     s->status = ERR_STAT;
                    789:     s->nsector = 0;
                    790:     ide_set_irq(s->bus);
                    791: }
                    792: 
                    793: static void ide_flush_cb(void *opaque, int ret)
                    794: {
                    795:     IDEState *s = opaque;
                    796: 
                    797:     /* XXX: how do we signal I/O errors here? */
                    798: 
                    799:     s->status = READY_STAT | SEEK_STAT;
                    800:     ide_set_irq(s->bus);
                    801: }
                    802: 
                    803: static inline void cpu_to_ube16(uint8_t *buf, int val)
                    804: {
                    805:     buf[0] = val >> 8;
                    806:     buf[1] = val & 0xff;
                    807: }
                    808: 
                    809: static inline void cpu_to_ube32(uint8_t *buf, unsigned int val)
                    810: {
                    811:     buf[0] = val >> 24;
                    812:     buf[1] = val >> 16;
                    813:     buf[2] = val >> 8;
                    814:     buf[3] = val & 0xff;
                    815: }
                    816: 
                    817: static inline int ube16_to_cpu(const uint8_t *buf)
                    818: {
                    819:     return (buf[0] << 8) | buf[1];
                    820: }
                    821: 
                    822: static inline int ube32_to_cpu(const uint8_t *buf)
                    823: {
                    824:     return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
                    825: }
                    826: 
                    827: static void lba_to_msf(uint8_t *buf, int lba)
                    828: {
                    829:     lba += 150;
                    830:     buf[0] = (lba / 75) / 60;
                    831:     buf[1] = (lba / 75) % 60;
                    832:     buf[2] = lba % 75;
                    833: }
                    834: 
                    835: static void cd_data_to_raw(uint8_t *buf, int lba)
                    836: {
                    837:     /* sync bytes */
                    838:     buf[0] = 0x00;
                    839:     memset(buf + 1, 0xff, 10);
                    840:     buf[11] = 0x00;
                    841:     buf += 12;
                    842:     /* MSF */
                    843:     lba_to_msf(buf, lba);
                    844:     buf[3] = 0x01; /* mode 1 data */
                    845:     buf += 4;
                    846:     /* data */
                    847:     buf += 2048;
                    848:     /* XXX: ECC not computed */
                    849:     memset(buf, 0, 288);
                    850: }
                    851: 
                    852: static int cd_read_sector(BlockDriverState *bs, int lba, uint8_t *buf,
                    853:                            int sector_size)
                    854: {
                    855:     int ret;
                    856: 
                    857:     switch(sector_size) {
                    858:     case 2048:
                    859:         ret = bdrv_read(bs, (int64_t)lba << 2, buf, 4);
                    860:         break;
                    861:     case 2352:
                    862:         ret = bdrv_read(bs, (int64_t)lba << 2, buf + 16, 4);
                    863:         if (ret < 0)
                    864:             return ret;
                    865:         cd_data_to_raw(buf, lba);
                    866:         break;
                    867:     default:
                    868:         ret = -EIO;
                    869:         break;
                    870:     }
                    871:     return ret;
                    872: }
                    873: 
                    874: void ide_atapi_io_error(IDEState *s, int ret)
                    875: {
                    876:     /* XXX: handle more errors */
                    877:     if (ret == -ENOMEDIUM) {
                    878:         ide_atapi_cmd_error(s, SENSE_NOT_READY,
                    879:                             ASC_MEDIUM_NOT_PRESENT);
                    880:     } else {
                    881:         ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                    882:                             ASC_LOGICAL_BLOCK_OOR);
                    883:     }
                    884: }
                    885: 
                    886: /* The whole ATAPI transfer logic is handled in this function */
                    887: static void ide_atapi_cmd_reply_end(IDEState *s)
                    888: {
                    889:     int byte_count_limit, size, ret;
                    890: #ifdef DEBUG_IDE_ATAPI
                    891:     printf("reply: tx_size=%d elem_tx_size=%d index=%d\n",
                    892:            s->packet_transfer_size,
                    893:            s->elementary_transfer_size,
                    894:            s->io_buffer_index);
                    895: #endif
                    896:     if (s->packet_transfer_size <= 0) {
                    897:         /* end of transfer */
                    898:         ide_transfer_stop(s);
                    899:         s->status = READY_STAT | SEEK_STAT;
                    900:         s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
                    901:         ide_set_irq(s->bus);
                    902: #ifdef DEBUG_IDE_ATAPI
                    903:         printf("status=0x%x\n", s->status);
                    904: #endif
                    905:     } else {
                    906:         /* see if a new sector must be read */
                    907:         if (s->lba != -1 && s->io_buffer_index >= s->cd_sector_size) {
                    908:             ret = cd_read_sector(s->bs, s->lba, s->io_buffer, s->cd_sector_size);
                    909:             if (ret < 0) {
                    910:                 ide_transfer_stop(s);
                    911:                 ide_atapi_io_error(s, ret);
                    912:                 return;
                    913:             }
                    914:             s->lba++;
                    915:             s->io_buffer_index = 0;
                    916:         }
                    917:         if (s->elementary_transfer_size > 0) {
                    918:             /* there are some data left to transmit in this elementary
                    919:                transfer */
                    920:             size = s->cd_sector_size - s->io_buffer_index;
                    921:             if (size > s->elementary_transfer_size)
                    922:                 size = s->elementary_transfer_size;
                    923:             ide_transfer_start(s, s->io_buffer + s->io_buffer_index,
                    924:                                size, ide_atapi_cmd_reply_end);
                    925:             s->packet_transfer_size -= size;
                    926:             s->elementary_transfer_size -= size;
                    927:             s->io_buffer_index += size;
                    928:         } else {
                    929:             /* a new transfer is needed */
                    930:             s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO;
                    931:             byte_count_limit = s->lcyl | (s->hcyl << 8);
                    932: #ifdef DEBUG_IDE_ATAPI
                    933:             printf("byte_count_limit=%d\n", byte_count_limit);
                    934: #endif
                    935:             if (byte_count_limit == 0xffff)
                    936:                 byte_count_limit--;
                    937:             size = s->packet_transfer_size;
                    938:             if (size > byte_count_limit) {
                    939:                 /* byte count limit must be even if this case */
                    940:                 if (byte_count_limit & 1)
                    941:                     byte_count_limit--;
                    942:                 size = byte_count_limit;
                    943:             }
                    944:             s->lcyl = size;
                    945:             s->hcyl = size >> 8;
                    946:             s->elementary_transfer_size = size;
                    947:             /* we cannot transmit more than one sector at a time */
                    948:             if (s->lba != -1) {
                    949:                 if (size > (s->cd_sector_size - s->io_buffer_index))
                    950:                     size = (s->cd_sector_size - s->io_buffer_index);
                    951:             }
                    952:             ide_transfer_start(s, s->io_buffer + s->io_buffer_index,
                    953:                                size, ide_atapi_cmd_reply_end);
                    954:             s->packet_transfer_size -= size;
                    955:             s->elementary_transfer_size -= size;
                    956:             s->io_buffer_index += size;
                    957:             ide_set_irq(s->bus);
                    958: #ifdef DEBUG_IDE_ATAPI
                    959:             printf("status=0x%x\n", s->status);
                    960: #endif
                    961:         }
                    962:     }
                    963: }
                    964: 
                    965: /* send a reply of 'size' bytes in s->io_buffer to an ATAPI command */
                    966: static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size)
                    967: {
                    968:     if (size > max_size)
                    969:         size = max_size;
                    970:     s->lba = -1; /* no sector read */
                    971:     s->packet_transfer_size = size;
                    972:     s->io_buffer_size = size;    /* dma: send the reply data as one chunk */
                    973:     s->elementary_transfer_size = 0;
                    974:     s->io_buffer_index = 0;
                    975: 
                    976:     if (s->atapi_dma) {
                    977:        s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
                    978:        ide_dma_start(s, ide_atapi_cmd_read_dma_cb);
                    979:     } else {
                    980:        s->status = READY_STAT | SEEK_STAT;
                    981:        ide_atapi_cmd_reply_end(s);
                    982:     }
                    983: }
                    984: 
                    985: /* start a CD-CDROM read command */
                    986: static void ide_atapi_cmd_read_pio(IDEState *s, int lba, int nb_sectors,
                    987:                                    int sector_size)
                    988: {
                    989:     s->lba = lba;
                    990:     s->packet_transfer_size = nb_sectors * sector_size;
                    991:     s->elementary_transfer_size = 0;
                    992:     s->io_buffer_index = sector_size;
                    993:     s->cd_sector_size = sector_size;
                    994: 
                    995:     s->status = READY_STAT | SEEK_STAT;
                    996:     ide_atapi_cmd_reply_end(s);
                    997: }
                    998: 
                    999: /* ATAPI DMA support */
                   1000: 
                   1001: /* XXX: handle read errors */
                   1002: static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
                   1003: {
                   1004:     BMDMAState *bm = opaque;
                   1005:     IDEState *s = bmdma_active_if(bm);
                   1006:     int data_offset, n;
                   1007: 
                   1008:     if (ret < 0) {
                   1009:         ide_atapi_io_error(s, ret);
                   1010:         goto eot;
                   1011:     }
                   1012: 
                   1013:     if (s->io_buffer_size > 0) {
                   1014:        /*
                   1015:         * For a cdrom read sector command (s->lba != -1),
                   1016:         * adjust the lba for the next s->io_buffer_size chunk
                   1017:         * and dma the current chunk.
                   1018:         * For a command != read (s->lba == -1), just transfer
                   1019:         * the reply data.
                   1020:         */
                   1021:        if (s->lba != -1) {
                   1022:            if (s->cd_sector_size == 2352) {
                   1023:                n = 1;
                   1024:                cd_data_to_raw(s->io_buffer, s->lba);
                   1025:            } else {
                   1026:                n = s->io_buffer_size >> 11;
                   1027:            }
                   1028:            s->lba += n;
                   1029:        }
                   1030:         s->packet_transfer_size -= s->io_buffer_size;
                   1031:         if (dma_buf_rw(bm, 1) == 0)
                   1032:             goto eot;
                   1033:     }
                   1034: 
                   1035:     if (s->packet_transfer_size <= 0) {
                   1036:         s->status = READY_STAT | SEEK_STAT;
                   1037:         s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
                   1038:         ide_set_irq(s->bus);
                   1039:     eot:
                   1040:         bm->status &= ~BM_STATUS_DMAING;
                   1041:         bm->status |= BM_STATUS_INT;
                   1042:         bm->dma_cb = NULL;
                   1043:         bm->unit = -1;
                   1044:         bm->aiocb = NULL;
                   1045:         return;
                   1046:     }
                   1047: 
                   1048:     s->io_buffer_index = 0;
                   1049:     if (s->cd_sector_size == 2352) {
                   1050:         n = 1;
                   1051:         s->io_buffer_size = s->cd_sector_size;
                   1052:         data_offset = 16;
                   1053:     } else {
                   1054:         n = s->packet_transfer_size >> 11;
                   1055:         if (n > (IDE_DMA_BUF_SECTORS / 4))
                   1056:             n = (IDE_DMA_BUF_SECTORS / 4);
                   1057:         s->io_buffer_size = n * 2048;
                   1058:         data_offset = 0;
                   1059:     }
                   1060: #ifdef DEBUG_AIO
                   1061:     printf("aio_read_cd: lba=%u n=%d\n", s->lba, n);
                   1062: #endif
                   1063:     bm->iov.iov_base = (void *)(s->io_buffer + data_offset);
                   1064:     bm->iov.iov_len = n * 4 * 512;
                   1065:     qemu_iovec_init_external(&bm->qiov, &bm->iov, 1);
                   1066:     bm->aiocb = bdrv_aio_readv(s->bs, (int64_t)s->lba << 2, &bm->qiov,
                   1067:                                n * 4, ide_atapi_cmd_read_dma_cb, bm);
                   1068:     if (!bm->aiocb) {
                   1069:         /* Note: media not present is the most likely case */
                   1070:         ide_atapi_cmd_error(s, SENSE_NOT_READY,
                   1071:                             ASC_MEDIUM_NOT_PRESENT);
                   1072:         goto eot;
                   1073:     }
                   1074: }
                   1075: 
                   1076: /* start a CD-CDROM read command with DMA */
                   1077: /* XXX: test if DMA is available */
                   1078: static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors,
                   1079:                                    int sector_size)
                   1080: {
                   1081:     s->lba = lba;
                   1082:     s->packet_transfer_size = nb_sectors * sector_size;
                   1083:     s->io_buffer_index = 0;
                   1084:     s->io_buffer_size = 0;
                   1085:     s->cd_sector_size = sector_size;
                   1086: 
                   1087:     /* XXX: check if BUSY_STAT should be set */
                   1088:     s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
                   1089:     ide_dma_start(s, ide_atapi_cmd_read_dma_cb);
                   1090: }
                   1091: 
                   1092: static void ide_atapi_cmd_read(IDEState *s, int lba, int nb_sectors,
                   1093:                                int sector_size)
                   1094: {
                   1095: #ifdef DEBUG_IDE_ATAPI
                   1096:     printf("read %s: LBA=%d nb_sectors=%d\n", s->atapi_dma ? "dma" : "pio",
                   1097:        lba, nb_sectors);
                   1098: #endif
                   1099:     if (s->atapi_dma) {
                   1100:         ide_atapi_cmd_read_dma(s, lba, nb_sectors, sector_size);
                   1101:     } else {
                   1102:         ide_atapi_cmd_read_pio(s, lba, nb_sectors, sector_size);
                   1103:     }
                   1104: }
                   1105: 
                   1106: static inline uint8_t ide_atapi_set_profile(uint8_t *buf, uint8_t *index,
                   1107:                                             uint16_t profile)
                   1108: {
                   1109:     uint8_t *buf_profile = buf + 12; /* start of profiles */
                   1110: 
                   1111:     buf_profile += ((*index) * 4); /* start of indexed profile */
                   1112:     cpu_to_ube16 (buf_profile, profile);
                   1113:     buf_profile[2] = ((buf_profile[0] == buf[6]) && (buf_profile[1] == buf[7]));
                   1114: 
                   1115:     /* each profile adds 4 bytes to the response */
                   1116:     (*index)++;
                   1117:     buf[11] += 4; /* Additional Length */
                   1118: 
                   1119:     return 4;
                   1120: }
                   1121: 
                   1122: static int ide_dvd_read_structure(IDEState *s, int format,
                   1123:                                   const uint8_t *packet, uint8_t *buf)
                   1124: {
                   1125:     switch (format) {
                   1126:         case 0x0: /* Physical format information */
                   1127:             {
                   1128:                 int layer = packet[6];
                   1129:                 uint64_t total_sectors;
                   1130: 
                   1131:                 if (layer != 0)
                   1132:                     return -ASC_INV_FIELD_IN_CMD_PACKET;
                   1133: 
                   1134:                 bdrv_get_geometry(s->bs, &total_sectors);
                   1135:                 total_sectors >>= 2;
                   1136:                 if (total_sectors == 0)
                   1137:                     return -ASC_MEDIUM_NOT_PRESENT;
                   1138: 
                   1139:                 buf[4] = 1;   /* DVD-ROM, part version 1 */
                   1140:                 buf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
                   1141:                 buf[6] = 1;   /* one layer, read-only (per MMC-2 spec) */
                   1142:                 buf[7] = 0;   /* default densities */
                   1143: 
                   1144:                 /* FIXME: 0x30000 per spec? */
                   1145:                 cpu_to_ube32(buf + 8, 0); /* start sector */
                   1146:                 cpu_to_ube32(buf + 12, total_sectors - 1); /* end sector */
                   1147:                 cpu_to_ube32(buf + 16, total_sectors - 1); /* l0 end sector */
                   1148: 
                   1149:                 /* Size of buffer, not including 2 byte size field */
                   1150:                 cpu_to_be16wu((uint16_t *)buf, 2048 + 2);
                   1151: 
                   1152:                 /* 2k data + 4 byte header */
                   1153:                 return (2048 + 4);
                   1154:             }
                   1155: 
                   1156:         case 0x01: /* DVD copyright information */
                   1157:             buf[4] = 0; /* no copyright data */
                   1158:             buf[5] = 0; /* no region restrictions */
                   1159: 
                   1160:             /* Size of buffer, not including 2 byte size field */
                   1161:             cpu_to_be16wu((uint16_t *)buf, 4 + 2);
                   1162: 
                   1163:             /* 4 byte header + 4 byte data */
                   1164:             return (4 + 4);
                   1165: 
                   1166:         case 0x03: /* BCA information - invalid field for no BCA info */
                   1167:             return -ASC_INV_FIELD_IN_CMD_PACKET;
                   1168: 
                   1169:         case 0x04: /* DVD disc manufacturing information */
                   1170:             /* Size of buffer, not including 2 byte size field */
                   1171:             cpu_to_be16wu((uint16_t *)buf, 2048 + 2);
                   1172: 
                   1173:             /* 2k data + 4 byte header */
                   1174:             return (2048 + 4);
                   1175: 
                   1176:         case 0xff:
                   1177:             /*
                   1178:              * This lists all the command capabilities above.  Add new ones
                   1179:              * in order and update the length and buffer return values.
                   1180:              */
                   1181: 
                   1182:             buf[4] = 0x00; /* Physical format */
                   1183:             buf[5] = 0x40; /* Not writable, is readable */
                   1184:             cpu_to_be16wu((uint16_t *)(buf + 6), 2048 + 4);
                   1185: 
                   1186:             buf[8] = 0x01; /* Copyright info */
                   1187:             buf[9] = 0x40; /* Not writable, is readable */
                   1188:             cpu_to_be16wu((uint16_t *)(buf + 10), 4 + 4);
                   1189: 
                   1190:             buf[12] = 0x03; /* BCA info */
                   1191:             buf[13] = 0x40; /* Not writable, is readable */
                   1192:             cpu_to_be16wu((uint16_t *)(buf + 14), 188 + 4);
                   1193: 
                   1194:             buf[16] = 0x04; /* Manufacturing info */
                   1195:             buf[17] = 0x40; /* Not writable, is readable */
                   1196:             cpu_to_be16wu((uint16_t *)(buf + 18), 2048 + 4);
                   1197: 
                   1198:             /* Size of buffer, not including 2 byte size field */
                   1199:             cpu_to_be16wu((uint16_t *)buf, 16 + 2);
                   1200: 
                   1201:             /* data written + 4 byte header */
                   1202:             return (16 + 4);
                   1203: 
                   1204:         default: /* TODO: formats beyond DVD-ROM requires */
                   1205:             return -ASC_INV_FIELD_IN_CMD_PACKET;
                   1206:     }
                   1207: }
                   1208: 
                   1209: static void ide_atapi_cmd(IDEState *s)
                   1210: {
                   1211:     const uint8_t *packet;
                   1212:     uint8_t *buf;
                   1213:     int max_len;
                   1214: 
                   1215:     packet = s->io_buffer;
                   1216:     buf = s->io_buffer;
                   1217: #ifdef DEBUG_IDE_ATAPI
                   1218:     {
                   1219:         int i;
                   1220:         printf("ATAPI limit=0x%x packet:", s->lcyl | (s->hcyl << 8));
                   1221:         for(i = 0; i < ATAPI_PACKET_SIZE; i++) {
                   1222:             printf(" %02x", packet[i]);
                   1223:         }
                   1224:         printf("\n");
                   1225:     }
                   1226: #endif
                   1227:     /* If there's a UNIT_ATTENTION condition pending, only
                   1228:        REQUEST_SENSE and INQUIRY commands are allowed to complete. */
                   1229:     if (s->sense_key == SENSE_UNIT_ATTENTION &&
                   1230:        s->io_buffer[0] != GPCMD_REQUEST_SENSE &&
                   1231:        s->io_buffer[0] != GPCMD_INQUIRY) {
                   1232:        ide_atapi_cmd_check_status(s);
                   1233:        return;
                   1234:     }
                   1235:     switch(s->io_buffer[0]) {
                   1236:     case GPCMD_TEST_UNIT_READY:
                   1237:         if (bdrv_is_inserted(s->bs) && !s->cdrom_changed) {
                   1238:             ide_atapi_cmd_ok(s);
                   1239:         } else {
                   1240:             s->cdrom_changed = 0;
                   1241:             ide_atapi_cmd_error(s, SENSE_NOT_READY,
                   1242:                                 ASC_MEDIUM_NOT_PRESENT);
                   1243:         }
                   1244:         break;
                   1245:     case GPCMD_MODE_SENSE_6:
                   1246:     case GPCMD_MODE_SENSE_10:
                   1247:         {
                   1248:             int action, code;
                   1249:             if (packet[0] == GPCMD_MODE_SENSE_10)
                   1250:                 max_len = ube16_to_cpu(packet + 7);
                   1251:             else
                   1252:                 max_len = packet[4];
                   1253:             action = packet[2] >> 6;
                   1254:             code = packet[2] & 0x3f;
                   1255:             switch(action) {
                   1256:             case 0: /* current values */
                   1257:                 switch(code) {
                   1258:                 case GPMODE_R_W_ERROR_PAGE: /* error recovery */
                   1259:                     cpu_to_ube16(&buf[0], 16 + 6);
                   1260:                     buf[2] = 0x70;
                   1261:                     buf[3] = 0;
                   1262:                     buf[4] = 0;
                   1263:                     buf[5] = 0;
                   1264:                     buf[6] = 0;
                   1265:                     buf[7] = 0;
                   1266: 
                   1267:                     buf[8] = 0x01;
                   1268:                     buf[9] = 0x06;
                   1269:                     buf[10] = 0x00;
                   1270:                     buf[11] = 0x05;
                   1271:                     buf[12] = 0x00;
                   1272:                     buf[13] = 0x00;
                   1273:                     buf[14] = 0x00;
                   1274:                     buf[15] = 0x00;
                   1275:                     ide_atapi_cmd_reply(s, 16, max_len);
                   1276:                     break;
                   1277:                 case GPMODE_AUDIO_CTL_PAGE:
                   1278:                     cpu_to_ube16(&buf[0], 24 + 6);
                   1279:                     buf[2] = 0x70;
                   1280:                     buf[3] = 0;
                   1281:                     buf[4] = 0;
                   1282:                     buf[5] = 0;
                   1283:                     buf[6] = 0;
                   1284:                     buf[7] = 0;
                   1285: 
                   1286:                     /* Fill with CDROM audio volume */
                   1287:                     buf[17] = 0;
                   1288:                     buf[19] = 0;
                   1289:                     buf[21] = 0;
                   1290:                     buf[23] = 0;
                   1291: 
                   1292:                     ide_atapi_cmd_reply(s, 24, max_len);
                   1293:                     break;
                   1294:                 case GPMODE_CAPABILITIES_PAGE:
                   1295:                     cpu_to_ube16(&buf[0], 28 + 6);
                   1296:                     buf[2] = 0x70;
                   1297:                     buf[3] = 0;
                   1298:                     buf[4] = 0;
                   1299:                     buf[5] = 0;
                   1300:                     buf[6] = 0;
                   1301:                     buf[7] = 0;
                   1302: 
                   1303:                     buf[8] = 0x2a;
                   1304:                     buf[9] = 0x12;
                   1305:                     buf[10] = 0x00;
                   1306:                     buf[11] = 0x00;
                   1307: 
                   1308:                     /* Claim PLAY_AUDIO capability (0x01) since some Linux
                   1309:                        code checks for this to automount media. */
                   1310:                     buf[12] = 0x71;
                   1311:                     buf[13] = 3 << 5;
                   1312:                     buf[14] = (1 << 0) | (1 << 3) | (1 << 5);
                   1313:                     if (bdrv_is_locked(s->bs))
                   1314:                         buf[6] |= 1 << 1;
                   1315:                     buf[15] = 0x00;
                   1316:                     cpu_to_ube16(&buf[16], 706);
                   1317:                     buf[18] = 0;
                   1318:                     buf[19] = 2;
                   1319:                     cpu_to_ube16(&buf[20], 512);
                   1320:                     cpu_to_ube16(&buf[22], 706);
                   1321:                     buf[24] = 0;
                   1322:                     buf[25] = 0;
                   1323:                     buf[26] = 0;
                   1324:                     buf[27] = 0;
                   1325:                     ide_atapi_cmd_reply(s, 28, max_len);
                   1326:                     break;
                   1327:                 default:
                   1328:                     goto error_cmd;
                   1329:                 }
                   1330:                 break;
                   1331:             case 1: /* changeable values */
                   1332:                 goto error_cmd;
                   1333:             case 2: /* default values */
                   1334:                 goto error_cmd;
                   1335:             default:
                   1336:             case 3: /* saved values */
                   1337:                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                   1338:                                     ASC_SAVING_PARAMETERS_NOT_SUPPORTED);
                   1339:                 break;
                   1340:             }
                   1341:         }
                   1342:         break;
                   1343:     case GPCMD_REQUEST_SENSE:
                   1344:         max_len = packet[4];
                   1345:         memset(buf, 0, 18);
                   1346:         buf[0] = 0x70 | (1 << 7);
                   1347:         buf[2] = s->sense_key;
                   1348:         buf[7] = 10;
                   1349:         buf[12] = s->asc;
                   1350:         if (s->sense_key == SENSE_UNIT_ATTENTION)
                   1351:             s->sense_key = SENSE_NONE;
                   1352:         ide_atapi_cmd_reply(s, 18, max_len);
                   1353:         break;
                   1354:     case GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL:
                   1355:         if (bdrv_is_inserted(s->bs)) {
                   1356:             bdrv_set_locked(s->bs, packet[4] & 1);
                   1357:             ide_atapi_cmd_ok(s);
                   1358:         } else {
                   1359:             ide_atapi_cmd_error(s, SENSE_NOT_READY,
                   1360:                                 ASC_MEDIUM_NOT_PRESENT);
                   1361:         }
                   1362:         break;
                   1363:     case GPCMD_READ_10:
                   1364:     case GPCMD_READ_12:
                   1365:         {
                   1366:             int nb_sectors, lba;
                   1367: 
                   1368:             if (packet[0] == GPCMD_READ_10)
                   1369:                 nb_sectors = ube16_to_cpu(packet + 7);
                   1370:             else
                   1371:                 nb_sectors = ube32_to_cpu(packet + 6);
                   1372:             lba = ube32_to_cpu(packet + 2);
                   1373:             if (nb_sectors == 0) {
                   1374:                 ide_atapi_cmd_ok(s);
                   1375:                 break;
                   1376:             }
                   1377:             ide_atapi_cmd_read(s, lba, nb_sectors, 2048);
                   1378:         }
                   1379:         break;
                   1380:     case GPCMD_READ_CD:
                   1381:         {
                   1382:             int nb_sectors, lba, transfer_request;
                   1383: 
                   1384:             nb_sectors = (packet[6] << 16) | (packet[7] << 8) | packet[8];
                   1385:             lba = ube32_to_cpu(packet + 2);
                   1386:             if (nb_sectors == 0) {
                   1387:                 ide_atapi_cmd_ok(s);
                   1388:                 break;
                   1389:             }
                   1390:             transfer_request = packet[9];
                   1391:             switch(transfer_request & 0xf8) {
                   1392:             case 0x00:
                   1393:                 /* nothing */
                   1394:                 ide_atapi_cmd_ok(s);
                   1395:                 break;
                   1396:             case 0x10:
                   1397:                 /* normal read */
                   1398:                 ide_atapi_cmd_read(s, lba, nb_sectors, 2048);
                   1399:                 break;
                   1400:             case 0xf8:
                   1401:                 /* read all data */
                   1402:                 ide_atapi_cmd_read(s, lba, nb_sectors, 2352);
                   1403:                 break;
                   1404:             default:
                   1405:                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                   1406:                                     ASC_INV_FIELD_IN_CMD_PACKET);
                   1407:                 break;
                   1408:             }
                   1409:         }
                   1410:         break;
                   1411:     case GPCMD_SEEK:
                   1412:         {
                   1413:             unsigned int lba;
                   1414:             uint64_t total_sectors;
                   1415: 
                   1416:             bdrv_get_geometry(s->bs, &total_sectors);
                   1417:             total_sectors >>= 2;
                   1418:             if (total_sectors == 0) {
                   1419:                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
                   1420:                                     ASC_MEDIUM_NOT_PRESENT);
                   1421:                 break;
                   1422:             }
                   1423:             lba = ube32_to_cpu(packet + 2);
                   1424:             if (lba >= total_sectors) {
                   1425:                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                   1426:                                     ASC_LOGICAL_BLOCK_OOR);
                   1427:                 break;
                   1428:             }
                   1429:             ide_atapi_cmd_ok(s);
                   1430:         }
                   1431:         break;
                   1432:     case GPCMD_START_STOP_UNIT:
                   1433:         {
                   1434:             int start, eject, err = 0;
                   1435:             start = packet[4] & 1;
                   1436:             eject = (packet[4] >> 1) & 1;
                   1437: 
                   1438:             if (eject) {
                   1439:                 err = bdrv_eject(s->bs, !start);
                   1440:             }
                   1441: 
                   1442:             switch (err) {
                   1443:             case 0:
                   1444:                 ide_atapi_cmd_ok(s);
                   1445:                 break;
                   1446:             case -EBUSY:
                   1447:                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
                   1448:                                     ASC_MEDIA_REMOVAL_PREVENTED);
                   1449:                 break;
                   1450:             default:
                   1451:                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
                   1452:                                     ASC_MEDIUM_NOT_PRESENT);
                   1453:                 break;
                   1454:             }
                   1455:         }
                   1456:         break;
                   1457:     case GPCMD_MECHANISM_STATUS:
                   1458:         {
                   1459:             max_len = ube16_to_cpu(packet + 8);
                   1460:             cpu_to_ube16(buf, 0);
                   1461:             /* no current LBA */
                   1462:             buf[2] = 0;
                   1463:             buf[3] = 0;
                   1464:             buf[4] = 0;
                   1465:             buf[5] = 1;
                   1466:             cpu_to_ube16(buf + 6, 0);
                   1467:             ide_atapi_cmd_reply(s, 8, max_len);
                   1468:         }
                   1469:         break;
                   1470:     case GPCMD_READ_TOC_PMA_ATIP:
                   1471:         {
                   1472:             int format, msf, start_track, len;
                   1473:             uint64_t total_sectors;
                   1474: 
                   1475:             bdrv_get_geometry(s->bs, &total_sectors);
                   1476:             total_sectors >>= 2;
                   1477:             if (total_sectors == 0) {
                   1478:                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
                   1479:                                     ASC_MEDIUM_NOT_PRESENT);
                   1480:                 break;
                   1481:             }
                   1482:             max_len = ube16_to_cpu(packet + 7);
                   1483:             format = packet[9] >> 6;
                   1484:             msf = (packet[1] >> 1) & 1;
                   1485:             start_track = packet[6];
                   1486:             switch(format) {
                   1487:             case 0:
                   1488:                 len = cdrom_read_toc(total_sectors, buf, msf, start_track);
                   1489:                 if (len < 0)
                   1490:                     goto error_cmd;
                   1491:                 ide_atapi_cmd_reply(s, len, max_len);
                   1492:                 break;
                   1493:             case 1:
                   1494:                 /* multi session : only a single session defined */
                   1495:                 memset(buf, 0, 12);
                   1496:                 buf[1] = 0x0a;
                   1497:                 buf[2] = 0x01;
                   1498:                 buf[3] = 0x01;
                   1499:                 ide_atapi_cmd_reply(s, 12, max_len);
                   1500:                 break;
                   1501:             case 2:
                   1502:                 len = cdrom_read_toc_raw(total_sectors, buf, msf, start_track);
                   1503:                 if (len < 0)
                   1504:                     goto error_cmd;
                   1505:                 ide_atapi_cmd_reply(s, len, max_len);
                   1506:                 break;
                   1507:             default:
                   1508:             error_cmd:
                   1509:                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                   1510:                                     ASC_INV_FIELD_IN_CMD_PACKET);
                   1511:                 break;
                   1512:             }
                   1513:         }
                   1514:         break;
                   1515:     case GPCMD_READ_CDVD_CAPACITY:
                   1516:         {
                   1517:             uint64_t total_sectors;
                   1518: 
                   1519:             bdrv_get_geometry(s->bs, &total_sectors);
                   1520:             total_sectors >>= 2;
                   1521:             if (total_sectors == 0) {
                   1522:                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
                   1523:                                     ASC_MEDIUM_NOT_PRESENT);
                   1524:                 break;
                   1525:             }
                   1526:             /* NOTE: it is really the number of sectors minus 1 */
                   1527:             cpu_to_ube32(buf, total_sectors - 1);
                   1528:             cpu_to_ube32(buf + 4, 2048);
                   1529:             ide_atapi_cmd_reply(s, 8, 8);
                   1530:         }
                   1531:         break;
                   1532:     case GPCMD_READ_DVD_STRUCTURE:
                   1533:         {
                   1534:             int media = packet[1];
                   1535:             int format = packet[7];
                   1536:             int ret;
                   1537: 
                   1538:             max_len = ube16_to_cpu(packet + 8);
                   1539: 
                   1540:             if (format < 0xff) {
                   1541:                 if (media_is_cd(s)) {
                   1542:                     ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                   1543:                                         ASC_INCOMPATIBLE_FORMAT);
                   1544:                     break;
                   1545:                 } else if (!media_present(s)) {
                   1546:                     ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                   1547:                                         ASC_INV_FIELD_IN_CMD_PACKET);
                   1548:                     break;
                   1549:                 }
                   1550:             }
                   1551: 
                   1552:             memset(buf, 0, max_len > IDE_DMA_BUF_SECTORS * 512 + 4 ?
                   1553:                    IDE_DMA_BUF_SECTORS * 512 + 4 : max_len);
                   1554: 
                   1555:             switch (format) {
                   1556:                 case 0x00 ... 0x7f:
                   1557:                 case 0xff:
                   1558:                     if (media == 0) {
                   1559:                         ret = ide_dvd_read_structure(s, format, packet, buf);
                   1560: 
                   1561:                         if (ret < 0)
                   1562:                             ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, -ret);
                   1563:                         else
                   1564:                             ide_atapi_cmd_reply(s, ret, max_len);
                   1565: 
                   1566:                         break;
                   1567:                     }
                   1568:                     /* TODO: BD support, fall through for now */
                   1569: 
                   1570:                 /* Generic disk structures */
                   1571:                 case 0x80: /* TODO: AACS volume identifier */
                   1572:                 case 0x81: /* TODO: AACS media serial number */
                   1573:                 case 0x82: /* TODO: AACS media identifier */
                   1574:                 case 0x83: /* TODO: AACS media key block */
                   1575:                 case 0x90: /* TODO: List of recognized format layers */
                   1576:                 case 0xc0: /* TODO: Write protection status */
                   1577:                 default:
                   1578:                     ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                   1579:                                         ASC_INV_FIELD_IN_CMD_PACKET);
                   1580:                     break;
                   1581:             }
                   1582:         }
                   1583:         break;
                   1584:     case GPCMD_SET_SPEED:
                   1585:         ide_atapi_cmd_ok(s);
                   1586:         break;
                   1587:     case GPCMD_INQUIRY:
                   1588:         max_len = packet[4];
                   1589:         buf[0] = 0x05; /* CD-ROM */
                   1590:         buf[1] = 0x80; /* removable */
                   1591:         buf[2] = 0x00; /* ISO */
                   1592:         buf[3] = 0x21; /* ATAPI-2 (XXX: put ATAPI-4 ?) */
                   1593:         buf[4] = 31; /* additional length */
                   1594:         buf[5] = 0; /* reserved */
                   1595:         buf[6] = 0; /* reserved */
                   1596:         buf[7] = 0; /* reserved */
                   1597:         padstr8(buf + 8, 8, "QEMU");
                   1598:         padstr8(buf + 16, 16, "QEMU DVD-ROM");
1.1.1.2   root     1599:         padstr8(buf + 32, 4, s->version);
1.1       root     1600:         ide_atapi_cmd_reply(s, 36, max_len);
                   1601:         break;
                   1602:     case GPCMD_GET_CONFIGURATION:
                   1603:         {
                   1604:             uint32_t len;
                   1605:             uint8_t index = 0;
                   1606: 
                   1607:             /* only feature 0 is supported */
                   1608:             if (packet[2] != 0 || packet[3] != 0) {
                   1609:                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                   1610:                                     ASC_INV_FIELD_IN_CMD_PACKET);
                   1611:                 break;
                   1612:             }
                   1613: 
                   1614:             /* XXX: could result in alignment problems in some architectures */
                   1615:             max_len = ube16_to_cpu(packet + 7);
                   1616: 
                   1617:             /*
                   1618:              * XXX: avoid overflow for io_buffer if max_len is bigger than
                   1619:              *      the size of that buffer (dimensioned to max number of
                   1620:              *      sectors to transfer at once)
                   1621:              *
                   1622:              *      Only a problem if the feature/profiles grow.
                   1623:              */
                   1624:             if (max_len > 512) /* XXX: assume 1 sector */
                   1625:                 max_len = 512;
                   1626: 
                   1627:             memset(buf, 0, max_len);
                   1628:             /* 
                   1629:              * the number of sectors from the media tells us which profile
                   1630:              * to use as current.  0 means there is no media
                   1631:              */
                   1632:             if (media_is_dvd(s))
                   1633:                 cpu_to_ube16(buf + 6, MMC_PROFILE_DVD_ROM);
                   1634:             else if (media_is_cd(s))
                   1635:                 cpu_to_ube16(buf + 6, MMC_PROFILE_CD_ROM);
                   1636: 
                   1637:             buf[10] = 0x02 | 0x01; /* persistent and current */
                   1638:             len = 12; /* headers: 8 + 4 */
                   1639:             len += ide_atapi_set_profile(buf, &index, MMC_PROFILE_DVD_ROM);
                   1640:             len += ide_atapi_set_profile(buf, &index, MMC_PROFILE_CD_ROM);
                   1641:             cpu_to_ube32(buf, len - 4); /* data length */
                   1642: 
                   1643:             ide_atapi_cmd_reply(s, len, max_len);
                   1644:             break;
                   1645:         }
1.1.1.4 ! root     1646:     case GPCMD_GET_EVENT_STATUS_NOTIFICATION:
        !          1647:         max_len = ube16_to_cpu(packet + 7);
        !          1648: 
        !          1649:         if (packet[1] & 0x01) { /* polling */
        !          1650:             /* We don't support any event class (yet). */
        !          1651:             cpu_to_ube16(buf, 0x00); /* No event descriptor returned */
        !          1652:             buf[2] = 0x80;           /* No Event Available (NEA) */
        !          1653:             buf[3] = 0x00;           /* Empty supported event classes */
        !          1654:             ide_atapi_cmd_reply(s, 4, max_len);
        !          1655:         } else { /* asynchronous mode */
        !          1656:             /* Only polling is supported, asynchronous mode is not. */
        !          1657:             ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
        !          1658:                                 ASC_INV_FIELD_IN_CMD_PACKET);
        !          1659:         }
        !          1660:         break;
1.1       root     1661:     default:
                   1662:         ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
                   1663:                             ASC_ILLEGAL_OPCODE);
                   1664:         break;
                   1665:     }
                   1666: }
                   1667: 
                   1668: static void ide_cfata_metadata_inquiry(IDEState *s)
                   1669: {
                   1670:     uint16_t *p;
                   1671:     uint32_t spd;
                   1672: 
                   1673:     p = (uint16_t *) s->io_buffer;
                   1674:     memset(p, 0, 0x200);
                   1675:     spd = ((s->mdata_size - 1) >> 9) + 1;
                   1676: 
                   1677:     put_le16(p + 0, 0x0001);                   /* Data format revision */
                   1678:     put_le16(p + 1, 0x0000);                   /* Media property: silicon */
                   1679:     put_le16(p + 2, s->media_changed);         /* Media status */
                   1680:     put_le16(p + 3, s->mdata_size & 0xffff);   /* Capacity in bytes (low) */
                   1681:     put_le16(p + 4, s->mdata_size >> 16);      /* Capacity in bytes (high) */
                   1682:     put_le16(p + 5, spd & 0xffff);             /* Sectors per device (low) */
                   1683:     put_le16(p + 6, spd >> 16);                        /* Sectors per device (high) */
                   1684: }
                   1685: 
                   1686: static void ide_cfata_metadata_read(IDEState *s)
                   1687: {
                   1688:     uint16_t *p;
                   1689: 
                   1690:     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
                   1691:         s->status = ERR_STAT;
                   1692:         s->error = ABRT_ERR;
                   1693:         return;
                   1694:     }
                   1695: 
                   1696:     p = (uint16_t *) s->io_buffer;
                   1697:     memset(p, 0, 0x200);
                   1698: 
                   1699:     put_le16(p + 0, s->media_changed);         /* Media status */
                   1700:     memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
                   1701:                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
                   1702:                                     s->nsector << 9), 0x200 - 2));
                   1703: }
                   1704: 
                   1705: static void ide_cfata_metadata_write(IDEState *s)
                   1706: {
                   1707:     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
                   1708:         s->status = ERR_STAT;
                   1709:         s->error = ABRT_ERR;
                   1710:         return;
                   1711:     }
                   1712: 
                   1713:     s->media_changed = 0;
                   1714: 
                   1715:     memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
                   1716:                     s->io_buffer + 2,
                   1717:                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
                   1718:                                     s->nsector << 9), 0x200 - 2));
                   1719: }
                   1720: 
                   1721: /* called when the inserted state of the media has changed */
                   1722: static void cdrom_change_cb(void *opaque)
                   1723: {
                   1724:     IDEState *s = opaque;
                   1725:     uint64_t nb_sectors;
                   1726: 
                   1727:     bdrv_get_geometry(s->bs, &nb_sectors);
                   1728:     s->nb_sectors = nb_sectors;
                   1729: 
                   1730:     s->sense_key = SENSE_UNIT_ATTENTION;
                   1731:     s->asc = ASC_MEDIUM_MAY_HAVE_CHANGED;
                   1732:     s->cdrom_changed = 1;
                   1733:     ide_set_irq(s->bus);
                   1734: }
                   1735: 
                   1736: static void ide_cmd_lba48_transform(IDEState *s, int lba48)
                   1737: {
                   1738:     s->lba48 = lba48;
                   1739: 
                   1740:     /* handle the 'magic' 0 nsector count conversion here. to avoid
                   1741:      * fiddling with the rest of the read logic, we just store the
                   1742:      * full sector count in ->nsector and ignore ->hob_nsector from now
                   1743:      */
                   1744:     if (!s->lba48) {
                   1745:        if (!s->nsector)
                   1746:            s->nsector = 256;
                   1747:     } else {
                   1748:        if (!s->nsector && !s->hob_nsector)
                   1749:            s->nsector = 65536;
                   1750:        else {
                   1751:            int lo = s->nsector;
                   1752:            int hi = s->hob_nsector;
                   1753: 
                   1754:            s->nsector = (hi << 8) | lo;
                   1755:        }
                   1756:     }
                   1757: }
                   1758: 
                   1759: static void ide_clear_hob(IDEBus *bus)
                   1760: {
                   1761:     /* any write clears HOB high bit of device control register */
                   1762:     bus->ifs[0].select &= ~(1 << 7);
                   1763:     bus->ifs[1].select &= ~(1 << 7);
                   1764: }
                   1765: 
                   1766: void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
                   1767: {
                   1768:     IDEBus *bus = opaque;
                   1769:     IDEState *s;
                   1770:     int n;
                   1771:     int lba48 = 0;
                   1772: 
                   1773: #ifdef DEBUG_IDE
                   1774:     printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
                   1775: #endif
                   1776: 
                   1777:     addr &= 7;
                   1778: 
                   1779:     /* ignore writes to command block while busy with previous command */
                   1780:     if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
                   1781:         return;
                   1782: 
                   1783:     switch(addr) {
                   1784:     case 0:
                   1785:         break;
                   1786:     case 1:
                   1787:        ide_clear_hob(bus);
                   1788:         /* NOTE: data is written to the two drives */
                   1789:        bus->ifs[0].hob_feature = bus->ifs[0].feature;
                   1790:        bus->ifs[1].hob_feature = bus->ifs[1].feature;
                   1791:         bus->ifs[0].feature = val;
                   1792:         bus->ifs[1].feature = val;
                   1793:         break;
                   1794:     case 2:
                   1795:        ide_clear_hob(bus);
                   1796:        bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
                   1797:        bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
                   1798:         bus->ifs[0].nsector = val;
                   1799:         bus->ifs[1].nsector = val;
                   1800:         break;
                   1801:     case 3:
                   1802:        ide_clear_hob(bus);
                   1803:        bus->ifs[0].hob_sector = bus->ifs[0].sector;
                   1804:        bus->ifs[1].hob_sector = bus->ifs[1].sector;
                   1805:         bus->ifs[0].sector = val;
                   1806:         bus->ifs[1].sector = val;
                   1807:         break;
                   1808:     case 4:
                   1809:        ide_clear_hob(bus);
                   1810:        bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
                   1811:        bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
                   1812:         bus->ifs[0].lcyl = val;
                   1813:         bus->ifs[1].lcyl = val;
                   1814:         break;
                   1815:     case 5:
                   1816:        ide_clear_hob(bus);
                   1817:        bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
                   1818:        bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
                   1819:         bus->ifs[0].hcyl = val;
                   1820:         bus->ifs[1].hcyl = val;
                   1821:         break;
                   1822:     case 6:
                   1823:        /* FIXME: HOB readback uses bit 7 */
                   1824:         bus->ifs[0].select = (val & ~0x10) | 0xa0;
                   1825:         bus->ifs[1].select = (val | 0x10) | 0xa0;
                   1826:         /* select drive */
                   1827:         bus->unit = (val >> 4) & 1;
                   1828:         break;
                   1829:     default:
                   1830:     case 7:
                   1831:         /* command */
                   1832: #if defined(DEBUG_IDE)
                   1833:         printf("ide: CMD=%02x\n", val);
                   1834: #endif
                   1835:         s = idebus_active_if(bus);
                   1836:         /* ignore commands to non existant slave */
                   1837:         if (s != bus->ifs && !s->bs)
                   1838:             break;
                   1839: 
                   1840:         /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
                   1841:         if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
                   1842:             break;
                   1843: 
                   1844:         switch(val) {
                   1845:         case WIN_IDENTIFY:
1.1.1.4 ! root     1846:             if (s->bs && s->drive_kind != IDE_CD) {
        !          1847:                 if (s->drive_kind != IDE_CFATA)
1.1       root     1848:                     ide_identify(s);
                   1849:                 else
                   1850:                     ide_cfata_identify(s);
                   1851:                 s->status = READY_STAT | SEEK_STAT;
                   1852:                 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
                   1853:             } else {
1.1.1.4 ! root     1854:                 if (s->drive_kind == IDE_CD) {
1.1       root     1855:                     ide_set_signature(s);
                   1856:                 }
                   1857:                 ide_abort_command(s);
                   1858:             }
                   1859:             ide_set_irq(s->bus);
                   1860:             break;
                   1861:         case WIN_SPECIFY:
                   1862:         case WIN_RECAL:
                   1863:             s->error = 0;
                   1864:             s->status = READY_STAT | SEEK_STAT;
                   1865:             ide_set_irq(s->bus);
                   1866:             break;
                   1867:         case WIN_SETMULT:
1.1.1.4 ! root     1868:             if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1.1       root     1869:                 /* Disable Read and Write Multiple */
                   1870:                 s->mult_sectors = 0;
                   1871:                 s->status = READY_STAT | SEEK_STAT;
                   1872:             } else if ((s->nsector & 0xff) != 0 &&
                   1873:                 ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
                   1874:                  (s->nsector & (s->nsector - 1)) != 0)) {
                   1875:                 ide_abort_command(s);
                   1876:             } else {
                   1877:                 s->mult_sectors = s->nsector & 0xff;
                   1878:                 s->status = READY_STAT | SEEK_STAT;
                   1879:             }
                   1880:             ide_set_irq(s->bus);
                   1881:             break;
                   1882:         case WIN_VERIFY_EXT:
                   1883:            lba48 = 1;
                   1884:         case WIN_VERIFY:
                   1885:         case WIN_VERIFY_ONCE:
                   1886:             /* do sector number check ? */
                   1887:            ide_cmd_lba48_transform(s, lba48);
                   1888:             s->status = READY_STAT | SEEK_STAT;
                   1889:             ide_set_irq(s->bus);
                   1890:             break;
                   1891:        case WIN_READ_EXT:
                   1892:            lba48 = 1;
                   1893:         case WIN_READ:
                   1894:         case WIN_READ_ONCE:
                   1895:             if (!s->bs)
                   1896:                 goto abort_cmd;
                   1897:            ide_cmd_lba48_transform(s, lba48);
                   1898:             s->req_nb_sectors = 1;
                   1899:             ide_sector_read(s);
                   1900:             break;
                   1901:        case WIN_WRITE_EXT:
                   1902:            lba48 = 1;
                   1903:         case WIN_WRITE:
                   1904:         case WIN_WRITE_ONCE:
                   1905:         case CFA_WRITE_SECT_WO_ERASE:
                   1906:         case WIN_WRITE_VERIFY:
                   1907:            ide_cmd_lba48_transform(s, lba48);
                   1908:             s->error = 0;
                   1909:             s->status = SEEK_STAT | READY_STAT;
                   1910:             s->req_nb_sectors = 1;
                   1911:             ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
                   1912:             s->media_changed = 1;
                   1913:             break;
                   1914:        case WIN_MULTREAD_EXT:
                   1915:            lba48 = 1;
                   1916:         case WIN_MULTREAD:
                   1917:             if (!s->mult_sectors)
                   1918:                 goto abort_cmd;
                   1919:            ide_cmd_lba48_transform(s, lba48);
                   1920:             s->req_nb_sectors = s->mult_sectors;
                   1921:             ide_sector_read(s);
                   1922:             break;
                   1923:         case WIN_MULTWRITE_EXT:
                   1924:            lba48 = 1;
                   1925:         case WIN_MULTWRITE:
                   1926:         case CFA_WRITE_MULTI_WO_ERASE:
                   1927:             if (!s->mult_sectors)
                   1928:                 goto abort_cmd;
                   1929:            ide_cmd_lba48_transform(s, lba48);
                   1930:             s->error = 0;
                   1931:             s->status = SEEK_STAT | READY_STAT;
                   1932:             s->req_nb_sectors = s->mult_sectors;
                   1933:             n = s->nsector;
                   1934:             if (n > s->req_nb_sectors)
                   1935:                 n = s->req_nb_sectors;
                   1936:             ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
                   1937:             s->media_changed = 1;
                   1938:             break;
                   1939:        case WIN_READDMA_EXT:
                   1940:            lba48 = 1;
                   1941:         case WIN_READDMA:
                   1942:         case WIN_READDMA_ONCE:
                   1943:             if (!s->bs)
                   1944:                 goto abort_cmd;
                   1945:            ide_cmd_lba48_transform(s, lba48);
                   1946:             ide_sector_read_dma(s);
                   1947:             break;
                   1948:        case WIN_WRITEDMA_EXT:
                   1949:            lba48 = 1;
                   1950:         case WIN_WRITEDMA:
                   1951:         case WIN_WRITEDMA_ONCE:
                   1952:             if (!s->bs)
                   1953:                 goto abort_cmd;
                   1954:            ide_cmd_lba48_transform(s, lba48);
                   1955:             ide_sector_write_dma(s);
                   1956:             s->media_changed = 1;
                   1957:             break;
                   1958:         case WIN_READ_NATIVE_MAX_EXT:
                   1959:            lba48 = 1;
                   1960:         case WIN_READ_NATIVE_MAX:
                   1961:            ide_cmd_lba48_transform(s, lba48);
                   1962:             ide_set_sector(s, s->nb_sectors - 1);
                   1963:             s->status = READY_STAT | SEEK_STAT;
                   1964:             ide_set_irq(s->bus);
                   1965:             break;
                   1966:         case WIN_CHECKPOWERMODE1:
                   1967:         case WIN_CHECKPOWERMODE2:
                   1968:             s->nsector = 0xff; /* device active or idle */
                   1969:             s->status = READY_STAT | SEEK_STAT;
                   1970:             ide_set_irq(s->bus);
                   1971:             break;
                   1972:         case WIN_SETFEATURES:
                   1973:             if (!s->bs)
                   1974:                 goto abort_cmd;
                   1975:             /* XXX: valid for CDROM ? */
                   1976:             switch(s->feature) {
                   1977:             case 0xcc: /* reverting to power-on defaults enable */
                   1978:             case 0x66: /* reverting to power-on defaults disable */
                   1979:             case 0x02: /* write cache enable */
                   1980:             case 0x82: /* write cache disable */
                   1981:             case 0xaa: /* read look-ahead enable */
                   1982:             case 0x55: /* read look-ahead disable */
                   1983:             case 0x05: /* set advanced power management mode */
                   1984:             case 0x85: /* disable advanced power management mode */
                   1985:             case 0x69: /* NOP */
                   1986:             case 0x67: /* NOP */
                   1987:             case 0x96: /* NOP */
                   1988:             case 0x9a: /* NOP */
                   1989:             case 0x42: /* enable Automatic Acoustic Mode */
                   1990:             case 0xc2: /* disable Automatic Acoustic Mode */
                   1991:                 s->status = READY_STAT | SEEK_STAT;
                   1992:                 ide_set_irq(s->bus);
                   1993:                 break;
                   1994:             case 0x03: { /* set transfer mode */
                   1995:                uint8_t val = s->nsector & 0x07;
                   1996:                 uint16_t *identify_data = (uint16_t *)s->identify_data;
                   1997: 
                   1998:                switch (s->nsector >> 3) {
                   1999:                    case 0x00: /* pio default */
                   2000:                    case 0x01: /* pio mode */
                   2001:                        put_le16(identify_data + 62,0x07);
                   2002:                        put_le16(identify_data + 63,0x07);
                   2003:                        put_le16(identify_data + 88,0x3f);
                   2004:                        break;
                   2005:                     case 0x02: /* sigle word dma mode*/
                   2006:                        put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
                   2007:                        put_le16(identify_data + 63,0x07);
                   2008:                        put_le16(identify_data + 88,0x3f);
                   2009:                        break;
                   2010:                    case 0x04: /* mdma mode */
                   2011:                        put_le16(identify_data + 62,0x07);
                   2012:                        put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
                   2013:                        put_le16(identify_data + 88,0x3f);
                   2014:                        break;
                   2015:                    case 0x08: /* udma mode */
                   2016:                        put_le16(identify_data + 62,0x07);
                   2017:                        put_le16(identify_data + 63,0x07);
                   2018:                        put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
                   2019:                        break;
                   2020:                    default:
                   2021:                        goto abort_cmd;
                   2022:                }
                   2023:                 s->status = READY_STAT | SEEK_STAT;
                   2024:                 ide_set_irq(s->bus);
                   2025:                 break;
                   2026:            }
                   2027:             default:
                   2028:                 goto abort_cmd;
                   2029:             }
                   2030:             break;
                   2031:         case WIN_FLUSH_CACHE:
                   2032:         case WIN_FLUSH_CACHE_EXT:
                   2033:             if (s->bs)
                   2034:                 bdrv_aio_flush(s->bs, ide_flush_cb, s);
                   2035:             else
                   2036:                 ide_flush_cb(s, 0);
                   2037:             break;
                   2038:         case WIN_STANDBY:
                   2039:         case WIN_STANDBY2:
                   2040:         case WIN_STANDBYNOW1:
                   2041:         case WIN_STANDBYNOW2:
                   2042:         case WIN_IDLEIMMEDIATE:
                   2043:         case CFA_IDLEIMMEDIATE:
                   2044:         case WIN_SETIDLE1:
                   2045:         case WIN_SETIDLE2:
                   2046:         case WIN_SLEEPNOW1:
                   2047:         case WIN_SLEEPNOW2:
                   2048:             s->status = READY_STAT;
                   2049:             ide_set_irq(s->bus);
                   2050:             break;
                   2051:         case WIN_SEEK:
1.1.1.4 ! root     2052:             if(s->drive_kind == IDE_CD)
1.1       root     2053:                 goto abort_cmd;
                   2054:             /* XXX: Check that seek is within bounds */
                   2055:             s->status = READY_STAT | SEEK_STAT;
                   2056:             ide_set_irq(s->bus);
                   2057:             break;
                   2058:             /* ATAPI commands */
                   2059:         case WIN_PIDENTIFY:
1.1.1.4 ! root     2060:             if (s->drive_kind == IDE_CD) {
1.1       root     2061:                 ide_atapi_identify(s);
                   2062:                 s->status = READY_STAT | SEEK_STAT;
                   2063:                 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
                   2064:             } else {
                   2065:                 ide_abort_command(s);
                   2066:             }
                   2067:             ide_set_irq(s->bus);
                   2068:             break;
                   2069:         case WIN_DIAGNOSE:
                   2070:             ide_set_signature(s);
1.1.1.4 ! root     2071:             if (s->drive_kind == IDE_CD)
1.1       root     2072:                 s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
                   2073:                                 * devices to return a clear status register
                   2074:                                 * with READY_STAT *not* set. */
                   2075:             else
                   2076:                 s->status = READY_STAT | SEEK_STAT;
                   2077:             s->error = 0x01; /* Device 0 passed, Device 1 passed or not
                   2078:                               * present. 
                   2079:                               */
                   2080:             ide_set_irq(s->bus);
                   2081:             break;
                   2082:         case WIN_SRST:
1.1.1.4 ! root     2083:             if (s->drive_kind != IDE_CD)
1.1       root     2084:                 goto abort_cmd;
                   2085:             ide_set_signature(s);
                   2086:             s->status = 0x00; /* NOTE: READY is _not_ set */
                   2087:             s->error = 0x01;
                   2088:             break;
                   2089:         case WIN_PACKETCMD:
1.1.1.4 ! root     2090:             if (s->drive_kind != IDE_CD)
1.1       root     2091:                 goto abort_cmd;
                   2092:             /* overlapping commands not supported */
                   2093:             if (s->feature & 0x02)
                   2094:                 goto abort_cmd;
                   2095:             s->status = READY_STAT | SEEK_STAT;
                   2096:             s->atapi_dma = s->feature & 1;
                   2097:             s->nsector = 1;
                   2098:             ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
                   2099:                                ide_atapi_cmd);
                   2100:             break;
                   2101:         /* CF-ATA commands */
                   2102:         case CFA_REQ_EXT_ERROR_CODE:
1.1.1.4 ! root     2103:             if (s->drive_kind != IDE_CFATA)
1.1       root     2104:                 goto abort_cmd;
                   2105:             s->error = 0x09;    /* miscellaneous error */
                   2106:             s->status = READY_STAT | SEEK_STAT;
                   2107:             ide_set_irq(s->bus);
                   2108:             break;
                   2109:         case CFA_ERASE_SECTORS:
                   2110:         case CFA_WEAR_LEVEL:
1.1.1.4 ! root     2111:             if (s->drive_kind != IDE_CFATA)
1.1       root     2112:                 goto abort_cmd;
                   2113:             if (val == CFA_WEAR_LEVEL)
                   2114:                 s->nsector = 0;
                   2115:             if (val == CFA_ERASE_SECTORS)
                   2116:                 s->media_changed = 1;
                   2117:             s->error = 0x00;
                   2118:             s->status = READY_STAT | SEEK_STAT;
                   2119:             ide_set_irq(s->bus);
                   2120:             break;
                   2121:         case CFA_TRANSLATE_SECTOR:
1.1.1.4 ! root     2122:             if (s->drive_kind != IDE_CFATA)
1.1       root     2123:                 goto abort_cmd;
                   2124:             s->error = 0x00;
                   2125:             s->status = READY_STAT | SEEK_STAT;
                   2126:             memset(s->io_buffer, 0, 0x200);
                   2127:             s->io_buffer[0x00] = s->hcyl;                      /* Cyl MSB */
                   2128:             s->io_buffer[0x01] = s->lcyl;                      /* Cyl LSB */
                   2129:             s->io_buffer[0x02] = s->select;                    /* Head */
                   2130:             s->io_buffer[0x03] = s->sector;                    /* Sector */
                   2131:             s->io_buffer[0x04] = ide_get_sector(s) >> 16;      /* LBA MSB */
                   2132:             s->io_buffer[0x05] = ide_get_sector(s) >> 8;       /* LBA */
                   2133:             s->io_buffer[0x06] = ide_get_sector(s) >> 0;       /* LBA LSB */
                   2134:             s->io_buffer[0x13] = 0x00;                         /* Erase flag */
                   2135:             s->io_buffer[0x18] = 0x00;                         /* Hot count */
                   2136:             s->io_buffer[0x19] = 0x00;                         /* Hot count */
                   2137:             s->io_buffer[0x1a] = 0x01;                         /* Hot count */
                   2138:             ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
                   2139:             ide_set_irq(s->bus);
                   2140:             break;
                   2141:         case CFA_ACCESS_METADATA_STORAGE:
1.1.1.4 ! root     2142:             if (s->drive_kind != IDE_CFATA)
1.1       root     2143:                 goto abort_cmd;
                   2144:             switch (s->feature) {
                   2145:             case 0x02: /* Inquiry Metadata Storage */
                   2146:                 ide_cfata_metadata_inquiry(s);
                   2147:                 break;
                   2148:             case 0x03: /* Read Metadata Storage */
                   2149:                 ide_cfata_metadata_read(s);
                   2150:                 break;
                   2151:             case 0x04: /* Write Metadata Storage */
                   2152:                 ide_cfata_metadata_write(s);
                   2153:                 break;
                   2154:             default:
                   2155:                 goto abort_cmd;
                   2156:             }
                   2157:             ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
                   2158:             s->status = 0x00; /* NOTE: READY is _not_ set */
                   2159:             ide_set_irq(s->bus);
                   2160:             break;
                   2161:         case IBM_SENSE_CONDITION:
1.1.1.4 ! root     2162:             if (s->drive_kind != IDE_CFATA)
1.1       root     2163:                 goto abort_cmd;
                   2164:             switch (s->feature) {
                   2165:             case 0x01:  /* sense temperature in device */
                   2166:                 s->nsector = 0x50;      /* +20 C */
                   2167:                 break;
                   2168:             default:
                   2169:                 goto abort_cmd;
                   2170:             }
                   2171:             s->status = READY_STAT | SEEK_STAT;
                   2172:             ide_set_irq(s->bus);
                   2173:             break;
                   2174: 
                   2175:        case WIN_SMART:
1.1.1.4 ! root     2176:            if (s->drive_kind == IDE_CD)
1.1       root     2177:                goto abort_cmd;
                   2178:            if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
                   2179:                goto abort_cmd;
                   2180:            if (!s->smart_enabled && s->feature != SMART_ENABLE)
                   2181:                goto abort_cmd;
                   2182:            switch (s->feature) {
                   2183:            case SMART_DISABLE:
                   2184:                s->smart_enabled = 0;
                   2185:                s->status = READY_STAT | SEEK_STAT;
                   2186:                ide_set_irq(s->bus);
                   2187:                break;
                   2188:            case SMART_ENABLE:
                   2189:                s->smart_enabled = 1;
                   2190:                s->status = READY_STAT | SEEK_STAT;
                   2191:                ide_set_irq(s->bus);
                   2192:                break;
                   2193:            case SMART_ATTR_AUTOSAVE:
                   2194:                switch (s->sector) {
                   2195:                case 0x00:
                   2196:                    s->smart_autosave = 0;
                   2197:                    break;
                   2198:                case 0xf1:
                   2199:                    s->smart_autosave = 1;
                   2200:                    break;
                   2201:                default:
                   2202:                    goto abort_cmd;
                   2203:                }
                   2204:                s->status = READY_STAT | SEEK_STAT;
                   2205:                ide_set_irq(s->bus);
                   2206:                break;
                   2207:            case SMART_STATUS:
                   2208:                if (!s->smart_errors) {
                   2209:                    s->hcyl = 0xc2;
                   2210:                    s->lcyl = 0x4f;
                   2211:                } else {
                   2212:                    s->hcyl = 0x2c;
                   2213:                    s->lcyl = 0xf4;
                   2214:                }
                   2215:                s->status = READY_STAT | SEEK_STAT;
                   2216:                ide_set_irq(s->bus);
                   2217:                break;
                   2218:            case SMART_READ_THRESH:
                   2219:                memset(s->io_buffer, 0, 0x200);
                   2220:                s->io_buffer[0] = 0x01; /* smart struct version */
                   2221:                for (n=0; n<30; n++) {
                   2222:                    if (smart_attributes[n][0] == 0)
                   2223:                        break;
                   2224:                    s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
                   2225:                    s->io_buffer[2+1+(n*12)] = smart_attributes[n][4];
                   2226:                }
                   2227:                for (n=0; n<511; n++) /* checksum */
                   2228:                    s->io_buffer[511] += s->io_buffer[n];
                   2229:                s->io_buffer[511] = 0x100 - s->io_buffer[511];
                   2230:                s->status = READY_STAT | SEEK_STAT;
                   2231:                ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
                   2232:                ide_set_irq(s->bus);
                   2233:                break;
                   2234:            case SMART_READ_DATA:
                   2235:                memset(s->io_buffer, 0, 0x200);
                   2236:                s->io_buffer[0] = 0x01; /* smart struct version */
                   2237:                for (n=0; n<30; n++) {
                   2238:                    if (smart_attributes[n][0] == 0)
                   2239:                        break;
                   2240:                    s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
                   2241:                    s->io_buffer[2+1+(n*12)] = smart_attributes[n][1];
                   2242:                    s->io_buffer[2+3+(n*12)] = smart_attributes[n][2];
                   2243:                    s->io_buffer[2+4+(n*12)] = smart_attributes[n][3];
                   2244:                }
                   2245:                s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
                   2246:                if (s->smart_selftest_count == 0) {
                   2247:                    s->io_buffer[363] = 0;
                   2248:                } else {
                   2249:                    s->io_buffer[363] = 
                   2250:                        s->smart_selftest_data[3 + 
                   2251:                                               (s->smart_selftest_count - 1) * 
                   2252:                                               24];
                   2253:                }
                   2254:                s->io_buffer[364] = 0x20; 
                   2255:                s->io_buffer[365] = 0x01; 
                   2256:                /* offline data collection capacity: execute + self-test*/
                   2257:                s->io_buffer[367] = (1<<4 | 1<<3 | 1); 
                   2258:                s->io_buffer[368] = 0x03; /* smart capability (1) */
                   2259:                s->io_buffer[369] = 0x00; /* smart capability (2) */
                   2260:                s->io_buffer[370] = 0x01; /* error logging supported */
                   2261:                s->io_buffer[372] = 0x02; /* minutes for poll short test */
                   2262:                s->io_buffer[373] = 0x36; /* minutes for poll ext test */
                   2263:                s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
                   2264: 
                   2265:                for (n=0; n<511; n++) 
                   2266:                    s->io_buffer[511] += s->io_buffer[n];
                   2267:                s->io_buffer[511] = 0x100 - s->io_buffer[511];
                   2268:                s->status = READY_STAT | SEEK_STAT;
                   2269:                ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
                   2270:                ide_set_irq(s->bus);
                   2271:                break;
                   2272:            case SMART_READ_LOG:
                   2273:                switch (s->sector) {
                   2274:                case 0x01: /* summary smart error log */
                   2275:                    memset(s->io_buffer, 0, 0x200);
                   2276:                    s->io_buffer[0] = 0x01;
                   2277:                    s->io_buffer[1] = 0x00; /* no error entries */
                   2278:                    s->io_buffer[452] = s->smart_errors & 0xff;
                   2279:                    s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
                   2280: 
                   2281:                    for (n=0; n<511; n++)
                   2282:                        s->io_buffer[511] += s->io_buffer[n];
                   2283:                    s->io_buffer[511] = 0x100 - s->io_buffer[511];
                   2284:                    break;
                   2285:                case 0x06: /* smart self test log */
                   2286:                    memset(s->io_buffer, 0, 0x200);
                   2287:                    s->io_buffer[0] = 0x01; 
                   2288:                    if (s->smart_selftest_count == 0) {
                   2289:                        s->io_buffer[508] = 0;
                   2290:                    } else {
                   2291:                        s->io_buffer[508] = s->smart_selftest_count;
                   2292:                        for (n=2; n<506; n++) 
                   2293:                            s->io_buffer[n] = s->smart_selftest_data[n];
                   2294:                    }               
                   2295:                    for (n=0; n<511; n++)
                   2296:                        s->io_buffer[511] += s->io_buffer[n];
                   2297:                    s->io_buffer[511] = 0x100 - s->io_buffer[511];
                   2298:                    break;
                   2299:                default:
                   2300:                    goto abort_cmd;
                   2301:                }
                   2302:                s->status = READY_STAT | SEEK_STAT;
                   2303:                ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
                   2304:                ide_set_irq(s->bus);
                   2305:                break;
                   2306:            case SMART_EXECUTE_OFFLINE:
                   2307:                switch (s->sector) {
                   2308:                case 0: /* off-line routine */
                   2309:                case 1: /* short self test */
                   2310:                case 2: /* extended self test */
                   2311:                    s->smart_selftest_count++;
                   2312:                    if(s->smart_selftest_count > 21)
                   2313:                        s->smart_selftest_count = 0;
                   2314:                    n = 2 + (s->smart_selftest_count - 1) * 24;
                   2315:                    s->smart_selftest_data[n] = s->sector;
                   2316:                    s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
                   2317:                    s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
                   2318:                    s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
                   2319:                    s->status = READY_STAT | SEEK_STAT;
                   2320:                    ide_set_irq(s->bus);
                   2321:                    break;
                   2322:                default:
                   2323:                    goto abort_cmd;
                   2324:                }
                   2325:                break;
                   2326:            default:
                   2327:                goto abort_cmd;
                   2328:            }
                   2329:            break;
                   2330:         default:
                   2331:         abort_cmd:
                   2332:             ide_abort_command(s);
                   2333:             ide_set_irq(s->bus);
                   2334:             break;
                   2335:         }
                   2336:     }
                   2337: }
                   2338: 
                   2339: uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
                   2340: {
                   2341:     IDEBus *bus = opaque;
                   2342:     IDEState *s = idebus_active_if(bus);
                   2343:     uint32_t addr;
                   2344:     int ret, hob;
                   2345: 
                   2346:     addr = addr1 & 7;
                   2347:     /* FIXME: HOB readback uses bit 7, but it's always set right now */
                   2348:     //hob = s->select & (1 << 7);
                   2349:     hob = 0;
                   2350:     switch(addr) {
                   2351:     case 0:
                   2352:         ret = 0xff;
                   2353:         break;
                   2354:     case 1:
                   2355:         if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
                   2356:             (s != bus->ifs && !s->bs))
                   2357:             ret = 0;
                   2358:         else if (!hob)
                   2359:             ret = s->error;
                   2360:        else
                   2361:            ret = s->hob_feature;
                   2362:         break;
                   2363:     case 2:
                   2364:         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
                   2365:             ret = 0;
                   2366:         else if (!hob)
                   2367:             ret = s->nsector & 0xff;
                   2368:        else
                   2369:            ret = s->hob_nsector;
                   2370:         break;
                   2371:     case 3:
                   2372:         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
                   2373:             ret = 0;
                   2374:         else if (!hob)
                   2375:             ret = s->sector;
                   2376:        else
                   2377:            ret = s->hob_sector;
                   2378:         break;
                   2379:     case 4:
                   2380:         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
                   2381:             ret = 0;
                   2382:         else if (!hob)
                   2383:             ret = s->lcyl;
                   2384:        else
                   2385:            ret = s->hob_lcyl;
                   2386:         break;
                   2387:     case 5:
                   2388:         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
                   2389:             ret = 0;
                   2390:         else if (!hob)
                   2391:             ret = s->hcyl;
                   2392:        else
                   2393:            ret = s->hob_hcyl;
                   2394:         break;
                   2395:     case 6:
                   2396:         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
                   2397:             ret = 0;
                   2398:         else
                   2399:             ret = s->select;
                   2400:         break;
                   2401:     default:
                   2402:     case 7:
                   2403:         if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
                   2404:             (s != bus->ifs && !s->bs))
                   2405:             ret = 0;
                   2406:         else
                   2407:             ret = s->status;
                   2408:         qemu_irq_lower(bus->irq);
                   2409:         break;
                   2410:     }
                   2411: #ifdef DEBUG_IDE
                   2412:     printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
                   2413: #endif
                   2414:     return ret;
                   2415: }
                   2416: 
                   2417: uint32_t ide_status_read(void *opaque, uint32_t addr)
                   2418: {
                   2419:     IDEBus *bus = opaque;
                   2420:     IDEState *s = idebus_active_if(bus);
                   2421:     int ret;
                   2422: 
                   2423:     if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
                   2424:         (s != bus->ifs && !s->bs))
                   2425:         ret = 0;
                   2426:     else
                   2427:         ret = s->status;
                   2428: #ifdef DEBUG_IDE
                   2429:     printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
                   2430: #endif
                   2431:     return ret;
                   2432: }
                   2433: 
                   2434: void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
                   2435: {
                   2436:     IDEBus *bus = opaque;
                   2437:     IDEState *s;
                   2438:     int i;
                   2439: 
                   2440: #ifdef DEBUG_IDE
                   2441:     printf("ide: write control addr=0x%x val=%02x\n", addr, val);
                   2442: #endif
                   2443:     /* common for both drives */
                   2444:     if (!(bus->cmd & IDE_CMD_RESET) &&
                   2445:         (val & IDE_CMD_RESET)) {
                   2446:         /* reset low to high */
                   2447:         for(i = 0;i < 2; i++) {
                   2448:             s = &bus->ifs[i];
                   2449:             s->status = BUSY_STAT | SEEK_STAT;
                   2450:             s->error = 0x01;
                   2451:         }
                   2452:     } else if ((bus->cmd & IDE_CMD_RESET) &&
                   2453:                !(val & IDE_CMD_RESET)) {
                   2454:         /* high to low */
                   2455:         for(i = 0;i < 2; i++) {
                   2456:             s = &bus->ifs[i];
1.1.1.4 ! root     2457:             if (s->drive_kind == IDE_CD)
1.1       root     2458:                 s->status = 0x00; /* NOTE: READY is _not_ set */
                   2459:             else
                   2460:                 s->status = READY_STAT | SEEK_STAT;
                   2461:             ide_set_signature(s);
                   2462:         }
                   2463:     }
                   2464: 
                   2465:     bus->cmd = val;
                   2466: }
                   2467: 
                   2468: void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
                   2469: {
                   2470:     IDEBus *bus = opaque;
                   2471:     IDEState *s = idebus_active_if(bus);
                   2472:     uint8_t *p;
                   2473: 
                   2474:     /* PIO data access allowed only when DRQ bit is set */
                   2475:     if (!(s->status & DRQ_STAT))
                   2476:         return;
                   2477: 
                   2478:     p = s->data_ptr;
                   2479:     *(uint16_t *)p = le16_to_cpu(val);
                   2480:     p += 2;
                   2481:     s->data_ptr = p;
                   2482:     if (p >= s->data_end)
                   2483:         s->end_transfer_func(s);
                   2484: }
                   2485: 
                   2486: uint32_t ide_data_readw(void *opaque, uint32_t addr)
                   2487: {
                   2488:     IDEBus *bus = opaque;
                   2489:     IDEState *s = idebus_active_if(bus);
                   2490:     uint8_t *p;
                   2491:     int ret;
                   2492: 
                   2493:     /* PIO data access allowed only when DRQ bit is set */
                   2494:     if (!(s->status & DRQ_STAT))
                   2495:         return 0;
                   2496: 
                   2497:     p = s->data_ptr;
                   2498:     ret = cpu_to_le16(*(uint16_t *)p);
                   2499:     p += 2;
                   2500:     s->data_ptr = p;
                   2501:     if (p >= s->data_end)
                   2502:         s->end_transfer_func(s);
                   2503:     return ret;
                   2504: }
                   2505: 
                   2506: void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
                   2507: {
                   2508:     IDEBus *bus = opaque;
                   2509:     IDEState *s = idebus_active_if(bus);
                   2510:     uint8_t *p;
                   2511: 
                   2512:     /* PIO data access allowed only when DRQ bit is set */
                   2513:     if (!(s->status & DRQ_STAT))
                   2514:         return;
                   2515: 
                   2516:     p = s->data_ptr;
                   2517:     *(uint32_t *)p = le32_to_cpu(val);
                   2518:     p += 4;
                   2519:     s->data_ptr = p;
                   2520:     if (p >= s->data_end)
                   2521:         s->end_transfer_func(s);
                   2522: }
                   2523: 
                   2524: uint32_t ide_data_readl(void *opaque, uint32_t addr)
                   2525: {
                   2526:     IDEBus *bus = opaque;
                   2527:     IDEState *s = idebus_active_if(bus);
                   2528:     uint8_t *p;
                   2529:     int ret;
                   2530: 
                   2531:     /* PIO data access allowed only when DRQ bit is set */
                   2532:     if (!(s->status & DRQ_STAT))
                   2533:         return 0;
                   2534: 
                   2535:     p = s->data_ptr;
                   2536:     ret = cpu_to_le32(*(uint32_t *)p);
                   2537:     p += 4;
                   2538:     s->data_ptr = p;
                   2539:     if (p >= s->data_end)
                   2540:         s->end_transfer_func(s);
                   2541:     return ret;
                   2542: }
                   2543: 
                   2544: static void ide_dummy_transfer_stop(IDEState *s)
                   2545: {
                   2546:     s->data_ptr = s->io_buffer;
                   2547:     s->data_end = s->io_buffer;
                   2548:     s->io_buffer[0] = 0xff;
                   2549:     s->io_buffer[1] = 0xff;
                   2550:     s->io_buffer[2] = 0xff;
                   2551:     s->io_buffer[3] = 0xff;
                   2552: }
                   2553: 
                   2554: static void ide_reset(IDEState *s)
                   2555: {
                   2556: #ifdef DEBUG_IDE
                   2557:     printf("ide: reset\n");
                   2558: #endif
1.1.1.4 ! root     2559:     if (s->drive_kind == IDE_CFATA)
1.1       root     2560:         s->mult_sectors = 0;
                   2561:     else
                   2562:         s->mult_sectors = MAX_MULT_SECTORS;
                   2563:     /* ide regs */
                   2564:     s->feature = 0;
                   2565:     s->error = 0;
                   2566:     s->nsector = 0;
                   2567:     s->sector = 0;
                   2568:     s->lcyl = 0;
                   2569:     s->hcyl = 0;
                   2570: 
                   2571:     /* lba48 */
                   2572:     s->hob_feature = 0;
                   2573:     s->hob_sector = 0;
                   2574:     s->hob_nsector = 0;
                   2575:     s->hob_lcyl = 0;
                   2576:     s->hob_hcyl = 0;
                   2577: 
                   2578:     s->select = 0xa0;
                   2579:     s->status = READY_STAT | SEEK_STAT;
                   2580: 
                   2581:     s->lba48 = 0;
                   2582: 
                   2583:     /* ATAPI specific */
                   2584:     s->sense_key = 0;
                   2585:     s->asc = 0;
                   2586:     s->cdrom_changed = 0;
                   2587:     s->packet_transfer_size = 0;
                   2588:     s->elementary_transfer_size = 0;
                   2589:     s->io_buffer_index = 0;
                   2590:     s->cd_sector_size = 0;
                   2591:     s->atapi_dma = 0;
                   2592:     /* ATA DMA state */
                   2593:     s->io_buffer_size = 0;
                   2594:     s->req_nb_sectors = 0;
                   2595: 
                   2596:     ide_set_signature(s);
                   2597:     /* init the transfer handler so that 0xffff is returned on data
                   2598:        accesses */
                   2599:     s->end_transfer_func = ide_dummy_transfer_stop;
                   2600:     ide_dummy_transfer_stop(s);
                   2601:     s->media_changed = 0;
                   2602: }
                   2603: 
                   2604: void ide_bus_reset(IDEBus *bus)
                   2605: {
                   2606:     bus->unit = 0;
                   2607:     bus->cmd = 0;
                   2608:     ide_reset(&bus->ifs[0]);
                   2609:     ide_reset(&bus->ifs[1]);
                   2610:     ide_clear_hob(bus);
                   2611: }
                   2612: 
1.1.1.4 ! root     2613: int ide_init_drive(IDEState *s, BlockDriverState *bs,
        !          2614:                    const char *version, const char *serial)
1.1       root     2615: {
                   2616:     int cylinders, heads, secs;
                   2617:     uint64_t nb_sectors;
                   2618: 
1.1.1.4 ! root     2619:     s->bs = bs;
        !          2620:     bdrv_get_geometry(bs, &nb_sectors);
        !          2621:     bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
        !          2622:     if (cylinders < 1 || cylinders > 16383) {
        !          2623:         error_report("cyls must be between 1 and 16383");
        !          2624:         return -1;
        !          2625:     }
        !          2626:     if (heads < 1 || heads > 16) {
        !          2627:         error_report("heads must be between 1 and 16");
        !          2628:         return -1;
        !          2629:     }
        !          2630:     if (secs < 1 || secs > 63) {
        !          2631:         error_report("secs must be between 1 and 63");
        !          2632:         return -1;
        !          2633:     }
        !          2634:     s->cylinders = cylinders;
        !          2635:     s->heads = heads;
        !          2636:     s->sectors = secs;
        !          2637:     s->nb_sectors = nb_sectors;
        !          2638:     /* The SMART values should be preserved across power cycles
        !          2639:        but they aren't.  */
        !          2640:     s->smart_enabled = 1;
        !          2641:     s->smart_autosave = 1;
        !          2642:     s->smart_errors = 0;
        !          2643:     s->smart_selftest_count = 0;
        !          2644:     if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) {
        !          2645:         s->drive_kind = IDE_CD;
        !          2646:         bdrv_set_change_cb(bs, cdrom_change_cb, s);
        !          2647:     } else {
        !          2648:         if (!bdrv_is_inserted(s->bs)) {
        !          2649:             error_report("Device needs media, but drive is empty");
        !          2650:             return -1;
        !          2651:         }
        !          2652:         if (bdrv_is_read_only(bs)) {
        !          2653:             error_report("Can't use a read-only drive");
        !          2654:             return -1;
1.1       root     2655:         }
                   2656:     }
1.1.1.4 ! root     2657:     if (serial) {
        !          2658:         strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
        !          2659:     } else {
1.1       root     2660:         snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
                   2661:                  "QM%05d", s->drive_serial);
1.1.1.4 ! root     2662:     }
1.1.1.2   root     2663:     if (version) {
                   2664:         pstrcpy(s->version, sizeof(s->version), version);
                   2665:     } else {
                   2666:         pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
                   2667:     }
1.1       root     2668:     ide_reset(s);
1.1.1.4 ! root     2669:     bdrv_set_removable(bs, s->drive_kind == IDE_CD);
        !          2670:     return 0;
1.1       root     2671: }
                   2672: 
1.1.1.4 ! root     2673: static void ide_init1(IDEBus *bus, int unit)
1.1       root     2674: {
                   2675:     static int drive_serial = 1;
1.1.1.4 ! root     2676:     IDEState *s = &bus->ifs[unit];
        !          2677: 
        !          2678:     s->bus = bus;
        !          2679:     s->unit = unit;
        !          2680:     s->drive_serial = drive_serial++;
        !          2681:     s->io_buffer = qemu_blockalign(s->bs, IDE_DMA_BUF_SECTORS*512 + 4);
        !          2682:     s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
        !          2683:     s->smart_selftest_data = qemu_blockalign(s->bs, 512);
        !          2684:     s->sector_write_timer = qemu_new_timer(vm_clock,
        !          2685:                                            ide_sector_write_timer_cb, s);
        !          2686: }
        !          2687: 
        !          2688: void ide_init2(IDEBus *bus, qemu_irq irq)
        !          2689: {
1.1       root     2690:     int i;
                   2691: 
                   2692:     for(i = 0; i < 2; i++) {
1.1.1.4 ! root     2693:         ide_init1(bus, i);
        !          2694:         ide_reset(&bus->ifs[i]);
        !          2695:     }
        !          2696:     bus->irq = irq;
        !          2697: }
        !          2698: 
        !          2699: /* TODO convert users to qdev and remove */
        !          2700: void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
        !          2701:                                     DriveInfo *hd1, qemu_irq irq)
        !          2702: {
        !          2703:     int i;
        !          2704:     DriveInfo *dinfo;
        !          2705: 
        !          2706:     for(i = 0; i < 2; i++) {
        !          2707:         dinfo = i == 0 ? hd0 : hd1;
        !          2708:         ide_init1(bus, i);
        !          2709:         if (dinfo) {
        !          2710:             if (ide_init_drive(&bus->ifs[i], dinfo->bdrv, NULL,
        !          2711:                                *dinfo->serial ? dinfo->serial : NULL) < 0) {
        !          2712:                 error_report("Can't set up IDE drive %s", dinfo->id);
        !          2713:                 exit(1);
        !          2714:             }
        !          2715:         } else {
        !          2716:             ide_reset(&bus->ifs[i]);
        !          2717:         }
1.1       root     2718:     }
                   2719:     bus->irq = irq;
                   2720: }
                   2721: 
                   2722: void ide_init_ioport(IDEBus *bus, int iobase, int iobase2)
                   2723: {
                   2724:     register_ioport_write(iobase, 8, 1, ide_ioport_write, bus);
                   2725:     register_ioport_read(iobase, 8, 1, ide_ioport_read, bus);
                   2726:     if (iobase2) {
                   2727:         register_ioport_read(iobase2, 1, 1, ide_status_read, bus);
                   2728:         register_ioport_write(iobase2, 1, 1, ide_cmd_write, bus);
                   2729:     }
                   2730: 
                   2731:     /* data ports */
                   2732:     register_ioport_write(iobase, 2, 2, ide_data_writew, bus);
                   2733:     register_ioport_read(iobase, 2, 2, ide_data_readw, bus);
                   2734:     register_ioport_write(iobase, 4, 4, ide_data_writel, bus);
                   2735:     register_ioport_read(iobase, 4, 4, ide_data_readl, bus);
                   2736: }
                   2737: 
                   2738: static bool is_identify_set(void *opaque, int version_id)
                   2739: {
                   2740:     IDEState *s = opaque;
                   2741: 
                   2742:     return s->identify_set != 0;
                   2743: }
                   2744: 
1.1.1.2   root     2745: static EndTransferFunc* transfer_end_table[] = {
                   2746:         ide_sector_read,
                   2747:         ide_sector_write,
                   2748:         ide_transfer_stop,
                   2749:         ide_atapi_cmd_reply_end,
                   2750:         ide_atapi_cmd,
1.1.1.4 ! root     2751:         ide_dummy_transfer_stop,
1.1.1.2   root     2752: };
                   2753: 
                   2754: static int transfer_end_table_idx(EndTransferFunc *fn)
                   2755: {
                   2756:     int i;
                   2757: 
                   2758:     for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
                   2759:         if (transfer_end_table[i] == fn)
                   2760:             return i;
                   2761: 
                   2762:     return -1;
                   2763: }
                   2764: 
1.1       root     2765: static int ide_drive_post_load(void *opaque, int version_id)
                   2766: {
                   2767:     IDEState *s = opaque;
                   2768: 
                   2769:     if (version_id < 3) {
                   2770:         if (s->sense_key == SENSE_UNIT_ATTENTION &&
                   2771:             s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
                   2772:             s->cdrom_changed = 1;
                   2773:         }
                   2774:     }
                   2775:     return 0;
                   2776: }
                   2777: 
1.1.1.4 ! root     2778: static int ide_drive_pio_post_load(void *opaque, int version_id)
1.1.1.2   root     2779: {
                   2780:     IDEState *s = opaque;
                   2781: 
1.1.1.4 ! root     2782:     if (s->end_transfer_fn_idx < 0 ||
        !          2783:         s->end_transfer_fn_idx > ARRAY_SIZE(transfer_end_table)) {
        !          2784:         return -EINVAL;
        !          2785:     }
        !          2786:     s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
        !          2787:     s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
        !          2788:     s->data_end = s->data_ptr + s->cur_io_buffer_len;
1.1.1.2   root     2789: 
1.1.1.4 ! root     2790:     return 0;
        !          2791: }
        !          2792: 
        !          2793: static void ide_drive_pio_pre_save(void *opaque)
        !          2794: {
        !          2795:     IDEState *s = opaque;
        !          2796:     int idx;
1.1.1.2   root     2797: 
                   2798:     s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
                   2799:     s->cur_io_buffer_len = s->data_end - s->data_ptr;
                   2800: 
1.1.1.4 ! root     2801:     idx = transfer_end_table_idx(s->end_transfer_func);
        !          2802:     if (idx == -1) {
1.1.1.2   root     2803:         fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
                   2804:                         __func__);
                   2805:         s->end_transfer_fn_idx = 2;
1.1.1.4 ! root     2806:     } else {
        !          2807:         s->end_transfer_fn_idx = idx;
1.1.1.2   root     2808:     }
                   2809: }
                   2810: 
1.1.1.4 ! root     2811: static bool ide_drive_pio_state_needed(void *opaque)
        !          2812: {
        !          2813:     IDEState *s = opaque;
        !          2814: 
        !          2815:     return (s->status & DRQ_STAT) != 0;
        !          2816: }
        !          2817: 
        !          2818: const VMStateDescription vmstate_ide_drive_pio_state = {
        !          2819:     .name = "ide_drive/pio_state",
        !          2820:     .version_id = 1,
        !          2821:     .minimum_version_id = 1,
        !          2822:     .minimum_version_id_old = 1,
        !          2823:     .pre_save = ide_drive_pio_pre_save,
        !          2824:     .post_load = ide_drive_pio_post_load,
        !          2825:     .fields      = (VMStateField []) {
        !          2826:         VMSTATE_INT32(req_nb_sectors, IDEState),
        !          2827:         VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
        !          2828:                             vmstate_info_uint8, uint8_t),
        !          2829:         VMSTATE_INT32(cur_io_buffer_offset, IDEState),
        !          2830:         VMSTATE_INT32(cur_io_buffer_len, IDEState),
        !          2831:         VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
        !          2832:         VMSTATE_INT32(elementary_transfer_size, IDEState),
        !          2833:         VMSTATE_INT32(packet_transfer_size, IDEState),
        !          2834:         VMSTATE_END_OF_LIST()
        !          2835:     }
        !          2836: };
        !          2837: 
1.1       root     2838: const VMStateDescription vmstate_ide_drive = {
                   2839:     .name = "ide_drive",
1.1.1.4 ! root     2840:     .version_id = 3,
1.1       root     2841:     .minimum_version_id = 0,
                   2842:     .minimum_version_id_old = 0,
                   2843:     .post_load = ide_drive_post_load,
                   2844:     .fields      = (VMStateField []) {
                   2845:         VMSTATE_INT32(mult_sectors, IDEState),
                   2846:         VMSTATE_INT32(identify_set, IDEState),
                   2847:         VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
                   2848:         VMSTATE_UINT8(feature, IDEState),
                   2849:         VMSTATE_UINT8(error, IDEState),
                   2850:         VMSTATE_UINT32(nsector, IDEState),
                   2851:         VMSTATE_UINT8(sector, IDEState),
                   2852:         VMSTATE_UINT8(lcyl, IDEState),
                   2853:         VMSTATE_UINT8(hcyl, IDEState),
                   2854:         VMSTATE_UINT8(hob_feature, IDEState),
                   2855:         VMSTATE_UINT8(hob_sector, IDEState),
                   2856:         VMSTATE_UINT8(hob_nsector, IDEState),
                   2857:         VMSTATE_UINT8(hob_lcyl, IDEState),
                   2858:         VMSTATE_UINT8(hob_hcyl, IDEState),
                   2859:         VMSTATE_UINT8(select, IDEState),
                   2860:         VMSTATE_UINT8(status, IDEState),
                   2861:         VMSTATE_UINT8(lba48, IDEState),
                   2862:         VMSTATE_UINT8(sense_key, IDEState),
                   2863:         VMSTATE_UINT8(asc, IDEState),
                   2864:         VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
                   2865:         VMSTATE_END_OF_LIST()
1.1.1.4 ! root     2866:     },
        !          2867:     .subsections = (VMStateSubsection []) {
        !          2868:         {
        !          2869:             .vmsd = &vmstate_ide_drive_pio_state,
        !          2870:             .needed = ide_drive_pio_state_needed,
        !          2871:         }, {
        !          2872:             /* empty */
        !          2873:         }
1.1       root     2874:     }
                   2875: };
                   2876: 
                   2877: const VMStateDescription vmstate_ide_bus = {
                   2878:     .name = "ide_bus",
                   2879:     .version_id = 1,
                   2880:     .minimum_version_id = 1,
                   2881:     .minimum_version_id_old = 1,
                   2882:     .fields      = (VMStateField []) {
                   2883:         VMSTATE_UINT8(cmd, IDEBus),
                   2884:         VMSTATE_UINT8(unit, IDEBus),
                   2885:         VMSTATE_END_OF_LIST()
                   2886:     }
                   2887: };
                   2888: 
                   2889: /***********************************************************/
                   2890: /* PCI IDE definitions */
                   2891: 
                   2892: static void ide_dma_start(IDEState *s, BlockDriverCompletionFunc *dma_cb)
                   2893: {
                   2894:     BMDMAState *bm = s->bus->bmdma;
                   2895:     if(!bm)
                   2896:         return;
                   2897:     bm->unit = s->unit;
                   2898:     bm->dma_cb = dma_cb;
                   2899:     bm->cur_prd_last = 0;
                   2900:     bm->cur_prd_addr = 0;
                   2901:     bm->cur_prd_len = 0;
                   2902:     bm->sector_num = ide_get_sector(s);
                   2903:     bm->nsector = s->nsector;
                   2904:     if (bm->status & BM_STATUS_DMAING) {
                   2905:         bm->dma_cb(bm, 0);
                   2906:     }
                   2907: }
                   2908: 
                   2909: static void ide_dma_restart(IDEState *s, int is_read)
                   2910: {
                   2911:     BMDMAState *bm = s->bus->bmdma;
                   2912:     ide_set_sector(s, bm->sector_num);
                   2913:     s->io_buffer_index = 0;
                   2914:     s->io_buffer_size = 0;
                   2915:     s->nsector = bm->nsector;
                   2916:     bm->cur_addr = bm->addr;
                   2917: 
                   2918:     if (is_read) {
                   2919:         bm->dma_cb = ide_read_dma_cb;
                   2920:     } else {
                   2921:         bm->dma_cb = ide_write_dma_cb;
                   2922:     }
                   2923: 
                   2924:     ide_dma_start(s, bm->dma_cb);
                   2925: }
                   2926: 
                   2927: void ide_dma_cancel(BMDMAState *bm)
                   2928: {
                   2929:     if (bm->status & BM_STATUS_DMAING) {
                   2930:         if (bm->aiocb) {
                   2931: #ifdef DEBUG_AIO
                   2932:             printf("aio_cancel\n");
                   2933: #endif
                   2934:             bdrv_aio_cancel(bm->aiocb);
                   2935:             bm->aiocb = NULL;
                   2936:         }
1.1.1.3   root     2937:         bm->status &= ~BM_STATUS_DMAING;
                   2938:         /* cancel DMA request */
                   2939:         bm->unit = -1;
                   2940:         bm->dma_cb = NULL;
1.1       root     2941:     }
                   2942: }
                   2943: 
                   2944: void ide_dma_reset(BMDMAState *bm)
                   2945: {
                   2946: #ifdef DEBUG_IDE
                   2947:     printf("ide: dma_reset\n");
                   2948: #endif
                   2949:     ide_dma_cancel(bm);
                   2950:     bm->cmd = 0;
                   2951:     bm->status = 0;
                   2952:     bm->addr = 0;
                   2953:     bm->cur_addr = 0;
                   2954:     bm->cur_prd_last = 0;
                   2955:     bm->cur_prd_addr = 0;
                   2956:     bm->cur_prd_len = 0;
                   2957:     bm->sector_num = 0;
                   2958:     bm->nsector = 0;
                   2959: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.