[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH V4 17/18] ide: support CHS mode
From: |
TAKEDA, toshiya |
Subject: |
[Qemu-devel] [PATCH V4 17/18] ide: support CHS mode |
Date: |
Wed, 23 Dec 2009 02:41:25 +0900 |
Signed-off-by: TAKEDA, toshiya <address@hidden>
---
hw/ide/core.c | 13 +++++++++++--
hw/ide/internal.h | 1 +
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 76c3820..4c77415 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -1801,8 +1801,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;
@@ -1839,6 +1841,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, §ors);
+ 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/hw/ide/internal.h b/hw/ide/internal.h
index eb5b404..bf26c52 100644
--- a/hw/ide/internal.h
+++ b/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;
--
1.6.4
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [PATCH V4 17/18] ide: support CHS mode,
TAKEDA, toshiya <=