qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v3 10/25] ide/core: support CHS


From: TAKEDA, toshiya
Subject: [Qemu-devel] [PATCH v3 10/25] ide/core: support CHS
Date: Thu, 29 Oct 2009 01:33:28 +0900

diff --git a/qemu/hw/ide/core.c b/qemu/hw/ide/core.c
index fffcd00..6ccab35 100644
--- a/qemu/hw/ide/core.c
+++ b/qemu/hw/ide/core.c
@@ -1770,8 +1770,10 @@ void ide_ioport_write(void *opaque, uint32_t addr, 
uint32_t val)
         break;
     case 6:
        /* FIXME: HOB readback uses bit 7 */
-        bus->ifs[0].select = (val & ~0x10) | 0xa0;
-        bus->ifs[1].select = (val | 0x10) | 0xa0;
+        bus->ifs[0].select = (val & ~0x10) |
+                             (bus->ifs[0].support_chs ? 0x80 : 0xa0);
+        bus->ifs[1].select = (val | 0x10) |
+                             (bus->ifs[1].support_chs ? 0x80 : 0xa0);
         /* select drive */
         bus->unit = (val >> 4) & 1;
         break;
@@ -1808,6 +1810,13 @@ void ide_ioport_write(void *opaque, uint32_t addr, 
uint32_t val)
             ide_set_irq(s->bus);
             break;
         case WIN_SPECIFY:
+            if (s->support_chs && !(s->select & 0x40)) {
+                uint64_t sectors;
+                bdrv_get_geometry(s->bs, &sectors);
+                s->heads = (s->select & 0xf) + 1;
+                s->sectors = s->nsector;
+                s->cylinders = sectors / (s->heads * s->sectors);
+            }
         case WIN_RECAL:
             s->error = 0;
             s->status = READY_STAT | SEEK_STAT;
diff --git a/qemu/hw/ide/internal.h b/qemu/hw/ide/internal.h
index cfae4c2..c6b6d9f 100644
--- a/qemu/hw/ide/internal.h
+++ b/qemu/hw/ide/internal.h
@@ -396,6 +396,7 @@ struct IDEState {
 
     /* set for lba48 access */
     uint8_t lba48;
+    uint8_t support_chs;
     BlockDriverState *bs;
     /* ATAPI specific */
     uint8_t sense_key;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]