Revision 67b915a5 hw/ide.c
b/hw/ide.c | ||
---|---|---|
21 | 21 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
22 | 22 |
* THE SOFTWARE. |
23 | 23 |
*/ |
24 |
#include <stdlib.h> |
|
25 |
#include <stdio.h> |
|
26 |
#include <stdarg.h> |
|
27 |
#include <string.h> |
|
28 |
#include <getopt.h> |
|
29 |
#include <inttypes.h> |
|
30 |
#include <unistd.h> |
|
31 |
#include <sys/mman.h> |
|
32 |
#include <fcntl.h> |
|
33 |
#include <signal.h> |
|
34 |
#include <time.h> |
|
35 |
#include <sys/time.h> |
|
36 |
#include <malloc.h> |
|
37 |
#include <termios.h> |
|
38 |
#include <sys/poll.h> |
|
39 |
#include <errno.h> |
|
40 |
#include <sys/wait.h> |
|
41 |
#include <netinet/in.h> |
|
42 |
|
|
43 |
#define NO_THUNK_TYPE_SIZE |
|
44 |
#include "thunk.h" |
|
45 |
|
|
46 |
#include "cpu.h" |
|
47 |
#include "exec-all.h" |
|
48 |
|
|
49 | 24 |
#include "vl.h" |
50 | 25 |
|
51 | 26 |
/* debug IDE devices */ |
... | ... | |
375 | 350 |
} |
376 | 351 |
} |
377 | 352 |
|
353 |
static void put_le16(uint16_t *p, unsigned int v) |
|
354 |
{ |
|
355 |
#ifdef WORDS_BIGENDIAN |
|
356 |
*p = bswap16(v); |
|
357 |
#else |
|
358 |
*p = v; |
|
359 |
#endif |
|
360 |
} |
|
361 |
|
|
378 | 362 |
static void ide_identify(IDEState *s) |
379 | 363 |
{ |
380 | 364 |
uint16_t *p; |
... | ... | |
382 | 366 |
|
383 | 367 |
memset(s->io_buffer, 0, 512); |
384 | 368 |
p = (uint16_t *)s->io_buffer; |
385 |
stw_raw(p + 0, 0x0040);
|
|
386 |
stw_raw(p + 1, s->cylinders);
|
|
387 |
stw_raw(p + 3, s->heads);
|
|
388 |
stw_raw(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
|
|
389 |
stw_raw(p + 5, 512); /* XXX: retired, remove ? */
|
|
390 |
stw_raw(p + 6, s->sectors);
|
|
369 |
put_le16(p + 0, 0x0040);
|
|
370 |
put_le16(p + 1, s->cylinders);
|
|
371 |
put_le16(p + 3, s->heads);
|
|
372 |
put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
|
|
373 |
put_le16(p + 5, 512); /* XXX: retired, remove ? */
|
|
374 |
put_le16(p + 6, s->sectors);
|
|
391 | 375 |
padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */ |
392 |
stw_raw(p + 20, 3); /* XXX: retired, remove ? */
|
|
393 |
stw_raw(p + 21, 512); /* cache size in sectors */
|
|
394 |
stw_raw(p + 22, 4); /* ecc bytes */
|
|
376 |
put_le16(p + 20, 3); /* XXX: retired, remove ? */
|
|
377 |
put_le16(p + 21, 512); /* cache size in sectors */
|
|
378 |
put_le16(p + 22, 4); /* ecc bytes */
|
|
395 | 379 |
padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */ |
396 | 380 |
padstr((uint8_t *)(p + 27), "QEMU HARDDISK", 40); /* model */ |
397 | 381 |
#if MAX_MULT_SECTORS > 1 |
398 |
stw_raw(p + 47, 0x8000 | MAX_MULT_SECTORS);
|
|
382 |
put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
|
|
399 | 383 |
#endif |
400 |
stw_raw(p + 48, 1); /* dword I/O */
|
|
401 |
stw_raw(p + 49, 1 << 9); /* LBA supported, no DMA */
|
|
402 |
stw_raw(p + 51, 0x200); /* PIO transfer cycle */
|
|
403 |
stw_raw(p + 52, 0x200); /* DMA transfer cycle */
|
|
404 |
stw_raw(p + 53, 1); /* words 54-58 are valid */
|
|
405 |
stw_raw(p + 54, s->cylinders);
|
|
406 |
stw_raw(p + 55, s->heads);
|
|
407 |
stw_raw(p + 56, s->sectors);
|
|
384 |
put_le16(p + 48, 1); /* dword I/O */
|
|
385 |
put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
|
|
386 |
put_le16(p + 51, 0x200); /* PIO transfer cycle */
|
|
387 |
put_le16(p + 52, 0x200); /* DMA transfer cycle */
|
|
388 |
put_le16(p + 53, 1); /* words 54-58 are valid */
|
|
389 |
put_le16(p + 54, s->cylinders);
|
|
390 |
put_le16(p + 55, s->heads);
|
|
391 |
put_le16(p + 56, s->sectors);
|
|
408 | 392 |
oldsize = s->cylinders * s->heads * s->sectors; |
409 |
stw_raw(p + 57, oldsize);
|
|
410 |
stw_raw(p + 58, oldsize >> 16);
|
|
393 |
put_le16(p + 57, oldsize);
|
|
394 |
put_le16(p + 58, oldsize >> 16);
|
|
411 | 395 |
if (s->mult_sectors) |
412 |
stw_raw(p + 59, 0x100 | s->mult_sectors);
|
|
413 |
stw_raw(p + 60, s->nb_sectors);
|
|
414 |
stw_raw(p + 61, s->nb_sectors >> 16);
|
|
415 |
stw_raw(p + 80, (1 << 1) | (1 << 2));
|
|
416 |
stw_raw(p + 82, (1 << 14));
|
|
417 |
stw_raw(p + 83, (1 << 14));
|
|
418 |
stw_raw(p + 84, (1 << 14));
|
|
419 |
stw_raw(p + 85, (1 << 14));
|
|
420 |
stw_raw(p + 86, 0);
|
|
421 |
stw_raw(p + 87, (1 << 14));
|
|
396 |
put_le16(p + 59, 0x100 | s->mult_sectors);
|
|
397 |
put_le16(p + 60, s->nb_sectors);
|
|
398 |
put_le16(p + 61, s->nb_sectors >> 16);
|
|
399 |
put_le16(p + 80, (1 << 1) | (1 << 2));
|
|
400 |
put_le16(p + 82, (1 << 14));
|
|
401 |
put_le16(p + 83, (1 << 14));
|
|
402 |
put_le16(p + 84, (1 << 14));
|
|
403 |
put_le16(p + 85, (1 << 14));
|
|
404 |
put_le16(p + 86, 0);
|
|
405 |
put_le16(p + 87, (1 << 14));
|
|
422 | 406 |
} |
423 | 407 |
|
424 | 408 |
static void ide_atapi_identify(IDEState *s) |
... | ... | |
428 | 412 |
memset(s->io_buffer, 0, 512); |
429 | 413 |
p = (uint16_t *)s->io_buffer; |
430 | 414 |
/* Removable CDROM, 50us response, 12 byte packets */ |
431 |
stw_raw(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
|
|
432 |
stw_raw(p + 1, s->cylinders);
|
|
433 |
stw_raw(p + 3, s->heads);
|
|
434 |
stw_raw(p + 4, 512 * s->sectors); /* sectors */
|
|
435 |
stw_raw(p + 5, 512); /* sector size */
|
|
436 |
stw_raw(p + 6, s->sectors);
|
|
415 |
put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
|
|
416 |
put_le16(p + 1, s->cylinders);
|
|
417 |
put_le16(p + 3, s->heads);
|
|
418 |
put_le16(p + 4, 512 * s->sectors); /* sectors */
|
|
419 |
put_le16(p + 5, 512); /* sector size */
|
|
420 |
put_le16(p + 6, s->sectors);
|
|
437 | 421 |
padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */ |
438 |
stw_raw(p + 20, 3); /* buffer type */
|
|
439 |
stw_raw(p + 21, 512); /* cache size in sectors */
|
|
440 |
stw_raw(p + 22, 4); /* ecc bytes */
|
|
422 |
put_le16(p + 20, 3); /* buffer type */
|
|
423 |
put_le16(p + 21, 512); /* cache size in sectors */
|
|
424 |
put_le16(p + 22, 4); /* ecc bytes */
|
|
441 | 425 |
padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */ |
442 | 426 |
padstr((uint8_t *)(p + 27), "QEMU CD-ROM", 40); /* model */ |
443 |
stw_raw(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
|
|
444 |
stw_raw(p + 49, 1 << 9); /* LBA supported, no DMA */
|
|
445 |
stw_raw(p + 53, 3); /* words 64-70, 54-58 valid */
|
|
446 |
stw_raw(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
|
|
447 |
stw_raw(p + 64, 1); /* PIO modes */
|
|
448 |
stw_raw(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
|
|
449 |
stw_raw(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
|
|
450 |
stw_raw(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
|
|
451 |
stw_raw(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
|
|
427 |
put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
|
|
428 |
put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
|
|
429 |
put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
|
|
430 |
put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
|
|
431 |
put_le16(p + 64, 1); /* PIO modes */
|
|
432 |
put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
|
|
433 |
put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
|
|
434 |
put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
|
|
435 |
put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
|
|
452 | 436 |
|
453 |
stw_raw(p + 71, 30); /* in ns */
|
|
454 |
stw_raw(p + 72, 30); /* in ns */
|
|
437 |
put_le16(p + 71, 30); /* in ns */
|
|
438 |
put_le16(p + 72, 30); /* in ns */
|
|
455 | 439 |
|
456 |
stw_raw(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
|
|
440 |
put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
|
|
457 | 441 |
} |
458 | 442 |
|
459 | 443 |
static void ide_set_signature(IDEState *s) |
Also available in: Unified diff