mirror of
https://github.com/reactos/reactos.git
synced 2024-06-29 09:21:31 +00:00
Add disk I/O (well, input only, no output) for the Xbox
svn path=/trunk/; revision=11608
This commit is contained in:
parent
d5b047feae
commit
2950511d3e
|
@ -213,7 +213,9 @@ ARCH_OBJS = fathelp.o \
|
||||||
machpc.o \
|
machpc.o \
|
||||||
machxbox.o \
|
machxbox.o \
|
||||||
pccons.o \
|
pccons.o \
|
||||||
|
pcdisk.o \
|
||||||
pcmem.o \
|
pcmem.o \
|
||||||
|
xboxdisk.o \
|
||||||
xboxfont.o \
|
xboxfont.o \
|
||||||
xboxmem.o \
|
xboxmem.o \
|
||||||
xboxvideo.o \
|
xboxvideo.o \
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: archmach.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
/* $Id: archmach.c,v 1.2 2004/11/09 23:36:19 gvg Exp $
|
||||||
*
|
*
|
||||||
* FreeLoader
|
* FreeLoader
|
||||||
*
|
*
|
||||||
|
@ -45,6 +45,8 @@ MachInit(VOID)
|
||||||
{
|
{
|
||||||
PcMachInit();
|
PcMachInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HalpCalibrateStallExecution();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <disk.h>
|
#include <disk.h>
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
|
#include <machine.h>
|
||||||
#include <portio.h>
|
#include <portio.h>
|
||||||
#include <video.h>
|
#include <video.h>
|
||||||
|
|
||||||
|
@ -569,7 +570,7 @@ SetHarddiskIdentifier(HKEY DiskKey,
|
||||||
S32 Error;
|
S32 Error;
|
||||||
|
|
||||||
/* Read the MBR */
|
/* Read the MBR */
|
||||||
if (!DiskReadLogicalSectors(DriveNumber, 0ULL, 1, (PVOID)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
DbgPrint((DPRINT_HWDETECT, "Reading MBR failed\n"));
|
DbgPrint((DPRINT_HWDETECT, "Reading MBR failed\n"));
|
||||||
return;
|
return;
|
||||||
|
@ -645,7 +646,7 @@ DetectBiosDisks(HKEY SystemKey,
|
||||||
/* Count the number of visible drives */
|
/* Count the number of visible drives */
|
||||||
DiskReportError(FALSE);
|
DiskReportError(FALSE);
|
||||||
DiskCount = 0;
|
DiskCount = 0;
|
||||||
while (DiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER))
|
while (MachDiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
DiskCount++;
|
DiskCount++;
|
||||||
}
|
}
|
||||||
|
@ -2238,8 +2239,6 @@ DetectHardware(VOID)
|
||||||
|
|
||||||
DbgPrint((DPRINT_HWDETECT, "DetectHardware()\n"));
|
DbgPrint((DPRINT_HWDETECT, "DetectHardware()\n"));
|
||||||
|
|
||||||
HalpCalibrateStallExecution ();
|
|
||||||
|
|
||||||
/* Create the 'System' key */
|
/* Create the 'System' key */
|
||||||
Error = RegCreateKey(NULL,
|
Error = RegCreateKey(NULL,
|
||||||
"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System",
|
"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System",
|
||||||
|
|
|
@ -159,6 +159,7 @@ typedef struct _CM_COMPONENT_INFORMATION
|
||||||
/* PROTOTYPES ***************************************************************/
|
/* PROTOTYPES ***************************************************************/
|
||||||
|
|
||||||
/* hardware.c */
|
/* hardware.c */
|
||||||
|
VOID HalpCalibrateStallExecution(VOID);
|
||||||
VOID KeStallExecutionProcessor(U32 Microseconds);
|
VOID KeStallExecutionProcessor(U32 Microseconds);
|
||||||
|
|
||||||
VOID SetComponentInformation(HKEY ComponentKey,
|
VOID SetComponentInformation(HKEY ComponentKey,
|
||||||
|
|
|
@ -25,251 +25,12 @@
|
||||||
#include <portio.h>
|
#include <portio.h>
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
U8 PacketSize; // 00h - Size of packet (10h or 18h)
|
|
||||||
U8 Reserved; // 01h - Reserved (0)
|
|
||||||
U16 LBABlockCount; // 02h - Number of blocks to transfer (max 007Fh for Phoenix EDD)
|
|
||||||
U16 TransferBufferOffset; // 04h - Transfer buffer offset (seg:off)
|
|
||||||
U16 TransferBufferSegment; // Transfer buffer segment (seg:off)
|
|
||||||
U64 LBAStartBlock; // 08h - Starting absolute block number
|
|
||||||
U64 TransferBuffer64; // 10h - (EDD-3.0, optional) 64-bit flat address of transfer buffer
|
|
||||||
// used if DWORD at 04h is FFFFh:FFFFh
|
|
||||||
} PACKED I386_DISK_ADDRESS_PACKET, *PI386_DISK_ADDRESS_PACKET;
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// FUNCTIONS
|
// FUNCTIONS
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
|
|
||||||
BOOL DiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer)
|
|
||||||
{
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_DISK, "DiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer));
|
|
||||||
|
|
||||||
//
|
|
||||||
// Check to see if it is a fixed disk drive
|
|
||||||
// If so then check to see if Int13 extensions work
|
|
||||||
// If they do then use them, otherwise default back to BIOS calls
|
|
||||||
//
|
|
||||||
if ((DriveNumber >= 0x80) && DiskInt13ExtensionsSupported(DriveNumber))
|
|
||||||
{
|
|
||||||
DbgPrint((DPRINT_DISK, "Using Int 13 Extensions for read. DiskInt13ExtensionsSupported(%d) = %s\n", DriveNumber, DiskInt13ExtensionsSupported(DriveNumber) ? "TRUE" : "FALSE"));
|
|
||||||
|
|
||||||
//
|
|
||||||
// LBA is easy, nothing to calculate
|
|
||||||
// Just do the read
|
|
||||||
//
|
|
||||||
return DiskReadLogicalSectorsLBA(DriveNumber, SectorNumber, SectorCount, Buffer);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// LBA is not supported default to the CHS calls
|
|
||||||
return DiskReadLogicalSectorsCHS(DriveNumber, SectorNumber, SectorCount, Buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL DiskReadLogicalSectorsLBA(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer)
|
|
||||||
{
|
|
||||||
REGS RegsIn;
|
|
||||||
REGS RegsOut;
|
|
||||||
U32 RetryCount;
|
|
||||||
PI386_DISK_ADDRESS_PACKET Packet = (PI386_DISK_ADDRESS_PACKET)(BIOSCALLBUFFER);
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_DISK, "DiskReadLogicalSectorsLBA() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer));
|
|
||||||
|
|
||||||
// BIOS int 0x13, function 42h - IBM/MS INT 13 Extensions - EXTENDED READ
|
|
||||||
RegsIn.b.ah = 0x42; // Subfunction 42h
|
|
||||||
RegsIn.b.dl = DriveNumber; // Drive number in DL (0 - floppy, 0x80 - harddisk)
|
|
||||||
RegsIn.x.ds = BIOSCALLBUFSEGMENT; // DS:SI -> disk address packet
|
|
||||||
RegsIn.w.si = BIOSCALLBUFOFFSET;
|
|
||||||
|
|
||||||
// Setup disk address packet
|
|
||||||
RtlZeroMemory(Packet, sizeof(I386_DISK_ADDRESS_PACKET));
|
|
||||||
Packet->PacketSize = sizeof(I386_DISK_ADDRESS_PACKET);
|
|
||||||
Packet->Reserved = 0;
|
|
||||||
Packet->LBABlockCount = SectorCount;
|
|
||||||
Packet->TransferBufferOffset = ((U32)Buffer) & 0x0F;
|
|
||||||
Packet->TransferBufferSegment = ((U32)Buffer) >> 4;
|
|
||||||
Packet->LBAStartBlock = SectorNumber;
|
|
||||||
Packet->TransferBuffer64 = 0;
|
|
||||||
|
|
||||||
// BIOS int 0x13, function 42h - IBM/MS INT 13 Extensions - EXTENDED READ
|
|
||||||
// Return:
|
|
||||||
// CF clear if successful
|
|
||||||
// AH = 00h
|
|
||||||
// CF set on error
|
|
||||||
// AH = error code
|
|
||||||
// disk address packet's block count field set to the
|
|
||||||
// number of blocks successfully transferred
|
|
||||||
|
|
||||||
// Retry 3 times
|
|
||||||
for (RetryCount=0; RetryCount<3; RetryCount++)
|
|
||||||
{
|
|
||||||
Int386(0x13, &RegsIn, &RegsOut);
|
|
||||||
|
|
||||||
// If it worked return TRUE
|
|
||||||
if (INT386_SUCCESS(RegsOut))
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
// If it was a corrected ECC error then the data is still good
|
|
||||||
else if (RegsOut.b.ah == 0x11)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
// If it failed the do the next retry
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DiskResetController(DriveNumber);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we get here then the read failed
|
|
||||||
DiskError("Disk Read Failed", RegsOut.b.ah);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL DiskReadLogicalSectorsCHS(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer)
|
|
||||||
{
|
|
||||||
U32 PhysicalSector;
|
|
||||||
U32 PhysicalHead;
|
|
||||||
U32 PhysicalTrack;
|
|
||||||
GEOMETRY DriveGeometry;
|
|
||||||
U32 NumberOfSectorsToRead;
|
|
||||||
REGS RegsIn;
|
|
||||||
REGS RegsOut;
|
|
||||||
U32 RetryCount;
|
|
||||||
|
|
||||||
DbgPrint((DPRINT_DISK, "DiskReadLogicalSectorsCHS()\n"));
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get the drive geometry
|
|
||||||
//
|
|
||||||
if (!DiskGetDriveGeometry(DriveNumber, &DriveGeometry))
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (SectorCount)
|
|
||||||
{
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate the physical disk offsets
|
|
||||||
//
|
|
||||||
PhysicalSector = 1 + (SectorNumber % DriveGeometry.Sectors);
|
|
||||||
PhysicalHead = (SectorNumber / DriveGeometry.Sectors) % DriveGeometry.Heads;
|
|
||||||
PhysicalTrack = (SectorNumber / DriveGeometry.Sectors) / DriveGeometry.Heads;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate how many sectors we need to read this round
|
|
||||||
//
|
|
||||||
if (PhysicalSector > 1)
|
|
||||||
{
|
|
||||||
if (SectorCount >= (DriveGeometry.Sectors - (PhysicalSector - 1)))
|
|
||||||
NumberOfSectorsToRead = (DriveGeometry.Sectors - (PhysicalSector - 1));
|
|
||||||
else
|
|
||||||
NumberOfSectorsToRead = SectorCount;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (SectorCount >= DriveGeometry.Sectors)
|
|
||||||
NumberOfSectorsToRead = DriveGeometry.Sectors;
|
|
||||||
else
|
|
||||||
NumberOfSectorsToRead = SectorCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Make sure the read is within the geometry boundaries
|
|
||||||
//
|
|
||||||
if ((PhysicalHead >= DriveGeometry.Heads) ||
|
|
||||||
(PhysicalTrack >= DriveGeometry.Cylinders) ||
|
|
||||||
((NumberOfSectorsToRead + PhysicalSector) > (DriveGeometry.Sectors + 1)) ||
|
|
||||||
(PhysicalSector > DriveGeometry.Sectors))
|
|
||||||
{
|
|
||||||
DiskError("Disk read exceeds drive geometry limits.", 0);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// BIOS Int 13h, function 2 - Read Disk Sectors
|
|
||||||
// AH = 02h
|
|
||||||
// AL = number of sectors to read (must be nonzero)
|
|
||||||
// CH = low eight bits of cylinder number
|
|
||||||
// CL = sector number 1-63 (bits 0-5)
|
|
||||||
// high two bits of cylinder (bits 6-7, hard disk only)
|
|
||||||
// DH = head number
|
|
||||||
// DL = drive number (bit 7 set for hard disk)
|
|
||||||
// ES:BX -> data buffer
|
|
||||||
// Return:
|
|
||||||
// CF set on error
|
|
||||||
// if AH = 11h (corrected ECC error), AL = burst length
|
|
||||||
// CF clear if successful
|
|
||||||
// AH = status
|
|
||||||
// AL = number of sectors transferred
|
|
||||||
// (only valid if CF set for some BIOSes)
|
|
||||||
RegsIn.b.ah = 0x02;
|
|
||||||
RegsIn.b.al = NumberOfSectorsToRead;
|
|
||||||
RegsIn.b.ch = (PhysicalTrack & 0xFF);
|
|
||||||
RegsIn.b.cl = (PhysicalSector + ((PhysicalTrack & 0x300) >> 2));
|
|
||||||
RegsIn.b.dh = PhysicalHead;
|
|
||||||
RegsIn.b.dl = DriveNumber;
|
|
||||||
RegsIn.w.es = ((U32)Buffer) >> 4;
|
|
||||||
RegsIn.w.bx = ((U32)Buffer) & 0x0F;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Perform the read
|
|
||||||
// Retry 3 times
|
|
||||||
//
|
|
||||||
for (RetryCount=0; RetryCount<3; RetryCount++)
|
|
||||||
{
|
|
||||||
Int386(0x13, &RegsIn, &RegsOut);
|
|
||||||
|
|
||||||
// If it worked break out
|
|
||||||
if (INT386_SUCCESS(RegsOut))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// If it was a corrected ECC error then the data is still good
|
|
||||||
else if (RegsOut.b.ah == 0x11)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// If it failed the do the next retry
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DiskResetController(DriveNumber);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we retried 3 times then fail
|
|
||||||
if (RetryCount >= 3)
|
|
||||||
{
|
|
||||||
DiskError("Disk Read Failed", RegsOut.b.ah);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// I have learned that not all bioses return
|
|
||||||
// the sector read count in the AL register (at least mine doesn't)
|
|
||||||
// even if the sectors were read correctly. So instead
|
|
||||||
// of checking the sector read count we will rely solely
|
|
||||||
// on the carry flag being set on error
|
|
||||||
|
|
||||||
Buffer += (NumberOfSectorsToRead * DriveGeometry.BytesPerSector);
|
|
||||||
SectorCount -= NumberOfSectorsToRead;
|
|
||||||
SectorNumber += NumberOfSectorsToRead;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL DiskResetController(U32 DriveNumber)
|
BOOL DiskResetController(U32 DriveNumber)
|
||||||
{
|
{
|
||||||
REGS RegsIn;
|
REGS RegsIn;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: machpc.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
/* $Id: machpc.c,v 1.2 2004/11/09 23:36:19 gvg Exp $
|
||||||
*
|
*
|
||||||
* FreeLoader
|
* FreeLoader
|
||||||
*
|
*
|
||||||
|
@ -34,6 +34,7 @@ PcMachInit(VOID)
|
||||||
MachVtbl.PutChar = PcConsPutChar;
|
MachVtbl.PutChar = PcConsPutChar;
|
||||||
MachVtbl.PutCharAttrAtLoc = PcConsPutCharAttrAtLoc;
|
MachVtbl.PutCharAttrAtLoc = PcConsPutCharAttrAtLoc;
|
||||||
MachVtbl.GetMemoryMap = PcMemGetMemoryMap;
|
MachVtbl.GetMemoryMap = PcMemGetMemoryMap;
|
||||||
|
MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: machpc.h,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
/* $Id: machpc.h,v 1.2 2004/11/09 23:36:19 gvg Exp $
|
||||||
*
|
*
|
||||||
* FreeLoader
|
* FreeLoader
|
||||||
*
|
*
|
||||||
|
@ -34,6 +34,8 @@ VOID PcConsPutCharAttrAtLoc(int Ch, U8 Attr, unsigned X, unsigned Y);
|
||||||
|
|
||||||
U32 PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
|
U32 PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
|
||||||
|
|
||||||
|
BOOL PcDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer);
|
||||||
|
|
||||||
#endif /* __I386_MACHPC_H_ */
|
#endif /* __I386_MACHPC_H_ */
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: machxbox.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
/* $Id: machxbox.c,v 1.2 2004/11/09 23:36:19 gvg Exp $
|
||||||
*
|
*
|
||||||
* FreeLoader
|
* FreeLoader
|
||||||
*
|
*
|
||||||
|
@ -34,4 +34,5 @@ XboxMachInit(VOID)
|
||||||
MachVtbl.PutChar = XboxVideoPutChar;
|
MachVtbl.PutChar = XboxVideoPutChar;
|
||||||
MachVtbl.PutCharAttrAtLoc = XboxVideoPutCharAttrAtLoc;
|
MachVtbl.PutCharAttrAtLoc = XboxVideoPutCharAttrAtLoc;
|
||||||
MachVtbl.GetMemoryMap = XboxMemGetMemoryMap;
|
MachVtbl.GetMemoryMap = XboxMemGetMemoryMap;
|
||||||
|
MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: machxbox.h,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
/* $Id: machxbox.h,v 1.2 2004/11/09 23:36:19 gvg Exp $
|
||||||
*
|
*
|
||||||
* FreeLoader
|
* FreeLoader
|
||||||
*
|
*
|
||||||
|
@ -37,6 +37,8 @@ VOID XboxMemInit(VOID);
|
||||||
PVOID XboxMemReserveMemory(U32 MbToReserve);
|
PVOID XboxMemReserveMemory(U32 MbToReserve);
|
||||||
U32 XboxMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
|
U32 XboxMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
|
||||||
|
|
||||||
|
BOOL XboxDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer);
|
||||||
|
|
||||||
#endif /* __I386_HWXBOX_H_ */
|
#endif /* __I386_HWXBOX_H_ */
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
365
freeldr/freeldr/arch/i386/pcdisk.c
Normal file
365
freeldr/freeldr/arch/i386/pcdisk.c
Normal file
|
@ -0,0 +1,365 @@
|
||||||
|
/*
|
||||||
|
* FreeLoader
|
||||||
|
* Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <freeldr.h>
|
||||||
|
#include <disk.h>
|
||||||
|
#include <rtl.h>
|
||||||
|
#include <arch.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <portio.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
U8 PacketSize; // 00h - Size of packet (10h or 18h)
|
||||||
|
U8 Reserved; // 01h - Reserved (0)
|
||||||
|
U16 LBABlockCount; // 02h - Number of blocks to transfer (max 007Fh for Phoenix EDD)
|
||||||
|
U16 TransferBufferOffset; // 04h - Transfer buffer offset (seg:off)
|
||||||
|
U16 TransferBufferSegment; // Transfer buffer segment (seg:off)
|
||||||
|
U64 LBAStartBlock; // 08h - Starting absolute block number
|
||||||
|
U64 TransferBuffer64; // 10h - (EDD-3.0, optional) 64-bit flat address of transfer buffer
|
||||||
|
// used if DWORD at 04h is FFFFh:FFFFh
|
||||||
|
} PACKED I386_DISK_ADDRESS_PACKET, *PI386_DISK_ADDRESS_PACKET;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// FUNCTIONS
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static BOOL PcDiskResetController(U32 DriveNumber)
|
||||||
|
{
|
||||||
|
REGS RegsIn;
|
||||||
|
REGS RegsOut;
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_DISK, "PcDiskResetController(0x%x) DISK OPERATION FAILED -- RESETTING CONTROLLER\n", DriveNumber));
|
||||||
|
|
||||||
|
// BIOS Int 13h, function 0 - Reset disk system
|
||||||
|
// AH = 00h
|
||||||
|
// DL = drive (if bit 7 is set both hard disks and floppy disks reset)
|
||||||
|
// Return:
|
||||||
|
// AH = status
|
||||||
|
// CF clear if successful
|
||||||
|
// CF set on error
|
||||||
|
RegsIn.b.ah = 0x00;
|
||||||
|
RegsIn.b.dl = DriveNumber;
|
||||||
|
|
||||||
|
// Reset the disk controller
|
||||||
|
Int386(0x13, &RegsIn, &RegsOut);
|
||||||
|
|
||||||
|
return INT386_SUCCESS(RegsOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL PcDiskReadLogicalSectorsLBA(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer)
|
||||||
|
{
|
||||||
|
REGS RegsIn;
|
||||||
|
REGS RegsOut;
|
||||||
|
U32 RetryCount;
|
||||||
|
PI386_DISK_ADDRESS_PACKET Packet = (PI386_DISK_ADDRESS_PACKET)(BIOSCALLBUFFER);
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_DISK, "PcDiskReadLogicalSectorsLBA() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer));
|
||||||
|
|
||||||
|
// BIOS int 0x13, function 42h - IBM/MS INT 13 Extensions - EXTENDED READ
|
||||||
|
RegsIn.b.ah = 0x42; // Subfunction 42h
|
||||||
|
RegsIn.b.dl = DriveNumber; // Drive number in DL (0 - floppy, 0x80 - harddisk)
|
||||||
|
RegsIn.x.ds = BIOSCALLBUFSEGMENT; // DS:SI -> disk address packet
|
||||||
|
RegsIn.w.si = BIOSCALLBUFOFFSET;
|
||||||
|
|
||||||
|
// Setup disk address packet
|
||||||
|
RtlZeroMemory(Packet, sizeof(I386_DISK_ADDRESS_PACKET));
|
||||||
|
Packet->PacketSize = sizeof(I386_DISK_ADDRESS_PACKET);
|
||||||
|
Packet->Reserved = 0;
|
||||||
|
Packet->LBABlockCount = SectorCount;
|
||||||
|
Packet->TransferBufferOffset = ((U32)Buffer) & 0x0F;
|
||||||
|
Packet->TransferBufferSegment = ((U32)Buffer) >> 4;
|
||||||
|
Packet->LBAStartBlock = SectorNumber;
|
||||||
|
Packet->TransferBuffer64 = 0;
|
||||||
|
|
||||||
|
// BIOS int 0x13, function 42h - IBM/MS INT 13 Extensions - EXTENDED READ
|
||||||
|
// Return:
|
||||||
|
// CF clear if successful
|
||||||
|
// AH = 00h
|
||||||
|
// CF set on error
|
||||||
|
// AH = error code
|
||||||
|
// disk address packet's block count field set to the
|
||||||
|
// number of blocks successfully transferred
|
||||||
|
|
||||||
|
// Retry 3 times
|
||||||
|
for (RetryCount=0; RetryCount<3; RetryCount++)
|
||||||
|
{
|
||||||
|
Int386(0x13, &RegsIn, &RegsOut);
|
||||||
|
|
||||||
|
// If it worked return TRUE
|
||||||
|
if (INT386_SUCCESS(RegsOut))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
// If it was a corrected ECC error then the data is still good
|
||||||
|
else if (RegsOut.b.ah == 0x11)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
// If it failed the do the next retry
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PcDiskResetController(DriveNumber);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we get here then the read failed
|
||||||
|
DiskError("Disk Read Failed", RegsOut.b.ah);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL PcDiskReadLogicalSectorsCHS(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer)
|
||||||
|
{
|
||||||
|
U32 PhysicalSector;
|
||||||
|
U32 PhysicalHead;
|
||||||
|
U32 PhysicalTrack;
|
||||||
|
GEOMETRY DriveGeometry;
|
||||||
|
U32 NumberOfSectorsToRead;
|
||||||
|
REGS RegsIn;
|
||||||
|
REGS RegsOut;
|
||||||
|
U32 RetryCount;
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_DISK, "PcDiskReadLogicalSectorsCHS()\n"));
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get the drive geometry
|
||||||
|
//
|
||||||
|
if (!DiskGetDriveGeometry(DriveNumber, &DriveGeometry))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (SectorCount)
|
||||||
|
{
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate the physical disk offsets
|
||||||
|
//
|
||||||
|
PhysicalSector = 1 + (SectorNumber % DriveGeometry.Sectors);
|
||||||
|
PhysicalHead = (SectorNumber / DriveGeometry.Sectors) % DriveGeometry.Heads;
|
||||||
|
PhysicalTrack = (SectorNumber / DriveGeometry.Sectors) / DriveGeometry.Heads;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate how many sectors we need to read this round
|
||||||
|
//
|
||||||
|
if (PhysicalSector > 1)
|
||||||
|
{
|
||||||
|
if (SectorCount >= (DriveGeometry.Sectors - (PhysicalSector - 1)))
|
||||||
|
NumberOfSectorsToRead = (DriveGeometry.Sectors - (PhysicalSector - 1));
|
||||||
|
else
|
||||||
|
NumberOfSectorsToRead = SectorCount;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (SectorCount >= DriveGeometry.Sectors)
|
||||||
|
NumberOfSectorsToRead = DriveGeometry.Sectors;
|
||||||
|
else
|
||||||
|
NumberOfSectorsToRead = SectorCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Make sure the read is within the geometry boundaries
|
||||||
|
//
|
||||||
|
if ((PhysicalHead >= DriveGeometry.Heads) ||
|
||||||
|
(PhysicalTrack >= DriveGeometry.Cylinders) ||
|
||||||
|
((NumberOfSectorsToRead + PhysicalSector) > (DriveGeometry.Sectors + 1)) ||
|
||||||
|
(PhysicalSector > DriveGeometry.Sectors))
|
||||||
|
{
|
||||||
|
DiskError("Disk read exceeds drive geometry limits.", 0);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BIOS Int 13h, function 2 - Read Disk Sectors
|
||||||
|
// AH = 02h
|
||||||
|
// AL = number of sectors to read (must be nonzero)
|
||||||
|
// CH = low eight bits of cylinder number
|
||||||
|
// CL = sector number 1-63 (bits 0-5)
|
||||||
|
// high two bits of cylinder (bits 6-7, hard disk only)
|
||||||
|
// DH = head number
|
||||||
|
// DL = drive number (bit 7 set for hard disk)
|
||||||
|
// ES:BX -> data buffer
|
||||||
|
// Return:
|
||||||
|
// CF set on error
|
||||||
|
// if AH = 11h (corrected ECC error), AL = burst length
|
||||||
|
// CF clear if successful
|
||||||
|
// AH = status
|
||||||
|
// AL = number of sectors transferred
|
||||||
|
// (only valid if CF set for some BIOSes)
|
||||||
|
RegsIn.b.ah = 0x02;
|
||||||
|
RegsIn.b.al = NumberOfSectorsToRead;
|
||||||
|
RegsIn.b.ch = (PhysicalTrack & 0xFF);
|
||||||
|
RegsIn.b.cl = (PhysicalSector + ((PhysicalTrack & 0x300) >> 2));
|
||||||
|
RegsIn.b.dh = PhysicalHead;
|
||||||
|
RegsIn.b.dl = DriveNumber;
|
||||||
|
RegsIn.w.es = ((U32)Buffer) >> 4;
|
||||||
|
RegsIn.w.bx = ((U32)Buffer) & 0x0F;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Perform the read
|
||||||
|
// Retry 3 times
|
||||||
|
//
|
||||||
|
for (RetryCount=0; RetryCount<3; RetryCount++)
|
||||||
|
{
|
||||||
|
Int386(0x13, &RegsIn, &RegsOut);
|
||||||
|
|
||||||
|
// If it worked break out
|
||||||
|
if (INT386_SUCCESS(RegsOut))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// If it was a corrected ECC error then the data is still good
|
||||||
|
else if (RegsOut.b.ah == 0x11)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// If it failed the do the next retry
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PcDiskResetController(DriveNumber);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we retried 3 times then fail
|
||||||
|
if (RetryCount >= 3)
|
||||||
|
{
|
||||||
|
DiskError("Disk Read Failed", RegsOut.b.ah);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// I have learned that not all bioses return
|
||||||
|
// the sector read count in the AL register (at least mine doesn't)
|
||||||
|
// even if the sectors were read correctly. So instead
|
||||||
|
// of checking the sector read count we will rely solely
|
||||||
|
// on the carry flag being set on error
|
||||||
|
|
||||||
|
Buffer += (NumberOfSectorsToRead * DriveGeometry.BytesPerSector);
|
||||||
|
SectorCount -= NumberOfSectorsToRead;
|
||||||
|
SectorNumber += NumberOfSectorsToRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL PcDiskInt13ExtensionsSupported(U32 DriveNumber)
|
||||||
|
{
|
||||||
|
REGS RegsIn;
|
||||||
|
REGS RegsOut;
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_DISK, "PcDiskInt13ExtensionsSupported()\n"));
|
||||||
|
|
||||||
|
// IBM/MS INT 13 Extensions - INSTALLATION CHECK
|
||||||
|
// AH = 41h
|
||||||
|
// BX = 55AAh
|
||||||
|
// DL = drive (80h-FFh)
|
||||||
|
// Return:
|
||||||
|
// CF set on error (extensions not supported)
|
||||||
|
// AH = 01h (invalid function)
|
||||||
|
// CF clear if successful
|
||||||
|
// BX = AA55h if installed
|
||||||
|
// AH = major version of extensions
|
||||||
|
// 01h = 1.x
|
||||||
|
// 20h = 2.0 / EDD-1.0
|
||||||
|
// 21h = 2.1 / EDD-1.1
|
||||||
|
// 30h = EDD-3.0
|
||||||
|
// AL = internal use
|
||||||
|
// CX = API subset support bitmap
|
||||||
|
// DH = extension version (v2.0+ ??? -- not present in 1.x)
|
||||||
|
//
|
||||||
|
// Bitfields for IBM/MS INT 13 Extensions API support bitmap
|
||||||
|
// Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
|
||||||
|
// Bit 1, removable drive controller functions (AH=45h,46h,48h,49h,INT 15/AH=52h) supported
|
||||||
|
// Bit 2, enhanced disk drive (EDD) functions (AH=48h,AH=4Eh) supported
|
||||||
|
// extended drive parameter table is valid
|
||||||
|
// Bits 3-15 reserved
|
||||||
|
RegsIn.b.ah = 0x41;
|
||||||
|
RegsIn.w.bx = 0x55AA;
|
||||||
|
RegsIn.b.dl = DriveNumber;
|
||||||
|
|
||||||
|
// Reset the disk controller
|
||||||
|
Int386(0x13, &RegsIn, &RegsOut);
|
||||||
|
|
||||||
|
if (!INT386_SUCCESS(RegsOut))
|
||||||
|
{
|
||||||
|
// CF set on error (extensions not supported)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RegsOut.w.bx != 0xAA55)
|
||||||
|
{
|
||||||
|
// BX = AA55h if installed
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note:
|
||||||
|
// The original check is too strict because some BIOSes report that
|
||||||
|
// extended disk access functions are not suported when booting
|
||||||
|
// from a CD (e.g. Phoenix BIOS v6.00PG). Argh!
|
||||||
|
#if 0
|
||||||
|
if (!(RegsOut.w.cx & 0x0001))
|
||||||
|
{
|
||||||
|
// CX = API subset support bitmap
|
||||||
|
// Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Use this relaxed check instead
|
||||||
|
if (RegsOut.w.cx == 0x0000)
|
||||||
|
{
|
||||||
|
// CX = API subset support bitmap
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL PcDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer)
|
||||||
|
{
|
||||||
|
|
||||||
|
DbgPrint((DPRINT_DISK, "PcDiskReadLogicalSectors() DriveNumber: 0x%x SectorNumber: %I64d SectorCount: %d Buffer: 0x%x\n", DriveNumber, SectorNumber, SectorCount, Buffer));
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check to see if it is a fixed disk drive
|
||||||
|
// If so then check to see if Int13 extensions work
|
||||||
|
// If they do then use them, otherwise default back to BIOS calls
|
||||||
|
//
|
||||||
|
if ((DriveNumber >= 0x80) && PcDiskInt13ExtensionsSupported(DriveNumber))
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_DISK, "Using Int 13 Extensions for read. PcDiskInt13ExtensionsSupported(%d) = %s\n", DriveNumber, PcDiskInt13ExtensionsSupported(DriveNumber) ? "TRUE" : "FALSE"));
|
||||||
|
|
||||||
|
//
|
||||||
|
// LBA is easy, nothing to calculate
|
||||||
|
// Just do the read
|
||||||
|
//
|
||||||
|
return PcDiskReadLogicalSectorsLBA(DriveNumber, SectorNumber, SectorCount, Buffer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// LBA is not supported default to the CHS calls
|
||||||
|
return PcDiskReadLogicalSectorsCHS(DriveNumber, SectorNumber, SectorCount, Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
398
freeldr/freeldr/arch/i386/xboxdisk.c
Normal file
398
freeldr/freeldr/arch/i386/xboxdisk.c
Normal file
|
@ -0,0 +1,398 @@
|
||||||
|
/* $Id: xboxdisk.c,v 1.1 2004/11/09 23:36:19 gvg Exp $
|
||||||
|
*
|
||||||
|
* FreeLoader
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*
|
||||||
|
* Note: mostly ripped from atapi.c
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "freeldr.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "hardware.h"
|
||||||
|
#include "machxbox.h"
|
||||||
|
#include "portio.h"
|
||||||
|
#include "rtl.h"
|
||||||
|
|
||||||
|
#define XBOX_IDE_COMMAND_PORT 0x1f0
|
||||||
|
#define XBOX_IDE_CONTROL_PORT 0x170
|
||||||
|
|
||||||
|
#define IDE_SECTOR_BUF_SZ 512
|
||||||
|
#define IDE_MAX_POLL_RETRIES 100000
|
||||||
|
#define IDE_MAX_BUSY_RETRIES 50000
|
||||||
|
|
||||||
|
/* Control Block offsets and masks */
|
||||||
|
#define IDE_REG_ALT_STATUS 0x0000
|
||||||
|
#define IDE_REG_DEV_CNTRL 0x0000 /* device control register */
|
||||||
|
#define IDE_DC_SRST 0x04 /* drive reset (both drives) */
|
||||||
|
#define IDE_DC_nIEN 0x02 /* IRQ enable (active low) */
|
||||||
|
#define IDE_REG_DRV_ADDR 0x0001
|
||||||
|
|
||||||
|
/* Command Block offsets and masks */
|
||||||
|
#define IDE_REG_DATA_PORT 0x0000
|
||||||
|
#define IDE_REG_ERROR 0x0001 /* error register */
|
||||||
|
#define IDE_ER_AMNF 0x01 /* addr mark not found */
|
||||||
|
#define IDE_ER_TK0NF 0x02 /* track 0 not found */
|
||||||
|
#define IDE_ER_ABRT 0x04 /* command aborted */
|
||||||
|
#define IDE_ER_MCR 0x08 /* media change requested */
|
||||||
|
#define IDE_ER_IDNF 0x10 /* ID not found */
|
||||||
|
#define IDE_ER_MC 0x20 /* Media changed */
|
||||||
|
#define IDE_ER_UNC 0x40 /* Uncorrectable data error */
|
||||||
|
#define IDE_REG_PRECOMP 0x0001
|
||||||
|
#define IDE_REG_SECTOR_CNT 0x0002
|
||||||
|
#define IDE_REG_SECTOR_NUM 0x0003
|
||||||
|
#define IDE_REG_CYL_LOW 0x0004
|
||||||
|
#define IDE_REG_CYL_HIGH 0x0005
|
||||||
|
#define IDE_REG_DRV_HEAD 0x0006
|
||||||
|
#define IDE_DH_FIXED 0xA0
|
||||||
|
#define IDE_DH_LBA 0x40
|
||||||
|
#define IDE_DH_HDMASK 0x0F
|
||||||
|
#define IDE_DH_DRV0 0x00
|
||||||
|
#define IDE_DH_DRV1 0x10
|
||||||
|
#define IDE_REG_STATUS 0x0007
|
||||||
|
#define IDE_SR_BUSY 0x80
|
||||||
|
#define IDE_SR_DRDY 0x40
|
||||||
|
#define IDE_SR_WERR 0x20
|
||||||
|
#define IDE_SR_DRQ 0x08
|
||||||
|
#define IDE_SR_ERR 0x01
|
||||||
|
#define IDE_REG_COMMAND 0x0007
|
||||||
|
|
||||||
|
/* IDE/ATA commands */
|
||||||
|
#define IDE_CMD_RESET 0x08
|
||||||
|
#define IDE_CMD_READ 0x20
|
||||||
|
#define IDE_CMD_READ_RETRY 0x21
|
||||||
|
#define IDE_CMD_WRITE 0x30
|
||||||
|
#define IDE_CMD_WRITE_RETRY 0x31
|
||||||
|
#define IDE_CMD_PACKET 0xA0
|
||||||
|
#define IDE_CMD_READ_MULTIPLE 0xC4
|
||||||
|
#define IDE_CMD_WRITE_MULTIPLE 0xC5
|
||||||
|
#define IDE_CMD_READ_DMA 0xC8
|
||||||
|
#define IDE_CMD_WRITE_DMA 0xCA
|
||||||
|
#define IDE_CMD_FLUSH_CACHE 0xE7
|
||||||
|
#define IDE_CMD_FLUSH_CACHE_EXT 0xEA
|
||||||
|
#define IDE_CMD_IDENT_ATA_DRV 0xEC
|
||||||
|
#define IDE_CMD_IDENT_ATAPI_DRV 0xA1
|
||||||
|
#define IDE_CMD_GET_MEDIA_STATUS 0xDA
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Access macros for command registers
|
||||||
|
* Each macro takes an address of the command port block, and data
|
||||||
|
*/
|
||||||
|
#define IDEReadError(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_ERROR)))
|
||||||
|
#define IDEWritePrecomp(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_PRECOMP), (Data)))
|
||||||
|
#define IDEReadSectorCount(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_CNT)))
|
||||||
|
#define IDEWriteSectorCount(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_CNT), (Data)))
|
||||||
|
#define IDEReadSectorNum(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_NUM)))
|
||||||
|
#define IDEWriteSectorNum(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_NUM), (Data)))
|
||||||
|
#define IDEReadCylinderLow(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_LOW)))
|
||||||
|
#define IDEWriteCylinderLow(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_LOW), (Data)))
|
||||||
|
#define IDEReadCylinderHigh(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_HIGH)))
|
||||||
|
#define IDEWriteCylinderHigh(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_HIGH), (Data)))
|
||||||
|
#define IDEReadDriveHead(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DRV_HEAD)))
|
||||||
|
#define IDEWriteDriveHead(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DRV_HEAD), (Data)))
|
||||||
|
#define IDEReadStatus(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_STATUS)))
|
||||||
|
#define IDEWriteCommand(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_COMMAND), (Data)))
|
||||||
|
#define IDEReadDMACommand(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address))))
|
||||||
|
#define IDEWriteDMACommand(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address)), (Data)))
|
||||||
|
#define IDEReadDMAStatus(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address) + 2)))
|
||||||
|
#define IDEWriteDMAStatus(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address) + 2), (Data)))
|
||||||
|
#define IDEWritePRDTable(Address, Data) \
|
||||||
|
(WRITE_PORT_ULONG((PULONG)((Address) + 4), (Data)))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Data block read and write commands
|
||||||
|
*/
|
||||||
|
#define IDEReadBlock(Address, Buffer, Count) \
|
||||||
|
(READ_PORT_BUFFER_USHORT((PU16)((Address) + IDE_REG_DATA_PORT), (PU16)(Buffer), (Count) / 2))
|
||||||
|
#define IDEWriteBlock(Address, Buffer, Count) \
|
||||||
|
(WRITE_PORT_BUFFER_USHORT((PU16)((Address) + IDE_REG_DATA_PORT), (PU16)(Buffer), (Count) / 2))
|
||||||
|
|
||||||
|
#define IDEReadBlock32(Address, Buffer, Count) \
|
||||||
|
(READ_PORT_BUFFER_ULONG((PU32)((Address) + IDE_REG_DATA_PORT), (PU32)(Buffer), (Count) / 4))
|
||||||
|
#define IDEWriteBlock32(Address, Buffer, Count) \
|
||||||
|
(WRITE_PORT_BUFFER_ULONG((PU32)((Address) + IDE_REG_DATA_PORT), (PU32)(Buffer), (Count) / 4))
|
||||||
|
|
||||||
|
#define IDEReadWord(Address) \
|
||||||
|
(READ_PORT_USHORT((PU16)((Address) + IDE_REG_DATA_PORT)))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Access macros for control registers
|
||||||
|
* Each macro takes an address of the control port blank and data
|
||||||
|
*/
|
||||||
|
#define IDEReadAltStatus(Address) \
|
||||||
|
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_ALT_STATUS)))
|
||||||
|
#define IDEWriteDriveControl(Address, Data) \
|
||||||
|
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DEV_CNTRL), (Data)))
|
||||||
|
|
||||||
|
/* XboxDiskPolledRead
|
||||||
|
*
|
||||||
|
* DESCRIPTION:
|
||||||
|
* Read a sector of data from the drive in a polled fashion.
|
||||||
|
*
|
||||||
|
* RUN LEVEL:
|
||||||
|
* PASSIVE_LEVEL
|
||||||
|
*
|
||||||
|
* ARGUMENTS:
|
||||||
|
* U32 CommandPort Address of command port for drive
|
||||||
|
* U32 ControlPort Address of control port for drive
|
||||||
|
* U8 PreComp Value to write to precomp register
|
||||||
|
* U8 SectorCnt Value to write to sectorCnt register
|
||||||
|
* U8 SectorNum Value to write to sectorNum register
|
||||||
|
* U8 CylinderLow Value to write to CylinderLow register
|
||||||
|
* U8 CylinderHigh Value to write to CylinderHigh register
|
||||||
|
* U8 DrvHead Value to write to Drive/Head register
|
||||||
|
* U8 Command Value to write to Command register
|
||||||
|
* PVOID Buffer Buffer for output data
|
||||||
|
*
|
||||||
|
* RETURNS:
|
||||||
|
* BOOL: TRUE success, FALSE error
|
||||||
|
*/
|
||||||
|
|
||||||
|
static BOOL
|
||||||
|
XboxDiskPolledRead(U32 CommandPort,
|
||||||
|
U32 ControlPort,
|
||||||
|
U8 PreComp,
|
||||||
|
U8 SectorCnt,
|
||||||
|
U8 SectorNum,
|
||||||
|
U8 CylinderLow,
|
||||||
|
U8 CylinderHigh,
|
||||||
|
U8 DrvHead,
|
||||||
|
U8 Command,
|
||||||
|
PVOID Buffer)
|
||||||
|
{
|
||||||
|
U32 SectorCount = 0;
|
||||||
|
U32 RetryCount;
|
||||||
|
BOOL Junk = FALSE;
|
||||||
|
U8 Status;
|
||||||
|
|
||||||
|
/* Wait for BUSY to clear */
|
||||||
|
for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++)
|
||||||
|
{
|
||||||
|
Status = IDEReadStatus(CommandPort);
|
||||||
|
if (!(Status & IDE_SR_BUSY))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
KeStallExecutionProcessor(10);
|
||||||
|
}
|
||||||
|
DbgPrint((DPRINT_DISK, "status=0x%x\n", Status));
|
||||||
|
DbgPrint((DPRINT_DISK, "waited %d usecs for busy to clear\n", RetryCount * 10));
|
||||||
|
if (RetryCount >= IDE_MAX_BUSY_RETRIES)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_DISK, "Drive is BUSY for too long\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write Drive/Head to select drive */
|
||||||
|
IDEWriteDriveHead(CommandPort, IDE_DH_FIXED | DrvHead);
|
||||||
|
KeStallExecutionProcessor(500);
|
||||||
|
|
||||||
|
/* Disable interrupts */
|
||||||
|
IDEWriteDriveControl(ControlPort, IDE_DC_nIEN);
|
||||||
|
KeStallExecutionProcessor(500);
|
||||||
|
|
||||||
|
/* Issue command to drive */
|
||||||
|
if (DrvHead & IDE_DH_LBA)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_DISK, "READ:DRV=%d:LBA=1:BLK=%d:SC=0x%x:CM=0x%x\n",
|
||||||
|
DrvHead & IDE_DH_DRV1 ? 1 : 0,
|
||||||
|
((DrvHead & 0x0f) << 24) + (CylinderHigh << 16) + (CylinderLow << 8) + SectorNum,
|
||||||
|
SectorCnt,
|
||||||
|
Command));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_DISK, "READ:DRV=%d:LBA=0:CH=0x%x:CL=0x%x:HD=0x%x:SN=0x%x:SC=0x%x:CM=0x%x\n",
|
||||||
|
DrvHead & IDE_DH_DRV1 ? 1 : 0,
|
||||||
|
CylinderHigh,
|
||||||
|
CylinderLow,
|
||||||
|
DrvHead & 0x0f,
|
||||||
|
SectorNum,
|
||||||
|
SectorCnt,
|
||||||
|
Command));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Setup command parameters */
|
||||||
|
IDEWritePrecomp(CommandPort, PreComp);
|
||||||
|
IDEWriteSectorCount(CommandPort, SectorCnt);
|
||||||
|
IDEWriteSectorNum(CommandPort, SectorNum);
|
||||||
|
IDEWriteCylinderHigh(CommandPort, CylinderHigh);
|
||||||
|
IDEWriteCylinderLow(CommandPort, CylinderLow);
|
||||||
|
IDEWriteDriveHead(CommandPort, IDE_DH_FIXED | DrvHead);
|
||||||
|
|
||||||
|
/* Issue the command */
|
||||||
|
IDEWriteCommand(CommandPort, Command);
|
||||||
|
KeStallExecutionProcessor(50);
|
||||||
|
|
||||||
|
/* wait for DRQ or error */
|
||||||
|
for (RetryCount = 0; RetryCount < IDE_MAX_POLL_RETRIES; RetryCount++)
|
||||||
|
{
|
||||||
|
Status = IDEReadStatus(CommandPort);
|
||||||
|
if (!(Status & IDE_SR_BUSY))
|
||||||
|
{
|
||||||
|
if (Status & IDE_SR_ERR)
|
||||||
|
{
|
||||||
|
IDEWriteDriveControl(ControlPort, 0);
|
||||||
|
KeStallExecutionProcessor(50);
|
||||||
|
IDEReadStatus(CommandPort);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Status & IDE_SR_DRQ)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IDEWriteDriveControl(ControlPort, 0);
|
||||||
|
KeStallExecutionProcessor(50);
|
||||||
|
IDEReadStatus(CommandPort);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
KeStallExecutionProcessor(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* timed out */
|
||||||
|
if (RetryCount >= IDE_MAX_POLL_RETRIES)
|
||||||
|
{
|
||||||
|
IDEWriteDriveControl(ControlPort, 0);
|
||||||
|
KeStallExecutionProcessor(50);
|
||||||
|
IDEReadStatus(CommandPort);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
/* Read data into buffer */
|
||||||
|
if (Junk == FALSE)
|
||||||
|
{
|
||||||
|
IDEReadBlock(CommandPort, Buffer, IDE_SECTOR_BUF_SZ);
|
||||||
|
Buffer += IDE_SECTOR_BUF_SZ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UCHAR JunkBuffer[IDE_SECTOR_BUF_SZ];
|
||||||
|
IDEReadBlock(CommandPort, JunkBuffer, IDE_SECTOR_BUF_SZ);
|
||||||
|
}
|
||||||
|
SectorCount++;
|
||||||
|
|
||||||
|
/* Check for error or more sectors to read */
|
||||||
|
for (RetryCount = 0; RetryCount < IDE_MAX_BUSY_RETRIES; RetryCount++)
|
||||||
|
{
|
||||||
|
Status = IDEReadStatus(CommandPort);
|
||||||
|
if (!(Status & IDE_SR_BUSY))
|
||||||
|
{
|
||||||
|
if (Status & IDE_SR_ERR)
|
||||||
|
{
|
||||||
|
IDEWriteDriveControl(ControlPort, 0);
|
||||||
|
KeStallExecutionProcessor(50);
|
||||||
|
IDEReadStatus(CommandPort);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (Status & IDE_SR_DRQ)
|
||||||
|
{
|
||||||
|
if (SectorCount >= SectorCnt)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_DISK, "Buffer size exceeded!\n"));
|
||||||
|
Junk = TRUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (SectorCount > SectorCnt)
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_DISK, "Read %lu sectors of junk!\n",
|
||||||
|
SectorCount - SectorCnt));
|
||||||
|
}
|
||||||
|
IDEWriteDriveControl(ControlPort, 0);
|
||||||
|
KeStallExecutionProcessor(50);
|
||||||
|
IDEReadStatus(CommandPort);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
XboxDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer)
|
||||||
|
{
|
||||||
|
U32 StartSector;
|
||||||
|
U8 Count;
|
||||||
|
|
||||||
|
if (DriveNumber < 0x80 || 2 <= (DriveNumber & 0x0f))
|
||||||
|
{
|
||||||
|
/* Xbox has only 1 IDE controller and no floppy */
|
||||||
|
DbgPrint((DPRINT_DISK, "Invalid drive number\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UINT64_C(0) != ((SectorNumber + SectorCount) & UINT64_C(0xfffffffff0000000)))
|
||||||
|
{
|
||||||
|
DbgPrint((DPRINT_DISK, "48bit LBA required but not implemented\n"));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
StartSector = (U32) SectorNumber;
|
||||||
|
while (0 < SectorCount)
|
||||||
|
{
|
||||||
|
Count = (SectorCount <= 255 ? SectorCount : 255);
|
||||||
|
if (! XboxDiskPolledRead(XBOX_IDE_COMMAND_PORT,
|
||||||
|
XBOX_IDE_CONTROL_PORT,
|
||||||
|
0, Count,
|
||||||
|
StartSector & 0xff,
|
||||||
|
(StartSector >> 8) & 0xff,
|
||||||
|
(StartSector >> 16) & 0xff,
|
||||||
|
((StartSector >> 24) & 0x0f) | IDE_DH_LBA |
|
||||||
|
(0 == (DriveNumber & 0x0f) ? IDE_DH_DRV0 : IDE_DH_DRV1),
|
||||||
|
IDE_CMD_READ,
|
||||||
|
Buffer))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
SectorCount -= Count;
|
||||||
|
Buffer = (PVOID) ((PCHAR) Buffer + Count * IDE_SECTOR_BUF_SZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: xboxmem.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
/* $Id: xboxmem.c,v 1.2 2004/11/09 23:36:19 gvg Exp $
|
||||||
*
|
*
|
||||||
* FreeLoader
|
* FreeLoader
|
||||||
*
|
*
|
||||||
|
@ -108,18 +108,6 @@ XboxMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
|
||||||
return EntryCount;
|
return EntryCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
|
||||||
XboxMemGetInstalledMemoryMb(VOID)
|
|
||||||
{
|
|
||||||
if (0 == InstalledMemoryMb)
|
|
||||||
{
|
|
||||||
/* Hmm, seems we're not initialized yet */
|
|
||||||
XboxMemInit();
|
|
||||||
}
|
|
||||||
|
|
||||||
return InstalledMemoryMb;
|
|
||||||
}
|
|
||||||
|
|
||||||
PVOID
|
PVOID
|
||||||
XboxMemReserveMemory(U32 MbToReserve)
|
XboxMemReserveMemory(U32 MbToReserve)
|
||||||
{
|
{
|
||||||
|
|
3
freeldr/freeldr/cache/blocklist.c
vendored
3
freeldr/freeldr/cache/blocklist.c
vendored
|
@ -25,6 +25,7 @@
|
||||||
#include <rtl.h>
|
#include <rtl.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <arch.h>
|
#include <arch.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
// Returns a pointer to a CACHE_BLOCK structure
|
// Returns a pointer to a CACHE_BLOCK structure
|
||||||
// Adds the block to the cache manager block list
|
// Adds the block to the cache manager block list
|
||||||
|
@ -122,7 +123,7 @@ PCACHE_BLOCK CacheInternalAddBlockToCache(PCACHE_DRIVE CacheDrive, U32 BlockNumb
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now try to read in the block
|
// Now try to read in the block
|
||||||
if (!DiskReadLogicalSectors(CacheDrive->DriveNumber, (BlockNumber * CacheDrive->BlockSize), CacheDrive->BlockSize, (PVOID)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(CacheDrive->DriveNumber, (BlockNumber * CacheDrive->BlockSize), CacheDrive->BlockSize, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
MmFreeMemory(CacheBlock->BlockData);
|
MmFreeMemory(CacheBlock->BlockData);
|
||||||
MmFreeMemory(CacheBlock);
|
MmFreeMemory(CacheBlock);
|
||||||
|
|
|
@ -76,7 +76,6 @@ VOID DebugInit(VOID)
|
||||||
|
|
||||||
VOID DebugPrintChar(UCHAR Character)
|
VOID DebugPrintChar(UCHAR Character)
|
||||||
{
|
{
|
||||||
extern VOID XboxVideoPutChar(char c);
|
|
||||||
if (Character == '\n')
|
if (Character == '\n')
|
||||||
{
|
{
|
||||||
DebugStartOfLine = TRUE;
|
DebugStartOfLine = TRUE;
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <arch.h>
|
#include <arch.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
|
|
||||||
BOOL DiskGetActivePartitionEntry(U32 DriveNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry)
|
BOOL DiskGetActivePartitionEntry(U32 DriveNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry)
|
||||||
|
@ -201,7 +202,7 @@ BOOL DiskReadBootRecord(U32 DriveNumber, U64 LogicalSectorNumber, PMASTER_BOOT_R
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Read master boot record
|
// Read master boot record
|
||||||
if (!DiskReadLogicalSectors(DriveNumber, LogicalSectorNumber, 1, (PVOID)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(DriveNumber, LogicalSectorNumber, 1, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <cache.h>
|
#include <cache.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
|
|
||||||
GEOMETRY Ext2DiskGeometry; // Ext2 file system disk geometry
|
GEOMETRY Ext2DiskGeometry; // Ext2 file system disk geometry
|
||||||
|
@ -563,7 +564,7 @@ BOOL Ext2ReadVolumeSectors(U8 DriveNumber, U64 SectorNumber, U64 SectorCount, PV
|
||||||
//{
|
//{
|
||||||
// return FALSE;
|
// return FALSE;
|
||||||
//}
|
//}
|
||||||
//ReturnValue = DiskReadLogicalSectors(DriveNumber, SectorNumber + Ext2VolumeStartSector, SectorCount, (PVOID)DISKREADBUFFER);
|
//ReturnValue = MachDiskReadLogicalSectors(DriveNumber, SectorNumber + Ext2VolumeStartSector, SectorCount, (PVOID)DISKREADBUFFER);
|
||||||
//RtlCopyMemory(Buffer, (PVOID)DISKREADBUFFER, SectorCount * DiskGeometry.BytesPerSector);
|
//RtlCopyMemory(Buffer, (PVOID)DISKREADBUFFER, SectorCount * DiskGeometry.BytesPerSector);
|
||||||
//return ReturnValue;
|
//return ReturnValue;
|
||||||
|
|
||||||
|
@ -601,7 +602,7 @@ BOOL Ext2ReadSuperBlock(VOID)
|
||||||
|
|
||||||
// Now try to read the super block
|
// Now try to read the super block
|
||||||
// If this fails then abort
|
// If this fails then abort
|
||||||
if (!DiskReadLogicalSectors(Ext2DriveNumber, Ext2VolumeStartSector, 8, (PVOID)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(Ext2DriveNumber, Ext2VolumeStartSector, 8, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <cache.h>
|
#include <cache.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
|
|
||||||
PFAT_BOOTSECTOR FatVolumeBootSector = NULL;
|
PFAT_BOOTSECTOR FatVolumeBootSector = NULL;
|
||||||
|
@ -76,7 +77,7 @@ BOOL FatOpenVolume(U32 DriveNumber, U32 VolumeStartSector)
|
||||||
|
|
||||||
// Now try to read the boot sector
|
// Now try to read the boot sector
|
||||||
// If this fails then abort
|
// If this fails then abort
|
||||||
if (!DiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, (PVOID)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -1206,7 +1207,7 @@ BOOL FatReadVolumeSectors(U32 DriveNumber, U32 SectorNumber, U32 SectorCount, PV
|
||||||
//{
|
//{
|
||||||
// return FALSE;
|
// return FALSE;
|
||||||
//}
|
//}
|
||||||
//ReturnValue = DiskReadLogicalSectors(DriveNumber, SectorNumber + FatVolumeBootSector->HiddenSectors, SectorCount, (PVOID)DISKREADBUFFER);
|
//ReturnValue = MachDiskReadLogicalSectors(DriveNumber, SectorNumber + FatVolumeBootSector->HiddenSectors, SectorCount, (PVOID)DISKREADBUFFER);
|
||||||
//RtlCopyMemory(Buffer, (PVOID)DISKREADBUFFER, SectorCount * DiskGeometry.BytesPerSector);
|
//RtlCopyMemory(Buffer, (PVOID)DISKREADBUFFER, SectorCount * DiskGeometry.BytesPerSector);
|
||||||
//return ReturnValue;
|
//return ReturnValue;
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <rtl.h>
|
#include <rtl.h>
|
||||||
#include <arch.h>
|
#include <arch.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,7 +70,7 @@ BOOL FsRecIsIso9660(U32 DriveNumber)
|
||||||
{
|
{
|
||||||
PUCHAR Sector = (PUCHAR)DISKREADBUFFER;
|
PUCHAR Sector = (PUCHAR)DISKREADBUFFER;
|
||||||
|
|
||||||
if (!DiskReadLogicalSectors(DriveNumber, 16, 1, Sector))
|
if (!MachDiskReadLogicalSectors(DriveNumber, 16, 1, Sector))
|
||||||
{
|
{
|
||||||
FileSystemError("Failed to read the PVD.");
|
FileSystemError("Failed to read the PVD.");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -87,7 +88,7 @@ BOOL FsRecIsExt2(U32 DriveNumber, U32 VolumeStartSector)
|
||||||
{
|
{
|
||||||
PEXT2_SUPER_BLOCK SuperBlock = (PEXT2_SUPER_BLOCK)DISKREADBUFFER;
|
PEXT2_SUPER_BLOCK SuperBlock = (PEXT2_SUPER_BLOCK)DISKREADBUFFER;
|
||||||
|
|
||||||
if (!DiskReadLogicalSectors(DriveNumber, VolumeStartSector + 2, 2, SuperBlock))
|
if (!MachDiskReadLogicalSectors(DriveNumber, VolumeStartSector + 2, 2, SuperBlock))
|
||||||
{
|
{
|
||||||
FileSystemError("Failed to read the super block.");
|
FileSystemError("Failed to read the super block.");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -105,7 +106,7 @@ BOOL FsRecIsFat(U32 DriveNumber, U32 VolumeStartSector)
|
||||||
{
|
{
|
||||||
PFAT_BOOTSECTOR BootSector = (PFAT_BOOTSECTOR)DISKREADBUFFER;
|
PFAT_BOOTSECTOR BootSector = (PFAT_BOOTSECTOR)DISKREADBUFFER;
|
||||||
PFAT32_BOOTSECTOR BootSector32 = (PFAT32_BOOTSECTOR)DISKREADBUFFER;
|
PFAT32_BOOTSECTOR BootSector32 = (PFAT32_BOOTSECTOR)DISKREADBUFFER;
|
||||||
if (!DiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, BootSector))
|
if (!MachDiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, BootSector))
|
||||||
{
|
{
|
||||||
FileSystemError("Failed to read the boot sector.");
|
FileSystemError("Failed to read the boot sector.");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -124,7 +125,7 @@ BOOL FsRecIsFat(U32 DriveNumber, U32 VolumeStartSector)
|
||||||
BOOL FsRecIsNtfs(U32 DriveNumber, U32 VolumeStartSector)
|
BOOL FsRecIsNtfs(U32 DriveNumber, U32 VolumeStartSector)
|
||||||
{
|
{
|
||||||
PNTFS_BOOTSECTOR BootSector = (PNTFS_BOOTSECTOR)DISKREADBUFFER;
|
PNTFS_BOOTSECTOR BootSector = (PNTFS_BOOTSECTOR)DISKREADBUFFER;
|
||||||
if (!DiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, BootSector))
|
if (!MachDiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, BootSector))
|
||||||
{
|
{
|
||||||
FileSystemError("Failed to read the boot sector.");
|
FileSystemError("Failed to read the boot sector.");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <cache.h>
|
#include <cache.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
#include "iso.h"
|
#include "iso.h"
|
||||||
|
|
||||||
|
@ -49,7 +50,7 @@ BOOL IsoOpenVolume(U32 DriveNumber)
|
||||||
IsoRootSector = 0;
|
IsoRootSector = 0;
|
||||||
IsoRootLength = 0;
|
IsoRootLength = 0;
|
||||||
|
|
||||||
if (!DiskReadLogicalSectors(DriveNumber, 16, 1, Pvd))
|
if (!MachDiskReadLogicalSectors(DriveNumber, 16, 1, Pvd))
|
||||||
{
|
{
|
||||||
FileSystemError("Failed to read the PVD.");
|
FileSystemError("Failed to read the PVD.");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -160,7 +161,7 @@ static PVOID IsoBufferDirectory(U32 DirectoryStartSector, U32 DirectoryLength)
|
||||||
//
|
//
|
||||||
for (i = 0, Ptr = DirectoryBuffer; i < SectorCount; i++, Ptr += SECTORSIZE)
|
for (i = 0, Ptr = DirectoryBuffer; i < SectorCount; i++, Ptr += SECTORSIZE)
|
||||||
{
|
{
|
||||||
if (!DiskReadLogicalSectors(IsoDriveNumber, DirectoryStartSector + i, 1, (PVOID)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(IsoDriveNumber, DirectoryStartSector + i, 1, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
MmFreeMemory(DirectoryBuffer);
|
MmFreeMemory(DirectoryBuffer);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -372,7 +373,7 @@ BOOL IsoReadFile(FILE *FileHandle, U32 BytesToRead, U32* BytesRead, PVOID Buffer
|
||||||
//
|
//
|
||||||
// Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer
|
// Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer
|
||||||
//
|
//
|
||||||
if (!DiskReadLogicalSectors(IsoDriveNumber, SectorNumber, 1, (PVOID)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(IsoDriveNumber, SectorNumber, 1, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -403,7 +404,7 @@ BOOL IsoReadFile(FILE *FileHandle, U32 BytesToRead, U32* BytesRead, PVOID Buffer
|
||||||
//
|
//
|
||||||
// Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer
|
// Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer
|
||||||
//
|
//
|
||||||
if (!DiskReadLogicalSectorsLBA(IsoDriveNumber, SectorNumber, 1, (PVOID)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(IsoDriveNumber, SectorNumber, 1, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -430,7 +431,7 @@ BOOL IsoReadFile(FILE *FileHandle, U32 BytesToRead, U32* BytesRead, PVOID Buffer
|
||||||
//
|
//
|
||||||
// Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer
|
// Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer
|
||||||
//
|
//
|
||||||
if (!DiskReadLogicalSectorsLBA(IsoDriveNumber, SectorNumber, 1, (PVOID)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(IsoDriveNumber, SectorNumber, 1, (PVOID)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <mm.h>
|
#include <mm.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <cache.h>
|
#include <cache.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
#include "ntfs.h"
|
#include "ntfs.h"
|
||||||
|
|
||||||
|
@ -157,7 +158,7 @@ BOOL NtfsDiskRead(U64 Offset, U64 Length, PCHAR Buffer)
|
||||||
/* I. Read partial first sector if needed */
|
/* I. Read partial first sector if needed */
|
||||||
if (Offset % NtfsBootSector->BytesPerSector)
|
if (Offset % NtfsBootSector->BytesPerSector)
|
||||||
{
|
{
|
||||||
if (!DiskReadLogicalSectors(NtfsDriveNumber, NtfsSectorOfClusterZero + (Offset / NtfsBootSector->BytesPerSector), 1, (PCHAR)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(NtfsDriveNumber, NtfsSectorOfClusterZero + (Offset / NtfsBootSector->BytesPerSector), 1, (PCHAR)DISKREADBUFFER))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
ReadLength = min(Length, NtfsBootSector->BytesPerSector - (Offset % NtfsBootSector->BytesPerSector));
|
ReadLength = min(Length, NtfsBootSector->BytesPerSector - (Offset % NtfsBootSector->BytesPerSector));
|
||||||
RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER + (Offset % NtfsBootSector->BytesPerSector), ReadLength);
|
RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER + (Offset % NtfsBootSector->BytesPerSector), ReadLength);
|
||||||
|
@ -169,7 +170,7 @@ BOOL NtfsDiskRead(U64 Offset, U64 Length, PCHAR Buffer)
|
||||||
/* II. Read all complete 64-sector blocks. */
|
/* II. Read all complete 64-sector blocks. */
|
||||||
while (Length >= 64 * NtfsBootSector->BytesPerSector)
|
while (Length >= 64 * NtfsBootSector->BytesPerSector)
|
||||||
{
|
{
|
||||||
if (!DiskReadLogicalSectors(NtfsDriveNumber, NtfsSectorOfClusterZero + (Offset / NtfsBootSector->BytesPerSector), 64, (PCHAR)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(NtfsDriveNumber, NtfsSectorOfClusterZero + (Offset / NtfsBootSector->BytesPerSector), 64, (PCHAR)DISKREADBUFFER))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER, 64 * NtfsBootSector->BytesPerSector);
|
RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER, 64 * NtfsBootSector->BytesPerSector);
|
||||||
Buffer += 64 * NtfsBootSector->BytesPerSector;
|
Buffer += 64 * NtfsBootSector->BytesPerSector;
|
||||||
|
@ -181,7 +182,7 @@ BOOL NtfsDiskRead(U64 Offset, U64 Length, PCHAR Buffer)
|
||||||
if (Length)
|
if (Length)
|
||||||
{
|
{
|
||||||
ReadLength = ((Length + NtfsBootSector->BytesPerSector - 1) / NtfsBootSector->BytesPerSector);
|
ReadLength = ((Length + NtfsBootSector->BytesPerSector - 1) / NtfsBootSector->BytesPerSector);
|
||||||
if (!DiskReadLogicalSectors(NtfsDriveNumber, NtfsSectorOfClusterZero + (Offset / NtfsBootSector->BytesPerSector), ReadLength, (PCHAR)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(NtfsDriveNumber, NtfsSectorOfClusterZero + (Offset / NtfsBootSector->BytesPerSector), ReadLength, (PCHAR)DISKREADBUFFER))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER, Length);
|
RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER, Length);
|
||||||
}
|
}
|
||||||
|
@ -611,7 +612,7 @@ BOOL NtfsOpenVolume(U32 DriveNumber, U32 VolumeStartSector)
|
||||||
|
|
||||||
DbgPrint((DPRINT_FILESYSTEM, "NtfsOpenVolume() DriveNumber = 0x%x VolumeStartSector = 0x%x\n", DriveNumber, VolumeStartSector));
|
DbgPrint((DPRINT_FILESYSTEM, "NtfsOpenVolume() DriveNumber = 0x%x VolumeStartSector = 0x%x\n", DriveNumber, VolumeStartSector));
|
||||||
|
|
||||||
if (!DiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, (PCHAR)DISKREADBUFFER))
|
if (!MachDiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, (PCHAR)DISKREADBUFFER))
|
||||||
{
|
{
|
||||||
FileSystemError("Failed to read the boot sector.");
|
FileSystemError("Failed to read the boot sector.");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -651,7 +652,7 @@ BOOL NtfsOpenVolume(U32 DriveNumber, U32 VolumeStartSector)
|
||||||
NtfsSectorOfClusterZero = VolumeStartSector;
|
NtfsSectorOfClusterZero = VolumeStartSector;
|
||||||
|
|
||||||
DbgPrint((DPRINT_FILESYSTEM, "Reading MFT index...\n"));
|
DbgPrint((DPRINT_FILESYSTEM, "Reading MFT index...\n"));
|
||||||
if (!DiskReadLogicalSectors(DriveNumber,
|
if (!MachDiskReadLogicalSectors(DriveNumber,
|
||||||
NtfsSectorOfClusterZero +
|
NtfsSectorOfClusterZero +
|
||||||
(NtfsBootSector->MftLocation * NtfsBootSector->SectorsPerCluster),
|
(NtfsBootSector->MftLocation * NtfsBootSector->SectorsPerCluster),
|
||||||
NtfsMftRecordSize / NtfsBootSector->BytesPerSector, (PCHAR)DISKREADBUFFER))
|
NtfsMftRecordSize / NtfsBootSector->BytesPerSector, (PCHAR)DISKREADBUFFER))
|
||||||
|
|
|
@ -106,9 +106,6 @@ typedef struct _MASTER_BOOT_RECORD
|
||||||
///////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
|
|
||||||
//BOOL DiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer);
|
|
||||||
BOOL DiskReadLogicalSectorsLBA(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer);
|
|
||||||
BOOL DiskReadLogicalSectorsCHS(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer);
|
|
||||||
BOOL DiskResetController(U32 DriveNumber);
|
BOOL DiskResetController(U32 DriveNumber);
|
||||||
BOOL DiskInt13ExtensionsSupported(U32 DriveNumber);
|
BOOL DiskInt13ExtensionsSupported(U32 DriveNumber);
|
||||||
//VOID DiskStopFloppyMotor(VOID);
|
//VOID DiskStopFloppyMotor(VOID);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: machine.h,v 1.1 2004/11/08 22:02:48 gvg Exp $
|
/* $Id: machine.h,v 1.2 2004/11/09 23:36:20 gvg Exp $
|
||||||
*
|
*
|
||||||
* FreeLoader
|
* FreeLoader
|
||||||
*
|
*
|
||||||
|
@ -31,6 +31,8 @@ typedef struct tagMACHVTBL
|
||||||
VOID (*PutCharAttrAtLoc)(int Ch, U8 Attr, unsigned X, unsigned Y);
|
VOID (*PutCharAttrAtLoc)(int Ch, U8 Attr, unsigned X, unsigned Y);
|
||||||
|
|
||||||
U32 (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
|
U32 (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
|
||||||
|
|
||||||
|
BOOL (*DiskReadLogicalSectors)(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer);
|
||||||
} MACHVTBL, *PMACHVTBL;
|
} MACHVTBL, *PMACHVTBL;
|
||||||
|
|
||||||
VOID MachInit(VOID);
|
VOID MachInit(VOID);
|
||||||
|
@ -41,6 +43,7 @@ extern MACHVTBL MachVtbl;
|
||||||
#define MachPutChar(Ch) MachVtbl.PutChar(Ch)
|
#define MachPutChar(Ch) MachVtbl.PutChar(Ch)
|
||||||
#define MachPutCharAttrAtLoc(Ch, Attr, X, Y) MachVtbl.PutCharAttrAtLoc((Ch), (Attr), (X), (Y))
|
#define MachPutCharAttrAtLoc(Ch, Attr, X, Y) MachVtbl.PutCharAttrAtLoc((Ch), (Attr), (X), (Y))
|
||||||
#define MachGetMemoryMap(MMap, Size) MachVtbl.GetMemoryMap((MMap), (Size))
|
#define MachGetMemoryMap(MMap, Size) MachVtbl.GetMemoryMap((MMap), (Size))
|
||||||
|
#define MachDiskReadLogicalSectors(Drive, Start, Count, Buf) MachVtbl.DiskReadLogicalSectors((Drive), (Start), (Count), (Buf))
|
||||||
|
|
||||||
#endif /* __MACHINE_H_ */
|
#endif /* __MACHINE_H_ */
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,9 @@ void sound(int freq);
|
||||||
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
|
||||||
|
#define UINT64_C(val) val##ULL
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Screen Output Functions
|
// Screen Output Functions
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: machine.c,v 1.1 2004/11/08 22:02:47 gvg Exp $
|
/* $Id: machine.c,v 1.2 2004/11/09 23:36:19 gvg Exp $
|
||||||
*
|
*
|
||||||
* FreeLoader
|
* FreeLoader
|
||||||
*
|
*
|
||||||
|
@ -24,6 +24,7 @@
|
||||||
#undef MachPutChar
|
#undef MachPutChar
|
||||||
#undef MachPutCharAttrAtLoc
|
#undef MachPutCharAttrAtLoc
|
||||||
#undef MachGetMemoryMap
|
#undef MachGetMemoryMap
|
||||||
|
#undef MachDiskReadLogicalSectors
|
||||||
|
|
||||||
MACHVTBL MachVtbl;
|
MACHVTBL MachVtbl;
|
||||||
|
|
||||||
|
@ -33,19 +34,28 @@ MachClearScreenAttr(U8 Attr)
|
||||||
MachVtbl.ClearScreenAttr(Attr);
|
MachVtbl.ClearScreenAttr(Attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MachPutChar(int Ch)
|
void
|
||||||
|
MachPutChar(int Ch)
|
||||||
{
|
{
|
||||||
MachVtbl.PutChar(Ch);
|
MachVtbl.PutChar(Ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MachPutCharAttrAtLoc(int Ch, U8 Attr, unsigned X, unsigned Y)
|
void
|
||||||
|
MachPutCharAttrAtLoc(int Ch, U8 Attr, unsigned X, unsigned Y)
|
||||||
{
|
{
|
||||||
MachVtbl.PutCharAttrAtLoc(Ch, Attr, X, Y);
|
MachVtbl.PutCharAttrAtLoc(Ch, Attr, X, Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
U32 MachGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
|
U32
|
||||||
|
MachGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
|
||||||
{
|
{
|
||||||
return MachVtbl.GetMemoryMap(BiosMemoryMap, MaxMemoryMapSize);
|
return MachVtbl.GetMemoryMap(BiosMemoryMap, MaxMemoryMapSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
MachDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer)
|
||||||
|
{
|
||||||
|
return MachVtbl.DiskReadLogicalSectors(DriveNumber, SectorNumber, SectorCount, Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <inifile.h>
|
#include <inifile.h>
|
||||||
#include <disk.h>
|
#include <disk.h>
|
||||||
#include <drivemap.h>
|
#include <drivemap.h>
|
||||||
|
#include <machine.h>
|
||||||
|
|
||||||
VOID LoadAndBootBootSector(PUCHAR OperatingSystemName)
|
VOID LoadAndBootBootSector(PUCHAR OperatingSystemName)
|
||||||
{
|
{
|
||||||
|
@ -152,7 +153,7 @@ VOID LoadAndBootPartition(PUCHAR OperatingSystemName)
|
||||||
|
|
||||||
// Now try to read the partition boot sector
|
// Now try to read the partition boot sector
|
||||||
// If this fails then abort
|
// If this fails then abort
|
||||||
if (!DiskReadLogicalSectors(BootDrive, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00))
|
if (!MachDiskReadLogicalSectors(BootDrive, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -204,7 +205,7 @@ VOID LoadAndBootDrive(PUCHAR OperatingSystemName)
|
||||||
|
|
||||||
// Now try to read the boot sector (or mbr)
|
// Now try to read the boot sector (or mbr)
|
||||||
// If this fails then abort
|
// If this fails then abort
|
||||||
if (!DiskReadLogicalSectors(BootDrive, 0, 1, (PVOID)0x7C00))
|
if (!MachDiskReadLogicalSectors(BootDrive, 0, 1, (PVOID)0x7C00))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue