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