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,6 +297,7 @@ typedef struct IDEState { | ||
297 | int64_t nb_sectors; | 297 | int64_t nb_sectors; |
298 | int mult_sectors; | 298 | int mult_sectors; |
299 | int irq; | 299 | int irq; |
300 | + int drive_serial; | ||
300 | /* ide regs */ | 301 | /* ide regs */ |
301 | uint8_t feature; | 302 | uint8_t feature; |
302 | uint8_t error; | 303 | uint8_t error; |
@@ -359,6 +360,7 @@ static void ide_identify(IDEState *s) | @@ -359,6 +360,7 @@ static void ide_identify(IDEState *s) | ||
359 | { | 360 | { |
360 | uint16_t *p; | 361 | uint16_t *p; |
361 | unsigned int oldsize; | 362 | unsigned int oldsize; |
363 | + char buf[20]; | ||
362 | 364 | ||
363 | memset(s->io_buffer, 0, 512); | 365 | memset(s->io_buffer, 0, 512); |
364 | p = (uint16_t *)s->io_buffer; | 366 | p = (uint16_t *)s->io_buffer; |
@@ -368,7 +370,8 @@ static void ide_identify(IDEState *s) | @@ -368,7 +370,8 @@ static void ide_identify(IDEState *s) | ||
368 | put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */ | 370 | put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */ |
369 | put_le16(p + 5, 512); /* XXX: retired, remove ? */ | 371 | put_le16(p + 5, 512); /* XXX: retired, remove ? */ |
370 | put_le16(p + 6, s->sectors); | 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 | put_le16(p + 20, 3); /* XXX: retired, remove ? */ | 375 | put_le16(p + 20, 3); /* XXX: retired, remove ? */ |
373 | put_le16(p + 21, 512); /* cache size in sectors */ | 376 | put_le16(p + 21, 512); /* cache size in sectors */ |
374 | put_le16(p + 22, 4); /* ecc bytes */ | 377 | put_le16(p + 22, 4); /* ecc bytes */ |
@@ -404,12 +407,14 @@ static void ide_identify(IDEState *s) | @@ -404,12 +407,14 @@ static void ide_identify(IDEState *s) | ||
404 | static void ide_atapi_identify(IDEState *s) | 407 | static void ide_atapi_identify(IDEState *s) |
405 | { | 408 | { |
406 | uint16_t *p; | 409 | uint16_t *p; |
410 | + char buf[20]; | ||
407 | 411 | ||
408 | memset(s->io_buffer, 0, 512); | 412 | memset(s->io_buffer, 0, 512); |
409 | p = (uint16_t *)s->io_buffer; | 413 | p = (uint16_t *)s->io_buffer; |
410 | /* Removable CDROM, 50us response, 12 byte packets */ | 414 | /* Removable CDROM, 50us response, 12 byte packets */ |
411 | put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0)); | 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 | put_le16(p + 20, 3); /* buffer type */ | 418 | put_le16(p + 20, 3); /* buffer type */ |
414 | put_le16(p + 21, 512); /* cache size in sectors */ | 419 | put_le16(p + 21, 512); /* cache size in sectors */ |
415 | put_le16(p + 22, 4); /* ecc bytes */ | 420 | put_le16(p + 22, 4); /* ecc bytes */ |
@@ -1432,6 +1437,7 @@ void ide_init(int iobase, int iobase2, int irq, | @@ -1432,6 +1437,7 @@ void ide_init(int iobase, int iobase2, int irq, | ||
1432 | BlockDriverState *hd0, BlockDriverState *hd1) | 1437 | BlockDriverState *hd0, BlockDriverState *hd1) |
1433 | { | 1438 | { |
1434 | IDEState *s, *ide_state; | 1439 | IDEState *s, *ide_state; |
1440 | + static int drive_serial = 1; | ||
1435 | int i, cylinders, heads, secs; | 1441 | int i, cylinders, heads, secs; |
1436 | int64_t nb_sectors; | 1442 | int64_t nb_sectors; |
1437 | 1443 | ||
@@ -1473,6 +1479,7 @@ void ide_init(int iobase, int iobase2, int irq, | @@ -1473,6 +1479,7 @@ void ide_init(int iobase, int iobase2, int irq, | ||
1473 | bdrv_set_change_cb(s->bs, cdrom_change_cb, s); | 1479 | bdrv_set_change_cb(s->bs, cdrom_change_cb, s); |
1474 | } | 1480 | } |
1475 | } | 1481 | } |
1482 | + s->drive_serial = drive_serial++; | ||
1476 | s->irq = irq; | 1483 | s->irq = irq; |
1477 | ide_reset(s); | 1484 | ide_reset(s); |
1478 | } | 1485 | } |