]> git.proxmox.com Git - qemu.git/blob - hw/ide/core.c
ide: Fix error messages from static code analysis (no real error)
[qemu.git] / hw / ide / core.c
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/isa.h>
29 #include "qemu-error.h"
30 #include "qemu-timer.h"
31 #include "sysemu.h"
32 #include "dma.h"
33 #include "hw/block-common.h"
34 #include "blockdev.h"
35
36 #include <hw/ide/internal.h>
37
38 /* These values were based on a Seagate ST3500418AS but have been modified
39 to make more sense in QEMU */
40 static const int smart_attributes[][12] = {
41 /* id, flags, hflags, val, wrst, raw (6 bytes), threshold */
42 /* raw read error rate*/
43 { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
44 /* spin up */
45 { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
46 /* start stop count */
47 { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
48 /* remapped sectors */
49 { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
50 /* power on hours */
51 { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
52 /* power cycle count */
53 { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
54 /* airflow-temperature-celsius */
55 { 190, 0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
56 };
57
58 static int ide_handle_rw_error(IDEState *s, int error, int op);
59 static void ide_dummy_transfer_stop(IDEState *s);
60
61 static void padstr(char *str, const char *src, int len)
62 {
63 int i, v;
64 for(i = 0; i < len; i++) {
65 if (*src)
66 v = *src++;
67 else
68 v = ' ';
69 str[i^1] = v;
70 }
71 }
72
73 static void put_le16(uint16_t *p, unsigned int v)
74 {
75 *p = cpu_to_le16(v);
76 }
77
78 static void ide_identify(IDEState *s)
79 {
80 uint16_t *p;
81 unsigned int oldsize;
82 IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
83
84 if (s->identify_set) {
85 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
86 return;
87 }
88
89 memset(s->io_buffer, 0, 512);
90 p = (uint16_t *)s->io_buffer;
91 put_le16(p + 0, 0x0040);
92 put_le16(p + 1, s->cylinders);
93 put_le16(p + 3, s->heads);
94 put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
95 put_le16(p + 5, 512); /* XXX: retired, remove ? */
96 put_le16(p + 6, s->sectors);
97 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
98 put_le16(p + 20, 3); /* XXX: retired, remove ? */
99 put_le16(p + 21, 512); /* cache size in sectors */
100 put_le16(p + 22, 4); /* ecc bytes */
101 padstr((char *)(p + 23), s->version, 8); /* firmware version */
102 padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
103 #if MAX_MULT_SECTORS > 1
104 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
105 #endif
106 put_le16(p + 48, 1); /* dword I/O */
107 put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
108 put_le16(p + 51, 0x200); /* PIO transfer cycle */
109 put_le16(p + 52, 0x200); /* DMA transfer cycle */
110 put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
111 put_le16(p + 54, s->cylinders);
112 put_le16(p + 55, s->heads);
113 put_le16(p + 56, s->sectors);
114 oldsize = s->cylinders * s->heads * s->sectors;
115 put_le16(p + 57, oldsize);
116 put_le16(p + 58, oldsize >> 16);
117 if (s->mult_sectors)
118 put_le16(p + 59, 0x100 | s->mult_sectors);
119 put_le16(p + 60, s->nb_sectors);
120 put_le16(p + 61, s->nb_sectors >> 16);
121 put_le16(p + 62, 0x07); /* single word dma0-2 supported */
122 put_le16(p + 63, 0x07); /* mdma0-2 supported */
123 put_le16(p + 64, 0x03); /* pio3-4 supported */
124 put_le16(p + 65, 120);
125 put_le16(p + 66, 120);
126 put_le16(p + 67, 120);
127 put_le16(p + 68, 120);
128 if (dev && dev->conf.discard_granularity) {
129 put_le16(p + 69, (1 << 14)); /* determinate TRIM behavior */
130 }
131
132 if (s->ncq_queues) {
133 put_le16(p + 75, s->ncq_queues - 1);
134 /* NCQ supported */
135 put_le16(p + 76, (1 << 8));
136 }
137
138 put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
139 put_le16(p + 81, 0x16); /* conforms to ata5 */
140 /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
141 put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
142 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
143 put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
144 /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
145 if (s->wwn) {
146 put_le16(p + 84, (1 << 14) | (1 << 8) | 0);
147 } else {
148 put_le16(p + 84, (1 << 14) | 0);
149 }
150 /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
151 if (bdrv_enable_write_cache(s->bs))
152 put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
153 else
154 put_le16(p + 85, (1 << 14) | 1);
155 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
156 put_le16(p + 86, (1 << 13) | (1 <<12) | (1 << 10));
157 /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
158 if (s->wwn) {
159 put_le16(p + 87, (1 << 14) | (1 << 8) | 0);
160 } else {
161 put_le16(p + 87, (1 << 14) | 0);
162 }
163 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
164 put_le16(p + 93, 1 | (1 << 14) | 0x2000);
165 put_le16(p + 100, s->nb_sectors);
166 put_le16(p + 101, s->nb_sectors >> 16);
167 put_le16(p + 102, s->nb_sectors >> 32);
168 put_le16(p + 103, s->nb_sectors >> 48);
169
170 if (dev && dev->conf.physical_block_size)
171 put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
172 if (s->wwn) {
173 /* LE 16-bit words 111-108 contain 64-bit World Wide Name */
174 put_le16(p + 108, s->wwn >> 48);
175 put_le16(p + 109, s->wwn >> 32);
176 put_le16(p + 110, s->wwn >> 16);
177 put_le16(p + 111, s->wwn);
178 }
179 if (dev && dev->conf.discard_granularity) {
180 put_le16(p + 169, 1); /* TRIM support */
181 }
182
183 memcpy(s->identify_data, p, sizeof(s->identify_data));
184 s->identify_set = 1;
185 }
186
187 static void ide_atapi_identify(IDEState *s)
188 {
189 uint16_t *p;
190
191 if (s->identify_set) {
192 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
193 return;
194 }
195
196 memset(s->io_buffer, 0, 512);
197 p = (uint16_t *)s->io_buffer;
198 /* Removable CDROM, 50us response, 12 byte packets */
199 put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
200 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
201 put_le16(p + 20, 3); /* buffer type */
202 put_le16(p + 21, 512); /* cache size in sectors */
203 put_le16(p + 22, 4); /* ecc bytes */
204 padstr((char *)(p + 23), s->version, 8); /* firmware version */
205 padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
206 put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
207 #ifdef USE_DMA_CDROM
208 put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
209 put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
210 put_le16(p + 62, 7); /* single word dma0-2 supported */
211 put_le16(p + 63, 7); /* mdma0-2 supported */
212 #else
213 put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
214 put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
215 put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
216 #endif
217 put_le16(p + 64, 3); /* pio3-4 supported */
218 put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
219 put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
220 put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
221 put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
222
223 put_le16(p + 71, 30); /* in ns */
224 put_le16(p + 72, 30); /* in ns */
225
226 if (s->ncq_queues) {
227 put_le16(p + 75, s->ncq_queues - 1);
228 /* NCQ supported */
229 put_le16(p + 76, (1 << 8));
230 }
231
232 put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
233 #ifdef USE_DMA_CDROM
234 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
235 #endif
236 memcpy(s->identify_data, p, sizeof(s->identify_data));
237 s->identify_set = 1;
238 }
239
240 static void ide_cfata_identify(IDEState *s)
241 {
242 uint16_t *p;
243 uint32_t cur_sec;
244
245 p = (uint16_t *) s->identify_data;
246 if (s->identify_set)
247 goto fill_buffer;
248
249 memset(p, 0, sizeof(s->identify_data));
250
251 cur_sec = s->cylinders * s->heads * s->sectors;
252
253 put_le16(p + 0, 0x848a); /* CF Storage Card signature */
254 put_le16(p + 1, s->cylinders); /* Default cylinders */
255 put_le16(p + 3, s->heads); /* Default heads */
256 put_le16(p + 6, s->sectors); /* Default sectors per track */
257 put_le16(p + 7, s->nb_sectors >> 16); /* Sectors per card */
258 put_le16(p + 8, s->nb_sectors); /* Sectors per card */
259 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
260 put_le16(p + 22, 0x0004); /* ECC bytes */
261 padstr((char *) (p + 23), s->version, 8); /* Firmware Revision */
262 padstr((char *) (p + 27), s->drive_model_str, 40);/* Model number */
263 #if MAX_MULT_SECTORS > 1
264 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
265 #else
266 put_le16(p + 47, 0x0000);
267 #endif
268 put_le16(p + 49, 0x0f00); /* Capabilities */
269 put_le16(p + 51, 0x0002); /* PIO cycle timing mode */
270 put_le16(p + 52, 0x0001); /* DMA cycle timing mode */
271 put_le16(p + 53, 0x0003); /* Translation params valid */
272 put_le16(p + 54, s->cylinders); /* Current cylinders */
273 put_le16(p + 55, s->heads); /* Current heads */
274 put_le16(p + 56, s->sectors); /* Current sectors */
275 put_le16(p + 57, cur_sec); /* Current capacity */
276 put_le16(p + 58, cur_sec >> 16); /* Current capacity */
277 if (s->mult_sectors) /* Multiple sector setting */
278 put_le16(p + 59, 0x100 | s->mult_sectors);
279 put_le16(p + 60, s->nb_sectors); /* Total LBA sectors */
280 put_le16(p + 61, s->nb_sectors >> 16); /* Total LBA sectors */
281 put_le16(p + 63, 0x0203); /* Multiword DMA capability */
282 put_le16(p + 64, 0x0001); /* Flow Control PIO support */
283 put_le16(p + 65, 0x0096); /* Min. Multiword DMA cycle */
284 put_le16(p + 66, 0x0096); /* Rec. Multiword DMA cycle */
285 put_le16(p + 68, 0x00b4); /* Min. PIO cycle time */
286 put_le16(p + 82, 0x400c); /* Command Set supported */
287 put_le16(p + 83, 0x7068); /* Command Set supported */
288 put_le16(p + 84, 0x4000); /* Features supported */
289 put_le16(p + 85, 0x000c); /* Command Set enabled */
290 put_le16(p + 86, 0x7044); /* Command Set enabled */
291 put_le16(p + 87, 0x4000); /* Features enabled */
292 put_le16(p + 91, 0x4060); /* Current APM level */
293 put_le16(p + 129, 0x0002); /* Current features option */
294 put_le16(p + 130, 0x0005); /* Reassigned sectors */
295 put_le16(p + 131, 0x0001); /* Initial power mode */
296 put_le16(p + 132, 0x0000); /* User signature */
297 put_le16(p + 160, 0x8100); /* Power requirement */
298 put_le16(p + 161, 0x8001); /* CF command set */
299
300 s->identify_set = 1;
301
302 fill_buffer:
303 memcpy(s->io_buffer, p, sizeof(s->identify_data));
304 }
305
306 static void ide_set_signature(IDEState *s)
307 {
308 s->select &= 0xf0; /* clear head */
309 /* put signature */
310 s->nsector = 1;
311 s->sector = 1;
312 if (s->drive_kind == IDE_CD) {
313 s->lcyl = 0x14;
314 s->hcyl = 0xeb;
315 } else if (s->bs) {
316 s->lcyl = 0;
317 s->hcyl = 0;
318 } else {
319 s->lcyl = 0xff;
320 s->hcyl = 0xff;
321 }
322 }
323
324 typedef struct TrimAIOCB {
325 BlockDriverAIOCB common;
326 QEMUBH *bh;
327 int ret;
328 } TrimAIOCB;
329
330 static void trim_aio_cancel(BlockDriverAIOCB *acb)
331 {
332 TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
333
334 qemu_bh_delete(iocb->bh);
335 iocb->bh = NULL;
336 qemu_aio_release(iocb);
337 }
338
339 static AIOPool trim_aio_pool = {
340 .aiocb_size = sizeof(TrimAIOCB),
341 .cancel = trim_aio_cancel,
342 };
343
344 static void ide_trim_bh_cb(void *opaque)
345 {
346 TrimAIOCB *iocb = opaque;
347
348 iocb->common.cb(iocb->common.opaque, iocb->ret);
349
350 qemu_bh_delete(iocb->bh);
351 iocb->bh = NULL;
352
353 qemu_aio_release(iocb);
354 }
355
356 BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs,
357 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
358 BlockDriverCompletionFunc *cb, void *opaque)
359 {
360 TrimAIOCB *iocb;
361 int i, j, ret;
362
363 iocb = qemu_aio_get(&trim_aio_pool, bs, cb, opaque);
364 iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
365 iocb->ret = 0;
366
367 for (j = 0; j < qiov->niov; j++) {
368 uint64_t *buffer = qiov->iov[j].iov_base;
369
370 for (i = 0; i < qiov->iov[j].iov_len / 8; i++) {
371 /* 6-byte LBA + 2-byte range per entry */
372 uint64_t entry = le64_to_cpu(buffer[i]);
373 uint64_t sector = entry & 0x0000ffffffffffffULL;
374 uint16_t count = entry >> 48;
375
376 if (count == 0) {
377 break;
378 }
379
380 ret = bdrv_discard(bs, sector, count);
381 if (!iocb->ret) {
382 iocb->ret = ret;
383 }
384 }
385 }
386
387 qemu_bh_schedule(iocb->bh);
388
389 return &iocb->common;
390 }
391
392 static inline void ide_abort_command(IDEState *s)
393 {
394 s->status = READY_STAT | ERR_STAT;
395 s->error = ABRT_ERR;
396 }
397
398 /* prepare data transfer and tell what to do after */
399 void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
400 EndTransferFunc *end_transfer_func)
401 {
402 s->end_transfer_func = end_transfer_func;
403 s->data_ptr = buf;
404 s->data_end = buf + size;
405 if (!(s->status & ERR_STAT)) {
406 s->status |= DRQ_STAT;
407 }
408 s->bus->dma->ops->start_transfer(s->bus->dma);
409 }
410
411 void ide_transfer_stop(IDEState *s)
412 {
413 s->end_transfer_func = ide_transfer_stop;
414 s->data_ptr = s->io_buffer;
415 s->data_end = s->io_buffer;
416 s->status &= ~DRQ_STAT;
417 }
418
419 int64_t ide_get_sector(IDEState *s)
420 {
421 int64_t sector_num;
422 if (s->select & 0x40) {
423 /* lba */
424 if (!s->lba48) {
425 sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
426 (s->lcyl << 8) | s->sector;
427 } else {
428 sector_num = ((int64_t)s->hob_hcyl << 40) |
429 ((int64_t) s->hob_lcyl << 32) |
430 ((int64_t) s->hob_sector << 24) |
431 ((int64_t) s->hcyl << 16) |
432 ((int64_t) s->lcyl << 8) | s->sector;
433 }
434 } else {
435 sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
436 (s->select & 0x0f) * s->sectors + (s->sector - 1);
437 }
438 return sector_num;
439 }
440
441 void ide_set_sector(IDEState *s, int64_t sector_num)
442 {
443 unsigned int cyl, r;
444 if (s->select & 0x40) {
445 if (!s->lba48) {
446 s->select = (s->select & 0xf0) | (sector_num >> 24);
447 s->hcyl = (sector_num >> 16);
448 s->lcyl = (sector_num >> 8);
449 s->sector = (sector_num);
450 } else {
451 s->sector = sector_num;
452 s->lcyl = sector_num >> 8;
453 s->hcyl = sector_num >> 16;
454 s->hob_sector = sector_num >> 24;
455 s->hob_lcyl = sector_num >> 32;
456 s->hob_hcyl = sector_num >> 40;
457 }
458 } else {
459 cyl = sector_num / (s->heads * s->sectors);
460 r = sector_num % (s->heads * s->sectors);
461 s->hcyl = cyl >> 8;
462 s->lcyl = cyl;
463 s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
464 s->sector = (r % s->sectors) + 1;
465 }
466 }
467
468 static void ide_rw_error(IDEState *s) {
469 ide_abort_command(s);
470 ide_set_irq(s->bus);
471 }
472
473 static void ide_sector_read_cb(void *opaque, int ret)
474 {
475 IDEState *s = opaque;
476 int n;
477
478 s->pio_aiocb = NULL;
479 s->status &= ~BUSY_STAT;
480
481 bdrv_acct_done(s->bs, &s->acct);
482 if (ret != 0) {
483 if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY |
484 BM_STATUS_RETRY_READ)) {
485 return;
486 }
487 }
488
489 n = s->nsector;
490 if (n > s->req_nb_sectors) {
491 n = s->req_nb_sectors;
492 }
493
494 /* Allow the guest to read the io_buffer */
495 ide_transfer_start(s, s->io_buffer, n * BDRV_SECTOR_SIZE, ide_sector_read);
496
497 ide_set_irq(s->bus);
498
499 ide_set_sector(s, ide_get_sector(s) + n);
500 s->nsector -= n;
501 }
502
503 void ide_sector_read(IDEState *s)
504 {
505 int64_t sector_num;
506 int n;
507
508 s->status = READY_STAT | SEEK_STAT;
509 s->error = 0; /* not needed by IDE spec, but needed by Windows */
510 sector_num = ide_get_sector(s);
511 n = s->nsector;
512
513 if (n == 0) {
514 ide_transfer_stop(s);
515 return;
516 }
517
518 s->status |= BUSY_STAT;
519
520 if (n > s->req_nb_sectors) {
521 n = s->req_nb_sectors;
522 }
523
524 #if defined(DEBUG_IDE)
525 printf("sector=%" PRId64 "\n", sector_num);
526 #endif
527
528 s->iov.iov_base = s->io_buffer;
529 s->iov.iov_len = n * BDRV_SECTOR_SIZE;
530 qemu_iovec_init_external(&s->qiov, &s->iov, 1);
531
532 bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
533 s->pio_aiocb = bdrv_aio_readv(s->bs, sector_num, &s->qiov, n,
534 ide_sector_read_cb, s);
535 }
536
537 static void dma_buf_commit(IDEState *s)
538 {
539 qemu_sglist_destroy(&s->sg);
540 }
541
542 void ide_set_inactive(IDEState *s)
543 {
544 s->bus->dma->aiocb = NULL;
545 s->bus->dma->ops->set_inactive(s->bus->dma);
546 }
547
548 void ide_dma_error(IDEState *s)
549 {
550 ide_transfer_stop(s);
551 s->error = ABRT_ERR;
552 s->status = READY_STAT | ERR_STAT;
553 ide_set_inactive(s);
554 ide_set_irq(s->bus);
555 }
556
557 static int ide_handle_rw_error(IDEState *s, int error, int op)
558 {
559 int is_read = (op & BM_STATUS_RETRY_READ);
560 BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
561
562 if (action == BLOCK_ERR_IGNORE) {
563 bdrv_emit_qmp_error_event(s->bs, BDRV_ACTION_IGNORE, is_read);
564 return 0;
565 }
566
567 if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
568 || action == BLOCK_ERR_STOP_ANY) {
569 s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
570 s->bus->error_status = op;
571 bdrv_emit_qmp_error_event(s->bs, BDRV_ACTION_STOP, is_read);
572 vm_stop(RUN_STATE_IO_ERROR);
573 bdrv_iostatus_set_err(s->bs, error);
574 } else {
575 if (op & BM_STATUS_DMA_RETRY) {
576 dma_buf_commit(s);
577 ide_dma_error(s);
578 } else {
579 ide_rw_error(s);
580 }
581 bdrv_emit_qmp_error_event(s->bs, BDRV_ACTION_REPORT, is_read);
582 }
583
584 return 1;
585 }
586
587 void ide_dma_cb(void *opaque, int ret)
588 {
589 IDEState *s = opaque;
590 int n;
591 int64_t sector_num;
592
593 if (ret < 0) {
594 int op = BM_STATUS_DMA_RETRY;
595
596 if (s->dma_cmd == IDE_DMA_READ)
597 op |= BM_STATUS_RETRY_READ;
598 else if (s->dma_cmd == IDE_DMA_TRIM)
599 op |= BM_STATUS_RETRY_TRIM;
600
601 if (ide_handle_rw_error(s, -ret, op)) {
602 return;
603 }
604 }
605
606 n = s->io_buffer_size >> 9;
607 sector_num = ide_get_sector(s);
608 if (n > 0) {
609 dma_buf_commit(s);
610 sector_num += n;
611 ide_set_sector(s, sector_num);
612 s->nsector -= n;
613 }
614
615 /* end of transfer ? */
616 if (s->nsector == 0) {
617 s->status = READY_STAT | SEEK_STAT;
618 ide_set_irq(s->bus);
619 goto eot;
620 }
621
622 /* launch next transfer */
623 n = s->nsector;
624 s->io_buffer_index = 0;
625 s->io_buffer_size = n * 512;
626 if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) {
627 /* The PRDs were too short. Reset the Active bit, but don't raise an
628 * interrupt. */
629 goto eot;
630 }
631
632 #ifdef DEBUG_AIO
633 printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
634 sector_num, n, s->dma_cmd);
635 #endif
636
637 switch (s->dma_cmd) {
638 case IDE_DMA_READ:
639 s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
640 ide_dma_cb, s);
641 break;
642 case IDE_DMA_WRITE:
643 s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
644 ide_dma_cb, s);
645 break;
646 case IDE_DMA_TRIM:
647 s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
648 ide_issue_trim, ide_dma_cb, s,
649 DMA_DIRECTION_TO_DEVICE);
650 break;
651 }
652 return;
653
654 eot:
655 if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
656 bdrv_acct_done(s->bs, &s->acct);
657 }
658 ide_set_inactive(s);
659 }
660
661 static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
662 {
663 s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
664 s->io_buffer_index = 0;
665 s->io_buffer_size = 0;
666 s->dma_cmd = dma_cmd;
667
668 switch (dma_cmd) {
669 case IDE_DMA_READ:
670 bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
671 BDRV_ACCT_READ);
672 break;
673 case IDE_DMA_WRITE:
674 bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
675 BDRV_ACCT_WRITE);
676 break;
677 default:
678 break;
679 }
680
681 s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
682 }
683
684 static void ide_sector_write_timer_cb(void *opaque)
685 {
686 IDEState *s = opaque;
687 ide_set_irq(s->bus);
688 }
689
690 static void ide_sector_write_cb(void *opaque, int ret)
691 {
692 IDEState *s = opaque;
693 int n;
694
695 bdrv_acct_done(s->bs, &s->acct);
696
697 s->pio_aiocb = NULL;
698 s->status &= ~BUSY_STAT;
699
700 if (ret != 0) {
701 if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY)) {
702 return;
703 }
704 }
705
706 n = s->nsector;
707 if (n > s->req_nb_sectors) {
708 n = s->req_nb_sectors;
709 }
710 s->nsector -= n;
711 if (s->nsector == 0) {
712 /* no more sectors to write */
713 ide_transfer_stop(s);
714 } else {
715 int n1 = s->nsector;
716 if (n1 > s->req_nb_sectors) {
717 n1 = s->req_nb_sectors;
718 }
719 ide_transfer_start(s, s->io_buffer, n1 * BDRV_SECTOR_SIZE,
720 ide_sector_write);
721 }
722 ide_set_sector(s, ide_get_sector(s) + n);
723
724 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
725 /* It seems there is a bug in the Windows 2000 installer HDD
726 IDE driver which fills the disk with empty logs when the
727 IDE write IRQ comes too early. This hack tries to correct
728 that at the expense of slower write performances. Use this
729 option _only_ to install Windows 2000. You must disable it
730 for normal use. */
731 qemu_mod_timer(s->sector_write_timer,
732 qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000));
733 } else {
734 ide_set_irq(s->bus);
735 }
736 }
737
738 void ide_sector_write(IDEState *s)
739 {
740 int64_t sector_num;
741 int n;
742
743 s->status = READY_STAT | SEEK_STAT | BUSY_STAT;
744 sector_num = ide_get_sector(s);
745 #if defined(DEBUG_IDE)
746 printf("sector=%" PRId64 "\n", sector_num);
747 #endif
748 n = s->nsector;
749 if (n > s->req_nb_sectors) {
750 n = s->req_nb_sectors;
751 }
752
753 s->iov.iov_base = s->io_buffer;
754 s->iov.iov_len = n * BDRV_SECTOR_SIZE;
755 qemu_iovec_init_external(&s->qiov, &s->iov, 1);
756
757 bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
758 s->pio_aiocb = bdrv_aio_writev(s->bs, sector_num, &s->qiov, n,
759 ide_sector_write_cb, s);
760 }
761
762 static void ide_flush_cb(void *opaque, int ret)
763 {
764 IDEState *s = opaque;
765
766 if (ret < 0) {
767 /* XXX: What sector number to set here? */
768 if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
769 return;
770 }
771 }
772
773 bdrv_acct_done(s->bs, &s->acct);
774 s->status = READY_STAT | SEEK_STAT;
775 ide_set_irq(s->bus);
776 }
777
778 void ide_flush_cache(IDEState *s)
779 {
780 if (s->bs == NULL) {
781 ide_flush_cb(s, 0);
782 return;
783 }
784
785 bdrv_acct_start(s->bs, &s->acct, 0, BDRV_ACCT_FLUSH);
786 bdrv_aio_flush(s->bs, ide_flush_cb, s);
787 }
788
789 static void ide_cfata_metadata_inquiry(IDEState *s)
790 {
791 uint16_t *p;
792 uint32_t spd;
793
794 p = (uint16_t *) s->io_buffer;
795 memset(p, 0, 0x200);
796 spd = ((s->mdata_size - 1) >> 9) + 1;
797
798 put_le16(p + 0, 0x0001); /* Data format revision */
799 put_le16(p + 1, 0x0000); /* Media property: silicon */
800 put_le16(p + 2, s->media_changed); /* Media status */
801 put_le16(p + 3, s->mdata_size & 0xffff); /* Capacity in bytes (low) */
802 put_le16(p + 4, s->mdata_size >> 16); /* Capacity in bytes (high) */
803 put_le16(p + 5, spd & 0xffff); /* Sectors per device (low) */
804 put_le16(p + 6, spd >> 16); /* Sectors per device (high) */
805 }
806
807 static void ide_cfata_metadata_read(IDEState *s)
808 {
809 uint16_t *p;
810
811 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
812 s->status = ERR_STAT;
813 s->error = ABRT_ERR;
814 return;
815 }
816
817 p = (uint16_t *) s->io_buffer;
818 memset(p, 0, 0x200);
819
820 put_le16(p + 0, s->media_changed); /* Media status */
821 memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
822 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
823 s->nsector << 9), 0x200 - 2));
824 }
825
826 static void ide_cfata_metadata_write(IDEState *s)
827 {
828 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
829 s->status = ERR_STAT;
830 s->error = ABRT_ERR;
831 return;
832 }
833
834 s->media_changed = 0;
835
836 memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
837 s->io_buffer + 2,
838 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
839 s->nsector << 9), 0x200 - 2));
840 }
841
842 /* called when the inserted state of the media has changed */
843 static void ide_cd_change_cb(void *opaque, bool load)
844 {
845 IDEState *s = opaque;
846 uint64_t nb_sectors;
847
848 s->tray_open = !load;
849 bdrv_get_geometry(s->bs, &nb_sectors);
850 s->nb_sectors = nb_sectors;
851
852 /*
853 * First indicate to the guest that a CD has been removed. That's
854 * done on the next command the guest sends us.
855 *
856 * Then we set UNIT_ATTENTION, by which the guest will
857 * detect a new CD in the drive. See ide_atapi_cmd() for details.
858 */
859 s->cdrom_changed = 1;
860 s->events.new_media = true;
861 s->events.eject_request = false;
862 ide_set_irq(s->bus);
863 }
864
865 static void ide_cd_eject_request_cb(void *opaque, bool force)
866 {
867 IDEState *s = opaque;
868
869 s->events.eject_request = true;
870 if (force) {
871 s->tray_locked = false;
872 }
873 ide_set_irq(s->bus);
874 }
875
876 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
877 {
878 s->lba48 = lba48;
879
880 /* handle the 'magic' 0 nsector count conversion here. to avoid
881 * fiddling with the rest of the read logic, we just store the
882 * full sector count in ->nsector and ignore ->hob_nsector from now
883 */
884 if (!s->lba48) {
885 if (!s->nsector)
886 s->nsector = 256;
887 } else {
888 if (!s->nsector && !s->hob_nsector)
889 s->nsector = 65536;
890 else {
891 int lo = s->nsector;
892 int hi = s->hob_nsector;
893
894 s->nsector = (hi << 8) | lo;
895 }
896 }
897 }
898
899 static void ide_clear_hob(IDEBus *bus)
900 {
901 /* any write clears HOB high bit of device control register */
902 bus->ifs[0].select &= ~(1 << 7);
903 bus->ifs[1].select &= ~(1 << 7);
904 }
905
906 void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
907 {
908 IDEBus *bus = opaque;
909
910 #ifdef DEBUG_IDE
911 printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
912 #endif
913
914 addr &= 7;
915
916 /* ignore writes to command block while busy with previous command */
917 if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
918 return;
919
920 switch(addr) {
921 case 0:
922 break;
923 case 1:
924 ide_clear_hob(bus);
925 /* NOTE: data is written to the two drives */
926 bus->ifs[0].hob_feature = bus->ifs[0].feature;
927 bus->ifs[1].hob_feature = bus->ifs[1].feature;
928 bus->ifs[0].feature = val;
929 bus->ifs[1].feature = val;
930 break;
931 case 2:
932 ide_clear_hob(bus);
933 bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
934 bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
935 bus->ifs[0].nsector = val;
936 bus->ifs[1].nsector = val;
937 break;
938 case 3:
939 ide_clear_hob(bus);
940 bus->ifs[0].hob_sector = bus->ifs[0].sector;
941 bus->ifs[1].hob_sector = bus->ifs[1].sector;
942 bus->ifs[0].sector = val;
943 bus->ifs[1].sector = val;
944 break;
945 case 4:
946 ide_clear_hob(bus);
947 bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
948 bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
949 bus->ifs[0].lcyl = val;
950 bus->ifs[1].lcyl = val;
951 break;
952 case 5:
953 ide_clear_hob(bus);
954 bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
955 bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
956 bus->ifs[0].hcyl = val;
957 bus->ifs[1].hcyl = val;
958 break;
959 case 6:
960 /* FIXME: HOB readback uses bit 7 */
961 bus->ifs[0].select = (val & ~0x10) | 0xa0;
962 bus->ifs[1].select = (val | 0x10) | 0xa0;
963 /* select drive */
964 bus->unit = (val >> 4) & 1;
965 break;
966 default:
967 case 7:
968 /* command */
969 ide_exec_cmd(bus, val);
970 break;
971 }
972 }
973
974 #define HD_OK (1u << IDE_HD)
975 #define CD_OK (1u << IDE_CD)
976 #define CFA_OK (1u << IDE_CFATA)
977 #define HD_CFA_OK (HD_OK | CFA_OK)
978 #define ALL_OK (HD_OK | CD_OK | CFA_OK)
979
980 /* See ACS-2 T13/2015-D Table B.2 Command codes */
981 static const uint8_t ide_cmd_table[0x100] = {
982 /* NOP not implemented, mandatory for CD */
983 [CFA_REQ_EXT_ERROR_CODE] = CFA_OK,
984 [WIN_DSM] = ALL_OK,
985 [WIN_DEVICE_RESET] = CD_OK,
986 [WIN_RECAL] = HD_CFA_OK,
987 [WIN_READ] = ALL_OK,
988 [WIN_READ_ONCE] = ALL_OK,
989 [WIN_READ_EXT] = HD_CFA_OK,
990 [WIN_READDMA_EXT] = HD_CFA_OK,
991 [WIN_READ_NATIVE_MAX_EXT] = HD_CFA_OK,
992 [WIN_MULTREAD_EXT] = HD_CFA_OK,
993 [WIN_WRITE] = HD_CFA_OK,
994 [WIN_WRITE_ONCE] = HD_CFA_OK,
995 [WIN_WRITE_EXT] = HD_CFA_OK,
996 [WIN_WRITEDMA_EXT] = HD_CFA_OK,
997 [CFA_WRITE_SECT_WO_ERASE] = CFA_OK,
998 [WIN_MULTWRITE_EXT] = HD_CFA_OK,
999 [WIN_WRITE_VERIFY] = HD_CFA_OK,
1000 [WIN_VERIFY] = HD_CFA_OK,
1001 [WIN_VERIFY_ONCE] = HD_CFA_OK,
1002 [WIN_VERIFY_EXT] = HD_CFA_OK,
1003 [WIN_SEEK] = HD_CFA_OK,
1004 [CFA_TRANSLATE_SECTOR] = CFA_OK,
1005 [WIN_DIAGNOSE] = ALL_OK,
1006 [WIN_SPECIFY] = HD_CFA_OK,
1007 [WIN_STANDBYNOW2] = ALL_OK,
1008 [WIN_IDLEIMMEDIATE2] = ALL_OK,
1009 [WIN_STANDBY2] = ALL_OK,
1010 [WIN_SETIDLE2] = ALL_OK,
1011 [WIN_CHECKPOWERMODE2] = ALL_OK,
1012 [WIN_SLEEPNOW2] = ALL_OK,
1013 [WIN_PACKETCMD] = CD_OK,
1014 [WIN_PIDENTIFY] = CD_OK,
1015 [WIN_SMART] = HD_CFA_OK,
1016 [CFA_ACCESS_METADATA_STORAGE] = CFA_OK,
1017 [CFA_ERASE_SECTORS] = CFA_OK,
1018 [WIN_MULTREAD] = HD_CFA_OK,
1019 [WIN_MULTWRITE] = HD_CFA_OK,
1020 [WIN_SETMULT] = HD_CFA_OK,
1021 [WIN_READDMA] = HD_CFA_OK,
1022 [WIN_READDMA_ONCE] = HD_CFA_OK,
1023 [WIN_WRITEDMA] = HD_CFA_OK,
1024 [WIN_WRITEDMA_ONCE] = HD_CFA_OK,
1025 [CFA_WRITE_MULTI_WO_ERASE] = CFA_OK,
1026 [WIN_STANDBYNOW1] = ALL_OK,
1027 [WIN_IDLEIMMEDIATE] = ALL_OK,
1028 [WIN_STANDBY] = ALL_OK,
1029 [WIN_SETIDLE1] = ALL_OK,
1030 [WIN_CHECKPOWERMODE1] = ALL_OK,
1031 [WIN_SLEEPNOW1] = ALL_OK,
1032 [WIN_FLUSH_CACHE] = ALL_OK,
1033 [WIN_FLUSH_CACHE_EXT] = HD_CFA_OK,
1034 [WIN_IDENTIFY] = ALL_OK,
1035 [WIN_SETFEATURES] = ALL_OK,
1036 [IBM_SENSE_CONDITION] = CFA_OK,
1037 [CFA_WEAR_LEVEL] = HD_CFA_OK,
1038 [WIN_READ_NATIVE_MAX] = ALL_OK,
1039 };
1040
1041 static bool ide_cmd_permitted(IDEState *s, uint32_t cmd)
1042 {
1043 return cmd < ARRAY_SIZE(ide_cmd_table)
1044 && (ide_cmd_table[cmd] & (1u << s->drive_kind));
1045 }
1046
1047 void ide_exec_cmd(IDEBus *bus, uint32_t val)
1048 {
1049 uint16_t *identify_data;
1050 IDEState *s;
1051 int n;
1052 int lba48 = 0;
1053
1054 #if defined(DEBUG_IDE)
1055 printf("ide: CMD=%02x\n", val);
1056 #endif
1057 s = idebus_active_if(bus);
1058 /* ignore commands to non existent slave */
1059 if (s != bus->ifs && !s->bs)
1060 return;
1061
1062 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1063 if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1064 return;
1065
1066 if (!ide_cmd_permitted(s, val)) {
1067 goto abort_cmd;
1068 }
1069
1070 switch(val) {
1071 case WIN_DSM:
1072 switch (s->feature) {
1073 case DSM_TRIM:
1074 if (!s->bs) {
1075 goto abort_cmd;
1076 }
1077 ide_sector_start_dma(s, IDE_DMA_TRIM);
1078 break;
1079 default:
1080 goto abort_cmd;
1081 }
1082 break;
1083 case WIN_IDENTIFY:
1084 if (s->bs && s->drive_kind != IDE_CD) {
1085 if (s->drive_kind != IDE_CFATA)
1086 ide_identify(s);
1087 else
1088 ide_cfata_identify(s);
1089 s->status = READY_STAT | SEEK_STAT;
1090 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1091 } else {
1092 if (s->drive_kind == IDE_CD) {
1093 ide_set_signature(s);
1094 }
1095 ide_abort_command(s);
1096 }
1097 ide_set_irq(s->bus);
1098 break;
1099 case WIN_SPECIFY:
1100 case WIN_RECAL:
1101 s->error = 0;
1102 s->status = READY_STAT | SEEK_STAT;
1103 ide_set_irq(s->bus);
1104 break;
1105 case WIN_SETMULT:
1106 if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1107 /* Disable Read and Write Multiple */
1108 s->mult_sectors = 0;
1109 s->status = READY_STAT | SEEK_STAT;
1110 } else if ((s->nsector & 0xff) != 0 &&
1111 ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1112 (s->nsector & (s->nsector - 1)) != 0)) {
1113 ide_abort_command(s);
1114 } else {
1115 s->mult_sectors = s->nsector & 0xff;
1116 s->status = READY_STAT | SEEK_STAT;
1117 }
1118 ide_set_irq(s->bus);
1119 break;
1120 case WIN_VERIFY_EXT:
1121 lba48 = 1;
1122 case WIN_VERIFY:
1123 case WIN_VERIFY_ONCE:
1124 /* do sector number check ? */
1125 ide_cmd_lba48_transform(s, lba48);
1126 s->status = READY_STAT | SEEK_STAT;
1127 ide_set_irq(s->bus);
1128 break;
1129 case WIN_READ_EXT:
1130 lba48 = 1;
1131 case WIN_READ:
1132 case WIN_READ_ONCE:
1133 if (s->drive_kind == IDE_CD) {
1134 ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
1135 goto abort_cmd;
1136 }
1137 if (!s->bs) {
1138 goto abort_cmd;
1139 }
1140 ide_cmd_lba48_transform(s, lba48);
1141 s->req_nb_sectors = 1;
1142 ide_sector_read(s);
1143 break;
1144 case WIN_WRITE_EXT:
1145 lba48 = 1;
1146 case WIN_WRITE:
1147 case WIN_WRITE_ONCE:
1148 case CFA_WRITE_SECT_WO_ERASE:
1149 case WIN_WRITE_VERIFY:
1150 if (!s->bs) {
1151 goto abort_cmd;
1152 }
1153 ide_cmd_lba48_transform(s, lba48);
1154 s->error = 0;
1155 s->status = SEEK_STAT | READY_STAT;
1156 s->req_nb_sectors = 1;
1157 ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1158 s->media_changed = 1;
1159 break;
1160 case WIN_MULTREAD_EXT:
1161 lba48 = 1;
1162 case WIN_MULTREAD:
1163 if (!s->bs) {
1164 goto abort_cmd;
1165 }
1166 if (!s->mult_sectors) {
1167 goto abort_cmd;
1168 }
1169 ide_cmd_lba48_transform(s, lba48);
1170 s->req_nb_sectors = s->mult_sectors;
1171 ide_sector_read(s);
1172 break;
1173 case WIN_MULTWRITE_EXT:
1174 lba48 = 1;
1175 case WIN_MULTWRITE:
1176 case CFA_WRITE_MULTI_WO_ERASE:
1177 if (!s->bs) {
1178 goto abort_cmd;
1179 }
1180 if (!s->mult_sectors) {
1181 goto abort_cmd;
1182 }
1183 ide_cmd_lba48_transform(s, lba48);
1184 s->error = 0;
1185 s->status = SEEK_STAT | READY_STAT;
1186 s->req_nb_sectors = s->mult_sectors;
1187 n = s->nsector;
1188 if (n > s->req_nb_sectors)
1189 n = s->req_nb_sectors;
1190 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1191 s->media_changed = 1;
1192 break;
1193 case WIN_READDMA_EXT:
1194 lba48 = 1;
1195 case WIN_READDMA:
1196 case WIN_READDMA_ONCE:
1197 if (!s->bs) {
1198 goto abort_cmd;
1199 }
1200 ide_cmd_lba48_transform(s, lba48);
1201 ide_sector_start_dma(s, IDE_DMA_READ);
1202 break;
1203 case WIN_WRITEDMA_EXT:
1204 lba48 = 1;
1205 case WIN_WRITEDMA:
1206 case WIN_WRITEDMA_ONCE:
1207 if (!s->bs) {
1208 goto abort_cmd;
1209 }
1210 ide_cmd_lba48_transform(s, lba48);
1211 ide_sector_start_dma(s, IDE_DMA_WRITE);
1212 s->media_changed = 1;
1213 break;
1214 case WIN_READ_NATIVE_MAX_EXT:
1215 lba48 = 1;
1216 case WIN_READ_NATIVE_MAX:
1217 ide_cmd_lba48_transform(s, lba48);
1218 ide_set_sector(s, s->nb_sectors - 1);
1219 s->status = READY_STAT | SEEK_STAT;
1220 ide_set_irq(s->bus);
1221 break;
1222 case WIN_CHECKPOWERMODE1:
1223 case WIN_CHECKPOWERMODE2:
1224 s->error = 0;
1225 s->nsector = 0xff; /* device active or idle */
1226 s->status = READY_STAT | SEEK_STAT;
1227 ide_set_irq(s->bus);
1228 break;
1229 case WIN_SETFEATURES:
1230 if (!s->bs)
1231 goto abort_cmd;
1232 /* XXX: valid for CDROM ? */
1233 switch(s->feature) {
1234 case 0x02: /* write cache enable */
1235 bdrv_set_enable_write_cache(s->bs, true);
1236 identify_data = (uint16_t *)s->identify_data;
1237 put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
1238 s->status = READY_STAT | SEEK_STAT;
1239 ide_set_irq(s->bus);
1240 break;
1241 case 0x82: /* write cache disable */
1242 bdrv_set_enable_write_cache(s->bs, false);
1243 identify_data = (uint16_t *)s->identify_data;
1244 put_le16(identify_data + 85, (1 << 14) | 1);
1245 ide_flush_cache(s);
1246 break;
1247 case 0xcc: /* reverting to power-on defaults enable */
1248 case 0x66: /* reverting to power-on defaults disable */
1249 case 0xaa: /* read look-ahead enable */
1250 case 0x55: /* read look-ahead disable */
1251 case 0x05: /* set advanced power management mode */
1252 case 0x85: /* disable advanced power management mode */
1253 case 0x69: /* NOP */
1254 case 0x67: /* NOP */
1255 case 0x96: /* NOP */
1256 case 0x9a: /* NOP */
1257 case 0x42: /* enable Automatic Acoustic Mode */
1258 case 0xc2: /* disable Automatic Acoustic Mode */
1259 s->status = READY_STAT | SEEK_STAT;
1260 ide_set_irq(s->bus);
1261 break;
1262 case 0x03: { /* set transfer mode */
1263 uint8_t val = s->nsector & 0x07;
1264 identify_data = (uint16_t *)s->identify_data;
1265
1266 switch (s->nsector >> 3) {
1267 case 0x00: /* pio default */
1268 case 0x01: /* pio mode */
1269 put_le16(identify_data + 62,0x07);
1270 put_le16(identify_data + 63,0x07);
1271 put_le16(identify_data + 88,0x3f);
1272 break;
1273 case 0x02: /* sigle word dma mode*/
1274 put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
1275 put_le16(identify_data + 63,0x07);
1276 put_le16(identify_data + 88,0x3f);
1277 break;
1278 case 0x04: /* mdma mode */
1279 put_le16(identify_data + 62,0x07);
1280 put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
1281 put_le16(identify_data + 88,0x3f);
1282 break;
1283 case 0x08: /* udma mode */
1284 put_le16(identify_data + 62,0x07);
1285 put_le16(identify_data + 63,0x07);
1286 put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
1287 break;
1288 default:
1289 goto abort_cmd;
1290 }
1291 s->status = READY_STAT | SEEK_STAT;
1292 ide_set_irq(s->bus);
1293 break;
1294 }
1295 default:
1296 goto abort_cmd;
1297 }
1298 break;
1299 case WIN_FLUSH_CACHE:
1300 case WIN_FLUSH_CACHE_EXT:
1301 ide_flush_cache(s);
1302 break;
1303 case WIN_STANDBY:
1304 case WIN_STANDBY2:
1305 case WIN_STANDBYNOW1:
1306 case WIN_STANDBYNOW2:
1307 case WIN_IDLEIMMEDIATE:
1308 case WIN_IDLEIMMEDIATE2:
1309 case WIN_SETIDLE1:
1310 case WIN_SETIDLE2:
1311 case WIN_SLEEPNOW1:
1312 case WIN_SLEEPNOW2:
1313 s->status = READY_STAT;
1314 ide_set_irq(s->bus);
1315 break;
1316 case WIN_SEEK:
1317 /* XXX: Check that seek is within bounds */
1318 s->status = READY_STAT | SEEK_STAT;
1319 ide_set_irq(s->bus);
1320 break;
1321 /* ATAPI commands */
1322 case WIN_PIDENTIFY:
1323 ide_atapi_identify(s);
1324 s->status = READY_STAT | SEEK_STAT;
1325 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1326 ide_set_irq(s->bus);
1327 break;
1328 case WIN_DIAGNOSE:
1329 ide_set_signature(s);
1330 if (s->drive_kind == IDE_CD)
1331 s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1332 * devices to return a clear status register
1333 * with READY_STAT *not* set. */
1334 else
1335 s->status = READY_STAT | SEEK_STAT;
1336 s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1337 * present.
1338 */
1339 ide_set_irq(s->bus);
1340 break;
1341 case WIN_DEVICE_RESET:
1342 ide_set_signature(s);
1343 s->status = 0x00; /* NOTE: READY is _not_ set */
1344 s->error = 0x01;
1345 break;
1346 case WIN_PACKETCMD:
1347 /* overlapping commands not supported */
1348 if (s->feature & 0x02)
1349 goto abort_cmd;
1350 s->status = READY_STAT | SEEK_STAT;
1351 s->atapi_dma = s->feature & 1;
1352 s->nsector = 1;
1353 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1354 ide_atapi_cmd);
1355 break;
1356 /* CF-ATA commands */
1357 case CFA_REQ_EXT_ERROR_CODE:
1358 s->error = 0x09; /* miscellaneous error */
1359 s->status = READY_STAT | SEEK_STAT;
1360 ide_set_irq(s->bus);
1361 break;
1362 case CFA_ERASE_SECTORS:
1363 case CFA_WEAR_LEVEL:
1364 #if 0
1365 /* This one has the same ID as CFA_WEAR_LEVEL and is required for
1366 Windows 8 to work with AHCI */
1367 case WIN_SECURITY_FREEZE_LOCK:
1368 #endif
1369 if (val == CFA_WEAR_LEVEL)
1370 s->nsector = 0;
1371 if (val == CFA_ERASE_SECTORS)
1372 s->media_changed = 1;
1373 s->error = 0x00;
1374 s->status = READY_STAT | SEEK_STAT;
1375 ide_set_irq(s->bus);
1376 break;
1377 case CFA_TRANSLATE_SECTOR:
1378 s->error = 0x00;
1379 s->status = READY_STAT | SEEK_STAT;
1380 memset(s->io_buffer, 0, 0x200);
1381 s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */
1382 s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */
1383 s->io_buffer[0x02] = s->select; /* Head */
1384 s->io_buffer[0x03] = s->sector; /* Sector */
1385 s->io_buffer[0x04] = ide_get_sector(s) >> 16; /* LBA MSB */
1386 s->io_buffer[0x05] = ide_get_sector(s) >> 8; /* LBA */
1387 s->io_buffer[0x06] = ide_get_sector(s) >> 0; /* LBA LSB */
1388 s->io_buffer[0x13] = 0x00; /* Erase flag */
1389 s->io_buffer[0x18] = 0x00; /* Hot count */
1390 s->io_buffer[0x19] = 0x00; /* Hot count */
1391 s->io_buffer[0x1a] = 0x01; /* Hot count */
1392 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1393 ide_set_irq(s->bus);
1394 break;
1395 case CFA_ACCESS_METADATA_STORAGE:
1396 switch (s->feature) {
1397 case 0x02: /* Inquiry Metadata Storage */
1398 ide_cfata_metadata_inquiry(s);
1399 break;
1400 case 0x03: /* Read Metadata Storage */
1401 ide_cfata_metadata_read(s);
1402 break;
1403 case 0x04: /* Write Metadata Storage */
1404 ide_cfata_metadata_write(s);
1405 break;
1406 default:
1407 goto abort_cmd;
1408 }
1409 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1410 s->status = 0x00; /* NOTE: READY is _not_ set */
1411 ide_set_irq(s->bus);
1412 break;
1413 case IBM_SENSE_CONDITION:
1414 switch (s->feature) {
1415 case 0x01: /* sense temperature in device */
1416 s->nsector = 0x50; /* +20 C */
1417 break;
1418 default:
1419 goto abort_cmd;
1420 }
1421 s->status = READY_STAT | SEEK_STAT;
1422 ide_set_irq(s->bus);
1423 break;
1424
1425 case WIN_SMART:
1426 if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
1427 goto abort_cmd;
1428 if (!s->smart_enabled && s->feature != SMART_ENABLE)
1429 goto abort_cmd;
1430 switch (s->feature) {
1431 case SMART_DISABLE:
1432 s->smart_enabled = 0;
1433 s->status = READY_STAT | SEEK_STAT;
1434 ide_set_irq(s->bus);
1435 break;
1436 case SMART_ENABLE:
1437 s->smart_enabled = 1;
1438 s->status = READY_STAT | SEEK_STAT;
1439 ide_set_irq(s->bus);
1440 break;
1441 case SMART_ATTR_AUTOSAVE:
1442 switch (s->sector) {
1443 case 0x00:
1444 s->smart_autosave = 0;
1445 break;
1446 case 0xf1:
1447 s->smart_autosave = 1;
1448 break;
1449 default:
1450 goto abort_cmd;
1451 }
1452 s->status = READY_STAT | SEEK_STAT;
1453 ide_set_irq(s->bus);
1454 break;
1455 case SMART_STATUS:
1456 if (!s->smart_errors) {
1457 s->hcyl = 0xc2;
1458 s->lcyl = 0x4f;
1459 } else {
1460 s->hcyl = 0x2c;
1461 s->lcyl = 0xf4;
1462 }
1463 s->status = READY_STAT | SEEK_STAT;
1464 ide_set_irq(s->bus);
1465 break;
1466 case SMART_READ_THRESH:
1467 memset(s->io_buffer, 0, 0x200);
1468 s->io_buffer[0] = 0x01; /* smart struct version */
1469 for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1470 s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
1471 s->io_buffer[2+1+(n*12)] = smart_attributes[n][11];
1472 }
1473 for (n=0; n<511; n++) /* checksum */
1474 s->io_buffer[511] += s->io_buffer[n];
1475 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1476 s->status = READY_STAT | SEEK_STAT;
1477 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1478 ide_set_irq(s->bus);
1479 break;
1480 case SMART_READ_DATA:
1481 memset(s->io_buffer, 0, 0x200);
1482 s->io_buffer[0] = 0x01; /* smart struct version */
1483 for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1484 int i;
1485 for(i = 0; i < 11; i++) {
1486 s->io_buffer[2+i+(n*12)] = smart_attributes[n][i];
1487 }
1488 }
1489 s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
1490 if (s->smart_selftest_count == 0) {
1491 s->io_buffer[363] = 0;
1492 } else {
1493 s->io_buffer[363] =
1494 s->smart_selftest_data[3 +
1495 (s->smart_selftest_count - 1) *
1496 24];
1497 }
1498 s->io_buffer[364] = 0x20;
1499 s->io_buffer[365] = 0x01;
1500 /* offline data collection capacity: execute + self-test*/
1501 s->io_buffer[367] = (1<<4 | 1<<3 | 1);
1502 s->io_buffer[368] = 0x03; /* smart capability (1) */
1503 s->io_buffer[369] = 0x00; /* smart capability (2) */
1504 s->io_buffer[370] = 0x01; /* error logging supported */
1505 s->io_buffer[372] = 0x02; /* minutes for poll short test */
1506 s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1507 s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1508
1509 for (n=0; n<511; n++)
1510 s->io_buffer[511] += s->io_buffer[n];
1511 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1512 s->status = READY_STAT | SEEK_STAT;
1513 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1514 ide_set_irq(s->bus);
1515 break;
1516 case SMART_READ_LOG:
1517 switch (s->sector) {
1518 case 0x01: /* summary smart error log */
1519 memset(s->io_buffer, 0, 0x200);
1520 s->io_buffer[0] = 0x01;
1521 s->io_buffer[1] = 0x00; /* no error entries */
1522 s->io_buffer[452] = s->smart_errors & 0xff;
1523 s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
1524
1525 for (n=0; n<511; n++)
1526 s->io_buffer[511] += s->io_buffer[n];
1527 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1528 break;
1529 case 0x06: /* smart self test log */
1530 memset(s->io_buffer, 0, 0x200);
1531 s->io_buffer[0] = 0x01;
1532 if (s->smart_selftest_count == 0) {
1533 s->io_buffer[508] = 0;
1534 } else {
1535 s->io_buffer[508] = s->smart_selftest_count;
1536 for (n=2; n<506; n++)
1537 s->io_buffer[n] = s->smart_selftest_data[n];
1538 }
1539 for (n=0; n<511; n++)
1540 s->io_buffer[511] += s->io_buffer[n];
1541 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1542 break;
1543 default:
1544 goto abort_cmd;
1545 }
1546 s->status = READY_STAT | SEEK_STAT;
1547 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1548 ide_set_irq(s->bus);
1549 break;
1550 case SMART_EXECUTE_OFFLINE:
1551 switch (s->sector) {
1552 case 0: /* off-line routine */
1553 case 1: /* short self test */
1554 case 2: /* extended self test */
1555 s->smart_selftest_count++;
1556 if(s->smart_selftest_count > 21)
1557 s->smart_selftest_count = 0;
1558 n = 2 + (s->smart_selftest_count - 1) * 24;
1559 s->smart_selftest_data[n] = s->sector;
1560 s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
1561 s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
1562 s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
1563 s->status = READY_STAT | SEEK_STAT;
1564 ide_set_irq(s->bus);
1565 break;
1566 default:
1567 goto abort_cmd;
1568 }
1569 break;
1570 default:
1571 goto abort_cmd;
1572 }
1573 break;
1574 default:
1575 /* should not be reachable */
1576 abort_cmd:
1577 ide_abort_command(s);
1578 ide_set_irq(s->bus);
1579 break;
1580 }
1581 }
1582
1583 uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1584 {
1585 IDEBus *bus = opaque;
1586 IDEState *s = idebus_active_if(bus);
1587 uint32_t addr;
1588 int ret, hob;
1589
1590 addr = addr1 & 7;
1591 /* FIXME: HOB readback uses bit 7, but it's always set right now */
1592 //hob = s->select & (1 << 7);
1593 hob = 0;
1594 switch(addr) {
1595 case 0:
1596 ret = 0xff;
1597 break;
1598 case 1:
1599 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1600 (s != bus->ifs && !s->bs))
1601 ret = 0;
1602 else if (!hob)
1603 ret = s->error;
1604 else
1605 ret = s->hob_feature;
1606 break;
1607 case 2:
1608 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1609 ret = 0;
1610 else if (!hob)
1611 ret = s->nsector & 0xff;
1612 else
1613 ret = s->hob_nsector;
1614 break;
1615 case 3:
1616 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1617 ret = 0;
1618 else if (!hob)
1619 ret = s->sector;
1620 else
1621 ret = s->hob_sector;
1622 break;
1623 case 4:
1624 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1625 ret = 0;
1626 else if (!hob)
1627 ret = s->lcyl;
1628 else
1629 ret = s->hob_lcyl;
1630 break;
1631 case 5:
1632 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1633 ret = 0;
1634 else if (!hob)
1635 ret = s->hcyl;
1636 else
1637 ret = s->hob_hcyl;
1638 break;
1639 case 6:
1640 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1641 ret = 0;
1642 else
1643 ret = s->select;
1644 break;
1645 default:
1646 case 7:
1647 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1648 (s != bus->ifs && !s->bs))
1649 ret = 0;
1650 else
1651 ret = s->status;
1652 qemu_irq_lower(bus->irq);
1653 break;
1654 }
1655 #ifdef DEBUG_IDE
1656 printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1657 #endif
1658 return ret;
1659 }
1660
1661 uint32_t ide_status_read(void *opaque, uint32_t addr)
1662 {
1663 IDEBus *bus = opaque;
1664 IDEState *s = idebus_active_if(bus);
1665 int ret;
1666
1667 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1668 (s != bus->ifs && !s->bs))
1669 ret = 0;
1670 else
1671 ret = s->status;
1672 #ifdef DEBUG_IDE
1673 printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1674 #endif
1675 return ret;
1676 }
1677
1678 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1679 {
1680 IDEBus *bus = opaque;
1681 IDEState *s;
1682 int i;
1683
1684 #ifdef DEBUG_IDE
1685 printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1686 #endif
1687 /* common for both drives */
1688 if (!(bus->cmd & IDE_CMD_RESET) &&
1689 (val & IDE_CMD_RESET)) {
1690 /* reset low to high */
1691 for(i = 0;i < 2; i++) {
1692 s = &bus->ifs[i];
1693 s->status = BUSY_STAT | SEEK_STAT;
1694 s->error = 0x01;
1695 }
1696 } else if ((bus->cmd & IDE_CMD_RESET) &&
1697 !(val & IDE_CMD_RESET)) {
1698 /* high to low */
1699 for(i = 0;i < 2; i++) {
1700 s = &bus->ifs[i];
1701 if (s->drive_kind == IDE_CD)
1702 s->status = 0x00; /* NOTE: READY is _not_ set */
1703 else
1704 s->status = READY_STAT | SEEK_STAT;
1705 ide_set_signature(s);
1706 }
1707 }
1708
1709 bus->cmd = val;
1710 }
1711
1712 /*
1713 * Returns true if the running PIO transfer is a PIO out (i.e. data is
1714 * transferred from the device to the guest), false if it's a PIO in
1715 */
1716 static bool ide_is_pio_out(IDEState *s)
1717 {
1718 if (s->end_transfer_func == ide_sector_write ||
1719 s->end_transfer_func == ide_atapi_cmd) {
1720 return false;
1721 } else if (s->end_transfer_func == ide_sector_read ||
1722 s->end_transfer_func == ide_transfer_stop ||
1723 s->end_transfer_func == ide_atapi_cmd_reply_end ||
1724 s->end_transfer_func == ide_dummy_transfer_stop) {
1725 return true;
1726 }
1727
1728 abort();
1729 }
1730
1731 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1732 {
1733 IDEBus *bus = opaque;
1734 IDEState *s = idebus_active_if(bus);
1735 uint8_t *p;
1736
1737 /* PIO data access allowed only when DRQ bit is set. The result of a write
1738 * during PIO out is indeterminate, just ignore it. */
1739 if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1740 return;
1741 }
1742
1743 p = s->data_ptr;
1744 *(uint16_t *)p = le16_to_cpu(val);
1745 p += 2;
1746 s->data_ptr = p;
1747 if (p >= s->data_end)
1748 s->end_transfer_func(s);
1749 }
1750
1751 uint32_t ide_data_readw(void *opaque, uint32_t addr)
1752 {
1753 IDEBus *bus = opaque;
1754 IDEState *s = idebus_active_if(bus);
1755 uint8_t *p;
1756 int ret;
1757
1758 /* PIO data access allowed only when DRQ bit is set. The result of a read
1759 * during PIO in is indeterminate, return 0 and don't move forward. */
1760 if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1761 return 0;
1762 }
1763
1764 p = s->data_ptr;
1765 ret = cpu_to_le16(*(uint16_t *)p);
1766 p += 2;
1767 s->data_ptr = p;
1768 if (p >= s->data_end)
1769 s->end_transfer_func(s);
1770 return ret;
1771 }
1772
1773 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1774 {
1775 IDEBus *bus = opaque;
1776 IDEState *s = idebus_active_if(bus);
1777 uint8_t *p;
1778
1779 /* PIO data access allowed only when DRQ bit is set. The result of a write
1780 * during PIO out is indeterminate, just ignore it. */
1781 if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1782 return;
1783 }
1784
1785 p = s->data_ptr;
1786 *(uint32_t *)p = le32_to_cpu(val);
1787 p += 4;
1788 s->data_ptr = p;
1789 if (p >= s->data_end)
1790 s->end_transfer_func(s);
1791 }
1792
1793 uint32_t ide_data_readl(void *opaque, uint32_t addr)
1794 {
1795 IDEBus *bus = opaque;
1796 IDEState *s = idebus_active_if(bus);
1797 uint8_t *p;
1798 int ret;
1799
1800 /* PIO data access allowed only when DRQ bit is set. The result of a read
1801 * during PIO in is indeterminate, return 0 and don't move forward. */
1802 if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1803 return 0;
1804 }
1805
1806 p = s->data_ptr;
1807 ret = cpu_to_le32(*(uint32_t *)p);
1808 p += 4;
1809 s->data_ptr = p;
1810 if (p >= s->data_end)
1811 s->end_transfer_func(s);
1812 return ret;
1813 }
1814
1815 static void ide_dummy_transfer_stop(IDEState *s)
1816 {
1817 s->data_ptr = s->io_buffer;
1818 s->data_end = s->io_buffer;
1819 s->io_buffer[0] = 0xff;
1820 s->io_buffer[1] = 0xff;
1821 s->io_buffer[2] = 0xff;
1822 s->io_buffer[3] = 0xff;
1823 }
1824
1825 static void ide_reset(IDEState *s)
1826 {
1827 #ifdef DEBUG_IDE
1828 printf("ide: reset\n");
1829 #endif
1830
1831 if (s->pio_aiocb) {
1832 bdrv_aio_cancel(s->pio_aiocb);
1833 s->pio_aiocb = NULL;
1834 }
1835
1836 if (s->drive_kind == IDE_CFATA)
1837 s->mult_sectors = 0;
1838 else
1839 s->mult_sectors = MAX_MULT_SECTORS;
1840 /* ide regs */
1841 s->feature = 0;
1842 s->error = 0;
1843 s->nsector = 0;
1844 s->sector = 0;
1845 s->lcyl = 0;
1846 s->hcyl = 0;
1847
1848 /* lba48 */
1849 s->hob_feature = 0;
1850 s->hob_sector = 0;
1851 s->hob_nsector = 0;
1852 s->hob_lcyl = 0;
1853 s->hob_hcyl = 0;
1854
1855 s->select = 0xa0;
1856 s->status = READY_STAT | SEEK_STAT;
1857
1858 s->lba48 = 0;
1859
1860 /* ATAPI specific */
1861 s->sense_key = 0;
1862 s->asc = 0;
1863 s->cdrom_changed = 0;
1864 s->packet_transfer_size = 0;
1865 s->elementary_transfer_size = 0;
1866 s->io_buffer_index = 0;
1867 s->cd_sector_size = 0;
1868 s->atapi_dma = 0;
1869 /* ATA DMA state */
1870 s->io_buffer_size = 0;
1871 s->req_nb_sectors = 0;
1872
1873 ide_set_signature(s);
1874 /* init the transfer handler so that 0xffff is returned on data
1875 accesses */
1876 s->end_transfer_func = ide_dummy_transfer_stop;
1877 ide_dummy_transfer_stop(s);
1878 s->media_changed = 0;
1879 }
1880
1881 void ide_bus_reset(IDEBus *bus)
1882 {
1883 bus->unit = 0;
1884 bus->cmd = 0;
1885 ide_reset(&bus->ifs[0]);
1886 ide_reset(&bus->ifs[1]);
1887 ide_clear_hob(bus);
1888
1889 /* pending async DMA */
1890 if (bus->dma->aiocb) {
1891 #ifdef DEBUG_AIO
1892 printf("aio_cancel\n");
1893 #endif
1894 bdrv_aio_cancel(bus->dma->aiocb);
1895 bus->dma->aiocb = NULL;
1896 }
1897
1898 /* reset dma provider too */
1899 bus->dma->ops->reset(bus->dma);
1900 }
1901
1902 static bool ide_cd_is_tray_open(void *opaque)
1903 {
1904 return ((IDEState *)opaque)->tray_open;
1905 }
1906
1907 static bool ide_cd_is_medium_locked(void *opaque)
1908 {
1909 return ((IDEState *)opaque)->tray_locked;
1910 }
1911
1912 static const BlockDevOps ide_cd_block_ops = {
1913 .change_media_cb = ide_cd_change_cb,
1914 .eject_request_cb = ide_cd_eject_request_cb,
1915 .is_tray_open = ide_cd_is_tray_open,
1916 .is_medium_locked = ide_cd_is_medium_locked,
1917 };
1918
1919 int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
1920 const char *version, const char *serial, const char *model,
1921 uint64_t wwn,
1922 uint32_t cylinders, uint32_t heads, uint32_t secs,
1923 int chs_trans)
1924 {
1925 uint64_t nb_sectors;
1926
1927 s->bs = bs;
1928 s->drive_kind = kind;
1929
1930 bdrv_get_geometry(bs, &nb_sectors);
1931 s->cylinders = cylinders;
1932 s->heads = heads;
1933 s->sectors = secs;
1934 s->chs_trans = chs_trans;
1935 s->nb_sectors = nb_sectors;
1936 s->wwn = wwn;
1937 /* The SMART values should be preserved across power cycles
1938 but they aren't. */
1939 s->smart_enabled = 1;
1940 s->smart_autosave = 1;
1941 s->smart_errors = 0;
1942 s->smart_selftest_count = 0;
1943 if (kind == IDE_CD) {
1944 bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);
1945 bdrv_set_buffer_alignment(bs, 2048);
1946 } else {
1947 if (!bdrv_is_inserted(s->bs)) {
1948 error_report("Device needs media, but drive is empty");
1949 return -1;
1950 }
1951 if (bdrv_is_read_only(bs)) {
1952 error_report("Can't use a read-only drive");
1953 return -1;
1954 }
1955 }
1956 if (serial) {
1957 pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
1958 } else {
1959 snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
1960 "QM%05d", s->drive_serial);
1961 }
1962 if (model) {
1963 pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);
1964 } else {
1965 switch (kind) {
1966 case IDE_CD:
1967 strcpy(s->drive_model_str, "QEMU DVD-ROM");
1968 break;
1969 case IDE_CFATA:
1970 strcpy(s->drive_model_str, "QEMU MICRODRIVE");
1971 break;
1972 default:
1973 strcpy(s->drive_model_str, "QEMU HARDDISK");
1974 break;
1975 }
1976 }
1977
1978 if (version) {
1979 pstrcpy(s->version, sizeof(s->version), version);
1980 } else {
1981 pstrcpy(s->version, sizeof(s->version), qemu_get_version());
1982 }
1983
1984 ide_reset(s);
1985 bdrv_iostatus_enable(bs);
1986 return 0;
1987 }
1988
1989 static void ide_init1(IDEBus *bus, int unit)
1990 {
1991 static int drive_serial = 1;
1992 IDEState *s = &bus->ifs[unit];
1993
1994 s->bus = bus;
1995 s->unit = unit;
1996 s->drive_serial = drive_serial++;
1997 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
1998 s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
1999 s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
2000 memset(s->io_buffer, 0, s->io_buffer_total_len);
2001
2002 s->smart_selftest_data = qemu_blockalign(s->bs, 512);
2003 memset(s->smart_selftest_data, 0, 512);
2004
2005 s->sector_write_timer = qemu_new_timer_ns(vm_clock,
2006 ide_sector_write_timer_cb, s);
2007 }
2008
2009 static void ide_nop_start(IDEDMA *dma, IDEState *s,
2010 BlockDriverCompletionFunc *cb)
2011 {
2012 }
2013
2014 static int ide_nop(IDEDMA *dma)
2015 {
2016 return 0;
2017 }
2018
2019 static int ide_nop_int(IDEDMA *dma, int x)
2020 {
2021 return 0;
2022 }
2023
2024 static void ide_nop_restart(void *opaque, int x, RunState y)
2025 {
2026 }
2027
2028 static const IDEDMAOps ide_dma_nop_ops = {
2029 .start_dma = ide_nop_start,
2030 .start_transfer = ide_nop,
2031 .prepare_buf = ide_nop_int,
2032 .rw_buf = ide_nop_int,
2033 .set_unit = ide_nop_int,
2034 .add_status = ide_nop_int,
2035 .set_inactive = ide_nop,
2036 .restart_cb = ide_nop_restart,
2037 .reset = ide_nop,
2038 };
2039
2040 static IDEDMA ide_dma_nop = {
2041 .ops = &ide_dma_nop_ops,
2042 .aiocb = NULL,
2043 };
2044
2045 void ide_init2(IDEBus *bus, qemu_irq irq)
2046 {
2047 int i;
2048
2049 for(i = 0; i < 2; i++) {
2050 ide_init1(bus, i);
2051 ide_reset(&bus->ifs[i]);
2052 }
2053 bus->irq = irq;
2054 bus->dma = &ide_dma_nop;
2055 }
2056
2057 /* TODO convert users to qdev and remove */
2058 void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
2059 DriveInfo *hd1, qemu_irq irq)
2060 {
2061 int i, trans;
2062 DriveInfo *dinfo;
2063 uint32_t cyls, heads, secs;
2064
2065 for(i = 0; i < 2; i++) {
2066 dinfo = i == 0 ? hd0 : hd1;
2067 ide_init1(bus, i);
2068 if (dinfo) {
2069 cyls = dinfo->cyls;
2070 heads = dinfo->heads;
2071 secs = dinfo->secs;
2072 trans = dinfo->trans;
2073 if (!cyls && !heads && !secs) {
2074 hd_geometry_guess(dinfo->bdrv, &cyls, &heads, &secs, &trans);
2075 } else if (trans == BIOS_ATA_TRANSLATION_AUTO) {
2076 trans = hd_bios_chs_auto_trans(cyls, heads, secs);
2077 }
2078 if (cyls < 1 || cyls > 65535) {
2079 error_report("cyls must be between 1 and 65535");
2080 exit(1);
2081 }
2082 if (heads < 1 || heads > 16) {
2083 error_report("heads must be between 1 and 16");
2084 exit(1);
2085 }
2086 if (secs < 1 || secs > 255) {
2087 error_report("secs must be between 1 and 255");
2088 exit(1);
2089 }
2090 if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
2091 dinfo->media_cd ? IDE_CD : IDE_HD,
2092 NULL, dinfo->serial, NULL, 0,
2093 cyls, heads, secs, trans) < 0) {
2094 error_report("Can't set up IDE drive %s", dinfo->id);
2095 exit(1);
2096 }
2097 bdrv_attach_dev_nofail(dinfo->bdrv, &bus->ifs[i]);
2098 } else {
2099 ide_reset(&bus->ifs[i]);
2100 }
2101 }
2102 bus->irq = irq;
2103 bus->dma = &ide_dma_nop;
2104 }
2105
2106 static const MemoryRegionPortio ide_portio_list[] = {
2107 { 0, 8, 1, .read = ide_ioport_read, .write = ide_ioport_write },
2108 { 0, 2, 2, .read = ide_data_readw, .write = ide_data_writew },
2109 { 0, 4, 4, .read = ide_data_readl, .write = ide_data_writel },
2110 PORTIO_END_OF_LIST(),
2111 };
2112
2113 static const MemoryRegionPortio ide_portio2_list[] = {
2114 { 0, 1, 1, .read = ide_status_read, .write = ide_cmd_write },
2115 PORTIO_END_OF_LIST(),
2116 };
2117
2118 void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
2119 {
2120 /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
2121 bridge has been setup properly to always register with ISA. */
2122 isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide");
2123
2124 if (iobase2) {
2125 isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide");
2126 }
2127 }
2128
2129 static bool is_identify_set(void *opaque, int version_id)
2130 {
2131 IDEState *s = opaque;
2132
2133 return s->identify_set != 0;
2134 }
2135
2136 static EndTransferFunc* transfer_end_table[] = {
2137 ide_sector_read,
2138 ide_sector_write,
2139 ide_transfer_stop,
2140 ide_atapi_cmd_reply_end,
2141 ide_atapi_cmd,
2142 ide_dummy_transfer_stop,
2143 };
2144
2145 static int transfer_end_table_idx(EndTransferFunc *fn)
2146 {
2147 int i;
2148
2149 for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2150 if (transfer_end_table[i] == fn)
2151 return i;
2152
2153 return -1;
2154 }
2155
2156 static int ide_drive_post_load(void *opaque, int version_id)
2157 {
2158 IDEState *s = opaque;
2159
2160 if (version_id < 3) {
2161 if (s->sense_key == UNIT_ATTENTION &&
2162 s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
2163 s->cdrom_changed = 1;
2164 }
2165 }
2166 if (s->identify_set) {
2167 bdrv_set_enable_write_cache(s->bs, !!(s->identify_data[85] & (1 << 5)));
2168 }
2169 return 0;
2170 }
2171
2172 static int ide_drive_pio_post_load(void *opaque, int version_id)
2173 {
2174 IDEState *s = opaque;
2175
2176 if (s->end_transfer_fn_idx >= ARRAY_SIZE(transfer_end_table)) {
2177 return -EINVAL;
2178 }
2179 s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2180 s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2181 s->data_end = s->data_ptr + s->cur_io_buffer_len;
2182
2183 return 0;
2184 }
2185
2186 static void ide_drive_pio_pre_save(void *opaque)
2187 {
2188 IDEState *s = opaque;
2189 int idx;
2190
2191 s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2192 s->cur_io_buffer_len = s->data_end - s->data_ptr;
2193
2194 idx = transfer_end_table_idx(s->end_transfer_func);
2195 if (idx == -1) {
2196 fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2197 __func__);
2198 s->end_transfer_fn_idx = 2;
2199 } else {
2200 s->end_transfer_fn_idx = idx;
2201 }
2202 }
2203
2204 static bool ide_drive_pio_state_needed(void *opaque)
2205 {
2206 IDEState *s = opaque;
2207
2208 return ((s->status & DRQ_STAT) != 0)
2209 || (s->bus->error_status & BM_STATUS_PIO_RETRY);
2210 }
2211
2212 static bool ide_tray_state_needed(void *opaque)
2213 {
2214 IDEState *s = opaque;
2215
2216 return s->tray_open || s->tray_locked;
2217 }
2218
2219 static bool ide_atapi_gesn_needed(void *opaque)
2220 {
2221 IDEState *s = opaque;
2222
2223 return s->events.new_media || s->events.eject_request;
2224 }
2225
2226 static bool ide_error_needed(void *opaque)
2227 {
2228 IDEBus *bus = opaque;
2229
2230 return (bus->error_status != 0);
2231 }
2232
2233 /* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
2234 static const VMStateDescription vmstate_ide_atapi_gesn_state = {
2235 .name ="ide_drive/atapi/gesn_state",
2236 .version_id = 1,
2237 .minimum_version_id = 1,
2238 .minimum_version_id_old = 1,
2239 .fields = (VMStateField []) {
2240 VMSTATE_BOOL(events.new_media, IDEState),
2241 VMSTATE_BOOL(events.eject_request, IDEState),
2242 VMSTATE_END_OF_LIST()
2243 }
2244 };
2245
2246 static const VMStateDescription vmstate_ide_tray_state = {
2247 .name = "ide_drive/tray_state",
2248 .version_id = 1,
2249 .minimum_version_id = 1,
2250 .minimum_version_id_old = 1,
2251 .fields = (VMStateField[]) {
2252 VMSTATE_BOOL(tray_open, IDEState),
2253 VMSTATE_BOOL(tray_locked, IDEState),
2254 VMSTATE_END_OF_LIST()
2255 }
2256 };
2257
2258 static const VMStateDescription vmstate_ide_drive_pio_state = {
2259 .name = "ide_drive/pio_state",
2260 .version_id = 1,
2261 .minimum_version_id = 1,
2262 .minimum_version_id_old = 1,
2263 .pre_save = ide_drive_pio_pre_save,
2264 .post_load = ide_drive_pio_post_load,
2265 .fields = (VMStateField []) {
2266 VMSTATE_INT32(req_nb_sectors, IDEState),
2267 VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2268 vmstate_info_uint8, uint8_t),
2269 VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2270 VMSTATE_INT32(cur_io_buffer_len, IDEState),
2271 VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2272 VMSTATE_INT32(elementary_transfer_size, IDEState),
2273 VMSTATE_INT32(packet_transfer_size, IDEState),
2274 VMSTATE_END_OF_LIST()
2275 }
2276 };
2277
2278 const VMStateDescription vmstate_ide_drive = {
2279 .name = "ide_drive",
2280 .version_id = 3,
2281 .minimum_version_id = 0,
2282 .minimum_version_id_old = 0,
2283 .post_load = ide_drive_post_load,
2284 .fields = (VMStateField []) {
2285 VMSTATE_INT32(mult_sectors, IDEState),
2286 VMSTATE_INT32(identify_set, IDEState),
2287 VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2288 VMSTATE_UINT8(feature, IDEState),
2289 VMSTATE_UINT8(error, IDEState),
2290 VMSTATE_UINT32(nsector, IDEState),
2291 VMSTATE_UINT8(sector, IDEState),
2292 VMSTATE_UINT8(lcyl, IDEState),
2293 VMSTATE_UINT8(hcyl, IDEState),
2294 VMSTATE_UINT8(hob_feature, IDEState),
2295 VMSTATE_UINT8(hob_sector, IDEState),
2296 VMSTATE_UINT8(hob_nsector, IDEState),
2297 VMSTATE_UINT8(hob_lcyl, IDEState),
2298 VMSTATE_UINT8(hob_hcyl, IDEState),
2299 VMSTATE_UINT8(select, IDEState),
2300 VMSTATE_UINT8(status, IDEState),
2301 VMSTATE_UINT8(lba48, IDEState),
2302 VMSTATE_UINT8(sense_key, IDEState),
2303 VMSTATE_UINT8(asc, IDEState),
2304 VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2305 VMSTATE_END_OF_LIST()
2306 },
2307 .subsections = (VMStateSubsection []) {
2308 {
2309 .vmsd = &vmstate_ide_drive_pio_state,
2310 .needed = ide_drive_pio_state_needed,
2311 }, {
2312 .vmsd = &vmstate_ide_tray_state,
2313 .needed = ide_tray_state_needed,
2314 }, {
2315 .vmsd = &vmstate_ide_atapi_gesn_state,
2316 .needed = ide_atapi_gesn_needed,
2317 }, {
2318 /* empty */
2319 }
2320 }
2321 };
2322
2323 static const VMStateDescription vmstate_ide_error_status = {
2324 .name ="ide_bus/error",
2325 .version_id = 1,
2326 .minimum_version_id = 1,
2327 .minimum_version_id_old = 1,
2328 .fields = (VMStateField []) {
2329 VMSTATE_INT32(error_status, IDEBus),
2330 VMSTATE_END_OF_LIST()
2331 }
2332 };
2333
2334 const VMStateDescription vmstate_ide_bus = {
2335 .name = "ide_bus",
2336 .version_id = 1,
2337 .minimum_version_id = 1,
2338 .minimum_version_id_old = 1,
2339 .fields = (VMStateField []) {
2340 VMSTATE_UINT8(cmd, IDEBus),
2341 VMSTATE_UINT8(unit, IDEBus),
2342 VMSTATE_END_OF_LIST()
2343 },
2344 .subsections = (VMStateSubsection []) {
2345 {
2346 .vmsd = &vmstate_ide_error_status,
2347 .needed = ide_error_needed,
2348 }, {
2349 /* empty */
2350 }
2351 }
2352 };
2353
2354 void ide_drive_get(DriveInfo **hd, int max_bus)
2355 {
2356 int i;
2357
2358 if (drive_get_max_bus(IF_IDE) >= max_bus) {
2359 fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2360 exit(1);
2361 }
2362
2363 for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2364 hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
2365 }
2366 }