mirror of https://github.com/FDOS/kernel.git
only print messages once, not each time processing partitions; use LBA if forceLBA enabled in additional cases where LBA support not detected
This commit is contained in:
parent
4b0162c2a6
commit
7b0633b26b
|
@ -631,7 +631,7 @@ void DosDefinePartition(struct DriveParamS *driveParam,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the parameters of the hard disk */
|
/* Get the parameters of the hard disk */
|
||||||
STATIC int LBA_Get_Drive_Parameters(int drive, struct DriveParamS *driveParam)
|
STATIC int LBA_Get_Drive_Parameters(int drive, struct DriveParamS *driveParam, int firstPass)
|
||||||
{
|
{
|
||||||
iregs regs;
|
iregs regs;
|
||||||
struct _bios_LBA_disk_parameterS lba_bios_parameters;
|
struct _bios_LBA_disk_parameterS lba_bios_parameters;
|
||||||
|
@ -663,12 +663,13 @@ STATIC int LBA_Get_Drive_Parameters(int drive, struct DriveParamS *driveParam)
|
||||||
if DAP cannot be used, don't use
|
if DAP cannot be used, don't use
|
||||||
LBA
|
LBA
|
||||||
*/
|
*/
|
||||||
if ((regs.c.x & 1) == 0)
|
if (((regs.c.x & 1) == 0) && !ExtLBAForce)
|
||||||
{
|
{
|
||||||
goto StandardBios;
|
goto StandardBios;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* drive supports LBA addressing */
|
/* drive supports LBA addressing */
|
||||||
|
if (firstPass && (InitKernelConfig.Verbose >= 1)) printf("Checking for LBA support in BIOS\n");
|
||||||
|
|
||||||
/* version 1.0, 2.0 have different verify */
|
/* version 1.0, 2.0 have different verify */
|
||||||
if (regs.a.x < 0x2100)
|
if (regs.a.x < 0x2100)
|
||||||
|
@ -695,15 +696,22 @@ STATIC int LBA_Get_Drive_Parameters(int drive, struct DriveParamS *driveParam)
|
||||||
lba_bios_parameters.sectors > 0xffff ||
|
lba_bios_parameters.sectors > 0xffff ||
|
||||||
lba_bios_parameters.totalSectHigh != 0)
|
lba_bios_parameters.totalSectHigh != 0)
|
||||||
{
|
{
|
||||||
printf("Drive is too large to handle, using only 1st 8 GB\n"
|
if (firstPass)
|
||||||
" drive %02x heads %lu sectors %lu , total=0x%lx-%08lx\n",
|
{
|
||||||
|
printf("Drive is too large to handle, ");
|
||||||
|
if (ExtLBAForce)
|
||||||
|
printf("limited to 2TB");
|
||||||
|
else
|
||||||
|
printf("using CHS, limited to 8GB");
|
||||||
|
printf("\nDrive %02x, heads=%lu, sectors=%lu, total=0x%lx-%08lx\n",
|
||||||
drive,
|
drive,
|
||||||
(ULONG) lba_bios_parameters.heads,
|
(ULONG) lba_bios_parameters.heads,
|
||||||
(ULONG) lba_bios_parameters.sectors,
|
(ULONG) lba_bios_parameters.sectors,
|
||||||
(ULONG) lba_bios_parameters.totalSect,
|
(ULONG) lba_bios_parameters.totalSect,
|
||||||
(ULONG) lba_bios_parameters.totalSectHigh);
|
(ULONG) lba_bios_parameters.totalSectHigh);
|
||||||
|
}
|
||||||
|
|
||||||
goto StandardBios;
|
if (!ExtLBAForce) goto StandardBios;
|
||||||
}
|
}
|
||||||
|
|
||||||
driveParam->total_sectors = lba_bios_parameters.totalSect;
|
driveParam->total_sectors = lba_bios_parameters.totalSect;
|
||||||
|
@ -719,6 +727,7 @@ STATIC int LBA_Get_Drive_Parameters(int drive, struct DriveParamS *driveParam)
|
||||||
}
|
}
|
||||||
|
|
||||||
StandardBios: /* old way to get parameters */
|
StandardBios: /* old way to get parameters */
|
||||||
|
if (firstPass && (InitKernelConfig.Verbose >= 1)) printf("Retrieving CHS values for drive\n");
|
||||||
|
|
||||||
regs.a.b.h = 0x08;
|
regs.a.b.h = 0x08;
|
||||||
regs.d.b.l = drive;
|
regs.d.b.l = drive;
|
||||||
|
@ -742,7 +751,7 @@ StandardBios: /* old way to get parameters */
|
||||||
if (driveParam->chs.Sector == 0) {
|
if (driveParam->chs.Sector == 0) {
|
||||||
/* happens e.g. with Bochs 1.x if no harddisk defined */
|
/* happens e.g. with Bochs 1.x if no harddisk defined */
|
||||||
driveParam->chs.Sector = 63; /* avoid division by zero...! */
|
driveParam->chs.Sector = 63; /* avoid division by zero...! */
|
||||||
if (InitKernelConfig.Verbose >= 0) printf("BIOS reported 0 sectors/track, assuming 63!\n");
|
if (firstPass && (InitKernelConfig.Verbose >= 0)) printf("BIOS reported 0 sectors/track, assuming 63!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(driveParam->descflags & DF_LBA))
|
if (!(driveParam->descflags & DF_LBA))
|
||||||
|
@ -988,6 +997,7 @@ int Read1LBASector(struct DriveParamS *driveParam, unsigned drive,
|
||||||
|
|
||||||
for (num_retries = 0; num_retries < N_RETRY; num_retries++)
|
for (num_retries = 0; num_retries < N_RETRY; num_retries++)
|
||||||
{
|
{
|
||||||
|
if (InitKernelConfig.Verbose >= 1) printf("retry# %i\n", num_retries);
|
||||||
regs.d.b.l = drive | 0x80;
|
regs.d.b.l = drive | 0x80;
|
||||||
LBA_to_CHS(&chs, LBA_address, driveParam);
|
LBA_to_CHS(&chs, LBA_address, driveParam);
|
||||||
/* Some old "security" software (PROT) traps int13 and assumes non
|
/* Some old "security" software (PROT) traps int13 and assumes non
|
||||||
|
@ -999,6 +1009,7 @@ int Read1LBASector(struct DriveParamS *driveParam, unsigned drive,
|
||||||
if ((driveParam->descflags & DF_LBA) &&
|
if ((driveParam->descflags & DF_LBA) &&
|
||||||
(InitKernelConfig.ForceLBA || ExtLBAForce || chs.Cylinder > 1023))
|
(InitKernelConfig.ForceLBA || ExtLBAForce || chs.Cylinder > 1023))
|
||||||
{
|
{
|
||||||
|
if (InitKernelConfig.Verbose >= 1) printf("LBA mode\n");
|
||||||
dap.number_of_blocks = 1;
|
dap.number_of_blocks = 1;
|
||||||
dap.buffer_address = buffer;
|
dap.buffer_address = buffer;
|
||||||
dap.block_address_high = 0; /* clear high part */
|
dap.block_address_high = 0; /* clear high part */
|
||||||
|
@ -1011,6 +1022,7 @@ int Read1LBASector(struct DriveParamS *driveParam, unsigned drive,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* transfer data, using old bios functions */
|
{ /* transfer data, using old bios functions */
|
||||||
|
if (InitKernelConfig.Verbose >= 1) printf("CHS mode\n");
|
||||||
/* avoid overflow at end of track */
|
/* avoid overflow at end of track */
|
||||||
|
|
||||||
if (chs.Cylinder > 1023)
|
if (chs.Cylinder > 1023)
|
||||||
|
@ -1039,6 +1051,7 @@ int Read1LBASector(struct DriveParamS *driveParam, unsigned drive,
|
||||||
/* Load the Partition Tables and get information on all drives */
|
/* Load the Partition Tables and get information on all drives */
|
||||||
int ProcessDisk(int scanType, unsigned drive, int PartitionsToIgnore)
|
int ProcessDisk(int scanType, unsigned drive, int PartitionsToIgnore)
|
||||||
{
|
{
|
||||||
|
/* note: error messages are only printed on first call, where (scanType==SCAN_PRIMARYBOOT) */
|
||||||
|
|
||||||
struct PartTableEntry PTable[4];
|
struct PartTableEntry PTable[4];
|
||||||
ULONG RelSectorOffset;
|
ULONG RelSectorOffset;
|
||||||
|
@ -1053,7 +1066,7 @@ int ProcessDisk(int scanType, unsigned drive, int PartitionsToIgnore)
|
||||||
/* Get the hard drive parameters and ensure that the drive exists. */
|
/* Get the hard drive parameters and ensure that the drive exists. */
|
||||||
/* If there was an error accessing the drive, skip that drive. */
|
/* If there was an error accessing the drive, skip that drive. */
|
||||||
|
|
||||||
if (!LBA_Get_Drive_Parameters(drive, &driveParam))
|
if (!LBA_Get_Drive_Parameters(drive, &driveParam,(scanType==SCAN_PRIMARYBOOT)))
|
||||||
{
|
{
|
||||||
printf("can't get drive parameters for drive %02x\n", drive);
|
printf("can't get drive parameters for drive %02x\n", drive);
|
||||||
return PartitionsToIgnore;
|
return PartitionsToIgnore;
|
||||||
|
@ -1087,7 +1100,7 @@ strange_restart:
|
||||||
if (++strangeHardwareLoop < 3)
|
if (++strangeHardwareLoop < 3)
|
||||||
goto strange_restart;
|
goto strange_restart;
|
||||||
|
|
||||||
printf("illegal partition table - drive %02x sector %lu\n", drive,
|
if (scanType==SCAN_PRIMARYBOOT) printf("illegal partition table - drive %02x sector %lu\n", drive,
|
||||||
RelSectorOffset);
|
RelSectorOffset);
|
||||||
return PartitionsToIgnore;
|
return PartitionsToIgnore;
|
||||||
}
|
}
|
||||||
|
@ -1328,7 +1341,7 @@ void ReadAllPartitionTables(void)
|
||||||
|
|
||||||
if (InitKernelConfig.DLASortByDriveNo == 0)
|
if (InitKernelConfig.DLASortByDriveNo == 0)
|
||||||
{
|
{
|
||||||
/* printf("Drive Letter Assignment - DOS order\n"); */
|
if (InitKernelConfig.Verbose >= 1) printf("Drive Letter Assignment - DOS order\n");
|
||||||
|
|
||||||
/* Process primary partition table 1 partition only */
|
/* Process primary partition table 1 partition only */
|
||||||
for (HardDrive = 0; HardDrive < nHardDisk; HardDrive++)
|
for (HardDrive = 0; HardDrive < nHardDisk; HardDrive++)
|
||||||
|
@ -1357,13 +1370,13 @@ void ReadAllPartitionTables(void)
|
||||||
{
|
{
|
||||||
UBYTE bootdrv = peekb(0,0x5e0);
|
UBYTE bootdrv = peekb(0,0x5e0);
|
||||||
|
|
||||||
/* printf("Drive Letter Assignment - sorted by drive\n"); */
|
if (InitKernelConfig.Verbose >= 1) printf("Drive Letter Assignment - sorted by drive\n");
|
||||||
|
|
||||||
/* Process primary partition table 1 partition only */
|
/* Process primary partition table 1 partition only */
|
||||||
for (HardDrive = 0; HardDrive < nHardDisk; HardDrive++)
|
for (HardDrive = 0; HardDrive < nHardDisk; HardDrive++)
|
||||||
{
|
{
|
||||||
struct DriveParamS driveParam;
|
struct DriveParamS driveParam;
|
||||||
if (LBA_Get_Drive_Parameters(HardDrive, &driveParam) &&
|
if (LBA_Get_Drive_Parameters(HardDrive, &driveParam, 0) &&
|
||||||
driveParam.driveno == bootdrv)
|
driveParam.driveno == bootdrv)
|
||||||
{
|
{
|
||||||
foundPartitions[HardDrive] =
|
foundPartitions[HardDrive] =
|
||||||
|
@ -1391,12 +1404,24 @@ void ReadAllPartitionTables(void)
|
||||||
ProcessDisk(SCAN_PRIMARY2, HardDrive, foundPartitions[HardDrive]);
|
ProcessDisk(SCAN_PRIMARY2, HardDrive, foundPartitions[HardDrive]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (InitKernelConfig.Verbose >= 0)
|
||||||
|
{
|
||||||
|
unsigned foundPartitionsCount = 0;
|
||||||
|
/* Tell user if no valid partitions found on any hard drive */
|
||||||
|
for (HardDrive = 0; HardDrive < nHardDisk; HardDrive++)
|
||||||
|
{
|
||||||
|
foundPartitionsCount += foundPartitions[HardDrive];
|
||||||
|
}
|
||||||
|
/* printf("Found %i partitions\n", foundPartitionsCount); */
|
||||||
|
if (!foundPartitionsCount) printf("No supported partitions found.\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* disk initialization: returns number of units */
|
/* disk initialization: returns number of units */
|
||||||
COUNT dsk_init()
|
COUNT dsk_init()
|
||||||
{
|
{
|
||||||
if (InitKernelConfig.Verbose >= 0) printf(" - InitDisk");
|
if (InitKernelConfig.Verbose >= 0) printf("\nInitDisk\n");
|
||||||
|
|
||||||
#if defined(DEBUG) && !defined(DOSEMU)
|
#if defined(DEBUG) && !defined(DOSEMU)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue