Commit aedf53821fef9f662c2f4fc0a83bc09e0768ed54
1 parent
7f5e1452
different serial number for each drive (initial patch by Mike Nordell)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@812 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
9 additions
and
2 deletions
hw/ide.c
| ... | ... | @@ -297,6 +297,7 @@ typedef struct IDEState { |
| 297 | 297 | int64_t nb_sectors; |
| 298 | 298 | int mult_sectors; |
| 299 | 299 | int irq; |
| 300 | + int drive_serial; | |
| 300 | 301 | /* ide regs */ |
| 301 | 302 | uint8_t feature; |
| 302 | 303 | uint8_t error; |
| ... | ... | @@ -359,6 +360,7 @@ static void ide_identify(IDEState *s) |
| 359 | 360 | { |
| 360 | 361 | uint16_t *p; |
| 361 | 362 | unsigned int oldsize; |
| 363 | + char buf[20]; | |
| 362 | 364 | |
| 363 | 365 | memset(s->io_buffer, 0, 512); |
| 364 | 366 | p = (uint16_t *)s->io_buffer; |
| ... | ... | @@ -368,7 +370,8 @@ static void ide_identify(IDEState *s) |
| 368 | 370 | put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */ |
| 369 | 371 | put_le16(p + 5, 512); /* XXX: retired, remove ? */ |
| 370 | 372 | put_le16(p + 6, s->sectors); |
| 371 | - padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */ | |
| 373 | + snprintf(buf, sizeof(buf), "QM%05d", s->drive_serial); | |
| 374 | + padstr((uint8_t *)(p + 10), buf, 20); /* serial number */ | |
| 372 | 375 | put_le16(p + 20, 3); /* XXX: retired, remove ? */ |
| 373 | 376 | put_le16(p + 21, 512); /* cache size in sectors */ |
| 374 | 377 | put_le16(p + 22, 4); /* ecc bytes */ |
| ... | ... | @@ -404,12 +407,14 @@ static void ide_identify(IDEState *s) |
| 404 | 407 | static void ide_atapi_identify(IDEState *s) |
| 405 | 408 | { |
| 406 | 409 | uint16_t *p; |
| 410 | + char buf[20]; | |
| 407 | 411 | |
| 408 | 412 | memset(s->io_buffer, 0, 512); |
| 409 | 413 | p = (uint16_t *)s->io_buffer; |
| 410 | 414 | /* Removable CDROM, 50us response, 12 byte packets */ |
| 411 | 415 | put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0)); |
| 412 | - padstr((uint8_t *)(p + 10), "QM00001", 20); /* serial number */ | |
| 416 | + snprintf(buf, sizeof(buf), "QM%05d", s->drive_serial); | |
| 417 | + padstr((uint8_t *)(p + 10), buf, 20); /* serial number */ | |
| 413 | 418 | put_le16(p + 20, 3); /* buffer type */ |
| 414 | 419 | put_le16(p + 21, 512); /* cache size in sectors */ |
| 415 | 420 | put_le16(p + 22, 4); /* ecc bytes */ |
| ... | ... | @@ -1432,6 +1437,7 @@ void ide_init(int iobase, int iobase2, int irq, |
| 1432 | 1437 | BlockDriverState *hd0, BlockDriverState *hd1) |
| 1433 | 1438 | { |
| 1434 | 1439 | IDEState *s, *ide_state; |
| 1440 | + static int drive_serial = 1; | |
| 1435 | 1441 | int i, cylinders, heads, secs; |
| 1436 | 1442 | int64_t nb_sectors; |
| 1437 | 1443 | |
| ... | ... | @@ -1473,6 +1479,7 @@ void ide_init(int iobase, int iobase2, int irq, |
| 1473 | 1479 | bdrv_set_change_cb(s->bs, cdrom_change_cb, s); |
| 1474 | 1480 | } |
| 1475 | 1481 | } |
| 1482 | + s->drive_serial = drive_serial++; | |
| 1476 | 1483 | s->irq = irq; |
| 1477 | 1484 | ide_reset(s); |
| 1478 | 1485 | } | ... | ... |