From: Avi Kivity <[EMAIL PROTECTED]> based on Xen patch from Samuel Thibault <[EMAIL PROTECTED]>.
Signed-off-by: Avi Kivity <[EMAIL PROTECTED]> diff --git a/bios/rombios.c b/bios/rombios.c index a9b5653..6164d07 100644 --- a/bios/rombios.c +++ b/bios/rombios.c @@ -2447,7 +2447,10 @@ void ata_detect( ) case ATA_TYPE_ATA: printf("ata%d %s: ",channel,slave?" slave":"master"); i=0; while(c=read_byte(get_SS(),model+i++)) printf("%c",c); - printf(" ATA-%d Hard-Disk (%lu MBytes)\n", version, sizeinmb); + if (sizeinmb < 1UL<<16) + printf(" ATA-%d Hard-Disk (%04u MBytes)\n",version,(Bit16u)sizeinmb); + else + printf(" ATA-%d Hard-Disk (%04u GBytes)\n",version,(Bit16u)(sizeinmb>>10)); break; case ATA_TYPE_ATAPI: printf("ata%d %s: ",channel,slave?" slave":"master"); @@ -2580,15 +2583,6 @@ Bit32u lba; if (mode == ATA_MODE_PIO32) blksize>>=2; else blksize>>=1; - // sector will be 0 only on lba access. Convert to lba-chs - if (sector == 0) { - sector = (Bit16u) (lba & 0x000000ffL); - lba >>= 8; - cylinder = (Bit16u) (lba & 0x0000ffffL); - lba >>= 16; - head = ((Bit16u) (lba & 0x0000000fL)) | 0x40; - } - // Reset count of transferred data write_word(ebda_seg, &EbdaData->ata.trsfsectors,0); write_dword(ebda_seg, &EbdaData->ata.trsfbytes,0L); @@ -2598,6 +2592,26 @@ Bit32u lba; if (status & ATA_CB_STAT_BSY) return 1; outb(iobase2 + ATA_CB_DC, ATA_CB_DC_HD15 | ATA_CB_DC_NIEN); + + // sector will be 0 only on lba access. Convert to lba-chs + if (sector == 0) { + if ((count >= 1 << 8) || (lba + count >= 1UL << 28)) { + outb(iobase1 + ATA_CB_FR, 0x00); + outb(iobase1 + ATA_CB_SC, (count >> 8) & 0xff); + outb(iobase1 + ATA_CB_SN, lba >> 24); + outb(iobase1 + ATA_CB_CL, 0); + outb(iobase1 + ATA_CB_CH, 0); + command |= 0x04; + count &= (1UL << 8) - 1; + lba &= (1UL << 24) - 1; + } + sector = (Bit16u) (lba & 0x000000ffL); + lba >>= 8; + cylinder = (Bit16u) (lba & 0x0000ffffL); + lba >>= 16; + head = ((Bit16u) (lba & 0x0000000fL)) | 0x40; + } + outb(iobase1 + ATA_CB_FR, 0x00); outb(iobase1 + ATA_CB_SC, count); outb(iobase1 + ATA_CB_SN, sector); @@ -2723,15 +2737,6 @@ Bit32u lba; if (mode == ATA_MODE_PIO32) blksize>>=2; else blksize>>=1; - // sector will be 0 only on lba access. Convert to lba-chs - if (sector == 0) { - sector = (Bit16u) (lba & 0x000000ffL); - lba >>= 8; - cylinder = (Bit16u) (lba & 0x0000ffffL); - lba >>= 16; - head = ((Bit16u) (lba & 0x0000000fL)) | 0x40; - } - // Reset count of transferred data write_word(ebda_seg, &EbdaData->ata.trsfsectors,0); write_dword(ebda_seg, &EbdaData->ata.trsfbytes,0L); @@ -2741,6 +2746,26 @@ Bit32u lba; if (status & ATA_CB_STAT_BSY) return 1; outb(iobase2 + ATA_CB_DC, ATA_CB_DC_HD15 | ATA_CB_DC_NIEN); + + // sector will be 0 only on lba access. Convert to lba-chs + if (sector == 0) { + if ((count >= 1 << 8) || (lba + count >= 1UL << 28)) { + outb(iobase1 + ATA_CB_FR, 0x00); + outb(iobase1 + ATA_CB_SC, (count >> 8) & 0xff); + outb(iobase1 + ATA_CB_SN, lba >> 24); + outb(iobase1 + ATA_CB_CL, 0); + outb(iobase1 + ATA_CB_CH, 0); + command |= 0x04; + count &= (1UL << 8) - 1; + lba &= (1UL << 24) - 1; + } + sector = (Bit16u) (lba & 0x000000ffL); + lba >>= 8; + cylinder = (Bit16u) (lba & 0x0000ffffL); + lba >>= 16; + head = ((Bit16u) (lba & 0x0000000fL)) | 0x40; + } + outb(iobase1 + ATA_CB_FR, 0x00); outb(iobase1 + ATA_CB_SC, count); outb(iobase1 + ATA_CB_SN, sector); ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-commits mailing list kvm-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-commits