2 added + 23 modified, total 25 files
freeldr/freeldr
diff -u -r1.54 -r1.55
--- Makefile 8 Nov 2004 22:02:47 -0000 1.54
+++ Makefile 9 Nov 2004 23:36:19 -0000 1.55
@@ -213,7 +213,9 @@
machpc.o \
machxbox.o \
pccons.o \
+ pcdisk.o \
pcmem.o \
+ xboxdisk.o \
xboxfont.o \
xboxmem.o \
xboxvideo.o \
freeldr/freeldr
diff -u -r1.22 -r1.23
--- debug.c 8 Nov 2004 22:02:47 -0000 1.22
+++ debug.c 9 Nov 2004 23:36:19 -0000 1.23
@@ -76,7 +76,6 @@
VOID DebugPrintChar(UCHAR Character)
{
-extern VOID XboxVideoPutChar(char c);
if (Character == '\n')
{
DebugStartOfLine = TRUE;
freeldr/freeldr
diff -u -r1.1 -r1.2
--- machine.c 8 Nov 2004 22:02:47 -0000 1.1
+++ machine.c 9 Nov 2004 23:36:19 -0000 1.2
@@ -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
*
@@ -24,6 +24,7 @@
#undef MachPutChar
#undef MachPutCharAttrAtLoc
#undef MachGetMemoryMap
+#undef MachDiskReadLogicalSectors
MACHVTBL MachVtbl;
@@ -33,19 +34,28 @@
MachVtbl.ClearScreenAttr(Attr);
}
-void MachPutChar(int Ch)
+void
+MachPutChar(int 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);
}
-U32 MachGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
+U32
+MachGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize)
{
return MachVtbl.GetMemoryMap(BiosMemoryMap, MaxMemoryMapSize);
}
+BOOL
+MachDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer)
+{
+ return MachVtbl.DiskReadLogicalSectors(DriveNumber, SectorNumber, SectorCount, Buffer);
+}
+
/* EOF */
freeldr/freeldr
diff -u -r1.17 -r1.18
--- miscboot.c 25 May 2003 21:20:43 -0000 1.17
+++ miscboot.c 9 Nov 2004 23:36:19 -0000 1.18
@@ -27,6 +27,7 @@
#include <inifile.h>
#include <disk.h>
#include <drivemap.h>
+#include <machine.h>
VOID LoadAndBootBootSector(PUCHAR OperatingSystemName)
{
@@ -152,7 +153,7 @@
// Now try to read the partition boot sector
// If this fails then abort
- if (!DiskReadLogicalSectors(BootDrive, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00))
+ if (!MachDiskReadLogicalSectors(BootDrive, PartitionTableEntry.SectorCountBeforePartition, 1, (PVOID)0x7C00))
{
return;
}
@@ -204,7 +205,7 @@
// Now try to read the boot sector (or mbr)
// If this fails then abort
- if (!DiskReadLogicalSectors(BootDrive, 0, 1, (PVOID)0x7C00))
+ if (!MachDiskReadLogicalSectors(BootDrive, 0, 1, (PVOID)0x7C00))
{
return;
}
freeldr/freeldr/arch/i386
diff -N pcdisk.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ pcdisk.c 9 Nov 2004 23:36:19 -0000 1.1
@@ -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;
+}
freeldr/freeldr/arch/i386
diff -N xboxdisk.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ xboxdisk.c 9 Nov 2004 23:36:19 -0000 1.1
@@ -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 */
freeldr/freeldr/arch/i386
diff -u -r1.1 -r1.2
--- archmach.c 8 Nov 2004 22:02:47 -0000 1.1
+++ archmach.c 9 Nov 2004 23:36:19 -0000 1.2
@@ -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
*
@@ -45,6 +45,8 @@
{
PcMachInit();
}
+
+ HalpCalibrateStallExecution();
}
/* EOF */
freeldr/freeldr/arch/i386
diff -u -r1.20 -r1.21
--- hardware.c 30 Aug 2004 10:50:13 -0000 1.20
+++ hardware.c 9 Nov 2004 23:36:19 -0000 1.21
@@ -24,6 +24,7 @@
#include <debug.h>
#include <disk.h>
#include <mm.h>
+#include <machine.h>
#include <portio.h>
#include <video.h>
@@ -569,7 +570,7 @@
S32 Error;
/* Read the MBR */
- if (!DiskReadLogicalSectors(DriveNumber, 0ULL, 1, (PVOID)DISKREADBUFFER))
+ if (!MachDiskReadLogicalSectors(DriveNumber, 0ULL, 1, (PVOID)DISKREADBUFFER))
{
DbgPrint((DPRINT_HWDETECT, "Reading MBR failed\n"));
return;
@@ -645,7 +646,7 @@
/* Count the number of visible drives */
DiskReportError(FALSE);
DiskCount = 0;
- while (DiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER))
+ while (MachDiskReadLogicalSectors(0x80 + DiskCount, 0ULL, 1, (PVOID)DISKREADBUFFER))
{
DiskCount++;
}
@@ -2238,8 +2239,6 @@
DbgPrint((DPRINT_HWDETECT, "DetectHardware()\n"));
- HalpCalibrateStallExecution ();
-
/* Create the 'System' key */
Error = RegCreateKey(NULL,
"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System",
freeldr/freeldr/arch/i386
diff -u -r1.6 -r1.7
--- hardware.h 8 Nov 2004 22:02:47 -0000 1.6
+++ hardware.h 9 Nov 2004 23:36:19 -0000 1.7
@@ -159,6 +159,7 @@
/* PROTOTYPES ***************************************************************/
/* hardware.c */
+VOID HalpCalibrateStallExecution(VOID);
VOID KeStallExecutionProcessor(U32 Microseconds);
VOID SetComponentInformation(HKEY ComponentKey,
freeldr/freeldr/arch/i386
diff -u -r1.7 -r1.8
--- i386disk.c 15 Jun 2004 12:22:19 -0000 1.7
+++ i386disk.c 9 Nov 2004 23:36:19 -0000 1.8
@@ -25,251 +25,12 @@
#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
/////////////////////////////////////////////////////////////////////////////////////////////
#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)
{
REGS RegsIn;
freeldr/freeldr/arch/i386
diff -u -r1.1 -r1.2
--- machpc.c 8 Nov 2004 22:02:47 -0000 1.1
+++ machpc.c 9 Nov 2004 23:36:19 -0000 1.2
@@ -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
*
@@ -34,6 +34,7 @@
MachVtbl.PutChar = PcConsPutChar;
MachVtbl.PutCharAttrAtLoc = PcConsPutCharAttrAtLoc;
MachVtbl.GetMemoryMap = PcMemGetMemoryMap;
+ MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors;
}
/* EOF */
freeldr/freeldr/arch/i386
diff -u -r1.1 -r1.2
--- machpc.h 8 Nov 2004 22:02:47 -0000 1.1
+++ machpc.h 9 Nov 2004 23:36:19 -0000 1.2
@@ -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
*
@@ -34,6 +34,8 @@
U32 PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
+BOOL PcDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer);
+
#endif /* __I386_MACHPC_H_ */
/* EOF */
freeldr/freeldr/arch/i386
diff -u -r1.1 -r1.2
--- machxbox.c 8 Nov 2004 22:02:47 -0000 1.1
+++ machxbox.c 9 Nov 2004 23:36:19 -0000 1.2
@@ -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
*
@@ -34,4 +34,5 @@
MachVtbl.PutChar = XboxVideoPutChar;
MachVtbl.PutCharAttrAtLoc = XboxVideoPutCharAttrAtLoc;
MachVtbl.GetMemoryMap = XboxMemGetMemoryMap;
+ MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors;
}
freeldr/freeldr/arch/i386
diff -u -r1.1 -r1.2
--- machxbox.h 8 Nov 2004 22:02:47 -0000 1.1
+++ machxbox.h 9 Nov 2004 23:36:19 -0000 1.2
@@ -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
*
@@ -37,6 +37,8 @@
PVOID XboxMemReserveMemory(U32 MbToReserve);
U32 XboxMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
+BOOL XboxDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer);
+
#endif /* __I386_HWXBOX_H_ */
/* EOF */
freeldr/freeldr/arch/i386
diff -u -r1.1 -r1.2
--- xboxmem.c 8 Nov 2004 22:02:47 -0000 1.1
+++ xboxmem.c 9 Nov 2004 23:36:19 -0000 1.2
@@ -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
*
@@ -108,18 +108,6 @@
return EntryCount;
}
-unsigned
-XboxMemGetInstalledMemoryMb(VOID)
-{
- if (0 == InstalledMemoryMb)
- {
- /* Hmm, seems we're not initialized yet */
- XboxMemInit();
- }
-
- return InstalledMemoryMb;
-}
-
PVOID
XboxMemReserveMemory(U32 MbToReserve)
{
freeldr/freeldr/cache
diff -u -r1.8 -r1.9
--- blocklist.c 19 Jan 2003 01:03:58 -0000 1.8
+++ blocklist.c 9 Nov 2004 23:36:19 -0000 1.9
@@ -25,6 +25,7 @@
#include <rtl.h>
#include <debug.h>
#include <arch.h>
+#include <machine.h>
// Returns a pointer to a CACHE_BLOCK structure
// Adds the block to the cache manager block list
@@ -122,7 +123,7 @@
}
// 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);
freeldr/freeldr/disk
diff -u -r1.11 -r1.12
--- partition.c 17 May 2004 20:20:17 -0000 1.11
+++ partition.c 9 Nov 2004 23:36:20 -0000 1.12
@@ -23,6 +23,7 @@
#include <mm.h>
#include <debug.h>
#include <arch.h>
+#include <machine.h>
BOOL DiskGetActivePartitionEntry(U32 DriveNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry)
@@ -201,7 +202,7 @@
#endif
// Read master boot record
- if (!DiskReadLogicalSectors(DriveNumber, LogicalSectorNumber, 1, (PVOID)DISKREADBUFFER))
+ if (!MachDiskReadLogicalSectors(DriveNumber, LogicalSectorNumber, 1, (PVOID)DISKREADBUFFER))
{
return FALSE;
}
freeldr/freeldr/fs
diff -u -r1.7 -r1.8
--- ext2.c 25 Apr 2003 19:32:50 -0000 1.7
+++ ext2.c 9 Nov 2004 23:36:20 -0000 1.8
@@ -27,6 +27,7 @@
#include <mm.h>
#include <debug.h>
#include <cache.h>
+#include <machine.h>
GEOMETRY Ext2DiskGeometry; // Ext2 file system disk geometry
@@ -563,7 +564,7 @@
//{
// 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);
//return ReturnValue;
@@ -601,7 +602,7 @@
// Now try to read the super block
// If this fails then abort
- if (!DiskReadLogicalSectors(Ext2DriveNumber, Ext2VolumeStartSector, 8, (PVOID)DISKREADBUFFER))
+ if (!MachDiskReadLogicalSectors(Ext2DriveNumber, Ext2VolumeStartSector, 8, (PVOID)DISKREADBUFFER))
{
return FALSE;
}
freeldr/freeldr/fs
diff -u -r1.17 -r1.18
--- fat.c 19 Jan 2003 01:03:59 -0000 1.17
+++ fat.c 9 Nov 2004 23:36:20 -0000 1.18
@@ -27,6 +27,7 @@
#include <mm.h>
#include <debug.h>
#include <cache.h>
+#include <machine.h>
PFAT_BOOTSECTOR FatVolumeBootSector = NULL;
@@ -76,7 +77,7 @@
// Now try to read the boot sector
// If this fails then abort
- if (!DiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, (PVOID)DISKREADBUFFER))
+ if (!MachDiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, (PVOID)DISKREADBUFFER))
{
return FALSE;
}
@@ -1206,7 +1207,7 @@
//{
// 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);
//return ReturnValue;
freeldr/freeldr/fs
diff -u -r1.3 -r1.4
--- fsrec.c 25 May 2004 21:31:27 -0000 1.3
+++ fsrec.c 9 Nov 2004 23:36:20 -0000 1.4
@@ -28,6 +28,7 @@
#include <rtl.h>
#include <arch.h>
#include <debug.h>
+#include <machine.h>
@@ -69,7 +70,7 @@
{
PUCHAR Sector = (PUCHAR)DISKREADBUFFER;
- if (!DiskReadLogicalSectors(DriveNumber, 16, 1, Sector))
+ if (!MachDiskReadLogicalSectors(DriveNumber, 16, 1, Sector))
{
FileSystemError("Failed to read the PVD.");
return FALSE;
@@ -87,7 +88,7 @@
{
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.");
return FALSE;
@@ -105,7 +106,7 @@
{
PFAT_BOOTSECTOR BootSector = (PFAT_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.");
return FALSE;
@@ -124,7 +125,7 @@
BOOL FsRecIsNtfs(U32 DriveNumber, U32 VolumeStartSector)
{
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.");
return FALSE;
freeldr/freeldr/fs
diff -u -r1.11 -r1.12
--- iso.c 21 May 2004 20:06:09 -0000 1.11
+++ iso.c 9 Nov 2004 23:36:20 -0000 1.12
@@ -25,6 +25,7 @@
#include <mm.h>
#include <debug.h>
#include <cache.h>
+#include <machine.h>
#include "iso.h"
@@ -49,7 +50,7 @@
IsoRootSector = 0;
IsoRootLength = 0;
- if (!DiskReadLogicalSectors(DriveNumber, 16, 1, Pvd))
+ if (!MachDiskReadLogicalSectors(DriveNumber, 16, 1, Pvd))
{
FileSystemError("Failed to read the PVD.");
return FALSE;
@@ -160,7 +161,7 @@
//
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);
return NULL;
@@ -372,7 +373,7 @@
//
// 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;
}
@@ -403,7 +404,7 @@
//
// 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;
}
@@ -430,7 +431,7 @@
//
// 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;
}
freeldr/freeldr/fs
diff -u -r1.4 -r1.5
--- ntfs.c 10 Aug 2004 15:09:14 -0000 1.4
+++ ntfs.c 9 Nov 2004 23:36:20 -0000 1.5
@@ -32,6 +32,7 @@
#include <mm.h>
#include <debug.h>
#include <cache.h>
+#include <machine.h>
#include "ntfs.h"
@@ -157,7 +158,7 @@
/* I. Read partial first sector if needed */
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;
ReadLength = min(Length, NtfsBootSector->BytesPerSector - (Offset % NtfsBootSector->BytesPerSector));
RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER + (Offset % NtfsBootSector->BytesPerSector), ReadLength);
@@ -169,7 +170,7 @@
/* II. Read all complete 64-sector blocks. */
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;
RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER, 64 * NtfsBootSector->BytesPerSector);
Buffer += 64 * NtfsBootSector->BytesPerSector;
@@ -181,7 +182,7 @@
if (Length)
{
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;
RtlCopyMemory(Buffer, (PCHAR)DISKREADBUFFER, Length);
}
@@ -611,7 +612,7 @@
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.");
return FALSE;
@@ -651,7 +652,7 @@
NtfsSectorOfClusterZero = VolumeStartSector;
DbgPrint((DPRINT_FILESYSTEM, "Reading MFT index...\n"));
- if (!DiskReadLogicalSectors(DriveNumber,
+ if (!MachDiskReadLogicalSectors(DriveNumber,
NtfsSectorOfClusterZero +
(NtfsBootSector->MftLocation * NtfsBootSector->SectorsPerCluster),
NtfsMftRecordSize / NtfsBootSector->BytesPerSector, (PCHAR)DISKREADBUFFER))
freeldr/freeldr/include
diff -u -r1.9 -r1.10
--- disk.h 25 May 2004 21:31:27 -0000 1.9
+++ disk.h 9 Nov 2004 23:36:20 -0000 1.10
@@ -106,9 +106,6 @@
///////////////////////////////////////////////////////////////////////////////////////
#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 DiskInt13ExtensionsSupported(U32 DriveNumber);
//VOID DiskStopFloppyMotor(VOID);
freeldr/freeldr/include
diff -u -r1.1 -r1.2
--- machine.h 8 Nov 2004 22:02:48 -0000 1.1
+++ machine.h 9 Nov 2004 23:36:20 -0000 1.2
@@ -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
*
@@ -31,6 +31,8 @@
VOID (*PutCharAttrAtLoc)(int Ch, U8 Attr, unsigned X, unsigned Y);
U32 (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize);
+
+ BOOL (*DiskReadLogicalSectors)(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer);
} MACHVTBL, *PMACHVTBL;
VOID MachInit(VOID);
@@ -41,6 +43,7 @@
#define MachPutChar(Ch) MachVtbl.PutChar(Ch)
#define MachPutCharAttrAtLoc(Ch, Attr, X, Y) MachVtbl.PutCharAttrAtLoc((Ch), (Attr), (X), (Y))
#define MachGetMemoryMap(MMap, Size) MachVtbl.GetMemoryMap((MMap), (Size))
+#define MachDiskReadLogicalSectors(Drive, Start, Count, Buf) MachVtbl.DiskReadLogicalSectors((Drive), (Start), (Count), (Buf))
#endif /* __MACHINE_H_ */
freeldr/freeldr/include
diff -u -r1.9 -r1.10
--- rtl.h 8 Nov 2004 22:02:48 -0000 1.9
+++ rtl.h 9 Nov 2004 23:36:20 -0000 1.10
@@ -93,6 +93,9 @@
#define min(a, b) (((a) < (b)) ? (a) : (b))
#endif
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+#define UINT64_C(val) val##ULL
+
///////////////////////////////////////////////////////////////////////////////////////
//
// Screen Output Functions
CVSspam 0.2.8