VirtualBox

Ignore:
Timestamp:
Jan 17, 2014 12:06:45 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
91615
Message:

BIOS: If available, store logical geometry of SCSI disk in CMOS and use it.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/BIOS/scsi.c

    r48123 r50091  
    411411                uint16_t    heads, sectors_per_track;
    412412                uint8_t     hdcount;
     413                uint8_t     cmos_base;
    413414
    414415                /* Issue a read capacity command now. */
     
    440441                }
    441442
    442                 /* We need to calculate the geometry for the disk. From
    443                  * the BusLogic driver in the Linux kernel.
    444                 */
    445                 if (sectors >= (uint32_t)4 * 1024 * 1024)
     443                devcount_scsi = bios_dsk->scsi_devcount;
     444
     445                /* Get logical CHS geometry. */
     446                switch (devcount_scsi)
    446447                {
    447                     heads = 255;
    448                     sectors_per_track = 63;
     448                    case 0:
     449                        cmos_base = 0x90;
     450                        break;
     451                    case 1:
     452                        cmos_base = 0x98;
     453                        break;
     454                    case 2:
     455                        cmos_base = 0xA0;
     456                        break;
     457                    case 3:
     458                        cmos_base = 0xA8;
     459                        break;
     460                    default:
     461                        cmos_base = 0;
    449462                }
    450                 else if (sectors >= (uint32_t)2 * 1024 * 1024)
     463
     464                if (cmos_base && inb_cmos(cmos_base + 7))
    451465                {
    452                     heads = 128;
    453                     sectors_per_track = 32;
     466                    /* If provided, grab the logical geometry from CMOS. */
     467                    cylinders         = inb_cmos(cmos_base + 0) + (inb_cmos(cmos_base + 1) << 8);
     468                    heads             = inb_cmos(cmos_base + 2);
     469                    sectors_per_track = inb_cmos(cmos_base + 7);
    454470                }
    455471                else
    456472                {
    457                     heads = 64;
    458                     sectors_per_track = 32;
     473                    /* Calculate default logical geometry. NB: Very different
     474                     * from default ATA/SATA logical geometry!
     475                     */
     476                    if (sectors >= (uint32_t)4 * 1024 * 1024)
     477                    {
     478                        heads = 255;
     479                        sectors_per_track = 63;
     480                    }
     481                    else if (sectors >= (uint32_t)2 * 1024 * 1024)
     482                    {
     483                        heads = 128;
     484                        sectors_per_track = 32;
     485                    }
     486                    else
     487                    {
     488                        heads = 64;
     489                        sectors_per_track = 32;
     490                    }
     491                    cylinders = (uint32_t)(sectors / (heads * sectors_per_track));
    459492                }
    460                 cylinders = (uint32_t)(sectors / (heads * sectors_per_track));
    461                 devcount_scsi = bios_dsk->scsi_devcount;
    462493
    463494                /* Calculate index into the generic disk table. */
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette