diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2004-11-16 01:45:27 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2004-11-16 01:45:27 +0000 |
commit | 46d4767d93bcb2e84869ba6d2344ebff4382be86 (patch) | |
tree | ec07dcd1af4aaab9db64547e0b4cf36558caf772 /hw/pc.c | |
parent | e35c55fe38faea68eb9356163f52a426e533d79b (diff) |
better BIOS ATA translation support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1153 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/pc.c')
-rw-r--r-- | hw/pc.c | 28 |
1 files changed, 16 insertions, 12 deletions
@@ -217,19 +217,23 @@ static void cmos_init(int ram_size, int boot_device, BlockDriverState **hd_table val = 0; for (i = 0; i < 4; i++) { if (hd_table[i]) { - int cylinders, heads, sectors; - uint8_t translation; - /* NOTE: bdrv_get_geometry_hint() returns the geometry - that the hard disk returns. It is always such that: 1 <= - sects <= 63, 1 <= heads <= 16, 1 <= cylinders <= - 16383. The BIOS geometry can be different. */ - bdrv_get_geometry_hint(hd_table[i], &cylinders, &heads, §ors); - if (cylinders <= 1024 && heads <= 16 && sectors <= 63) { - /* No translation. */ - translation = 0; + int cylinders, heads, sectors, translation; + /* NOTE: bdrv_get_geometry_hint() returns the physical + geometry. It is always such that: 1 <= sects <= 63, 1 + <= heads <= 16, 1 <= cylinders <= 16383. The BIOS + geometry can be different if a translation is done. */ + translation = bdrv_get_translation_hint(hd_table[i]); + if (translation == BIOS_ATA_TRANSLATION_AUTO) { + bdrv_get_geometry_hint(hd_table[i], &cylinders, &heads, §ors); + if (cylinders <= 1024 && heads <= 16 && sectors <= 63) { + /* No translation. */ + translation = 0; + } else { + /* LBA translation. */ + translation = 1; + } } else { - /* LBA translation. */ - translation = 1; + translation--; } val |= translation << (i * 2); } |