From 2fada79f2ef6ac2b3bb3ddffee3c913f00a4510d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Wed, 10 Nov 2004 23:45:37 +0000 Subject: [PATCH] Add partition handling for the Xbox svn path=/trunk/; revision=11613 --- freeldr/freeldr/arch/i386/machpc.c | 3 +- freeldr/freeldr/arch/i386/machpc.h | 3 +- freeldr/freeldr/arch/i386/machxbox.c | 4 ++- freeldr/freeldr/arch/i386/machxbox.h | 3 +- freeldr/freeldr/arch/i386/pccons.c | 4 +-- freeldr/freeldr/arch/i386/pcdisk.c | 9 +++++ freeldr/freeldr/arch/i386/pcmem.c | 4 +-- freeldr/freeldr/arch/i386/xboxdisk.c | 48 ++++++++++++++++++++++++++- freeldr/freeldr/arch/i386/xboxfont.c | 3 +- freeldr/freeldr/arch/i386/xboxmem.c | 3 +- freeldr/freeldr/arch/i386/xboxvideo.c | 3 +- freeldr/freeldr/fs/fs.c | 3 +- freeldr/freeldr/include/machine.h | 8 ++++- freeldr/freeldr/machine.c | 9 ++++- 14 files changed, 92 insertions(+), 15 deletions(-) diff --git a/freeldr/freeldr/arch/i386/machpc.c b/freeldr/freeldr/arch/i386/machpc.c index 3c4b8198546..06caa6ecb53 100644 --- a/freeldr/freeldr/arch/i386/machpc.c +++ b/freeldr/freeldr/arch/i386/machpc.c @@ -1,4 +1,4 @@ -/* $Id: machpc.c,v 1.2 2004/11/09 23:36:19 gvg Exp $ +/* $Id: machpc.c,v 1.3 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -35,6 +35,7 @@ PcMachInit(VOID) MachVtbl.PutCharAttrAtLoc = PcConsPutCharAttrAtLoc; MachVtbl.GetMemoryMap = PcMemGetMemoryMap; MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors; + MachVtbl.DiskGetPartitionEntry = PcDiskGetPartitionEntry; } /* EOF */ diff --git a/freeldr/freeldr/arch/i386/machpc.h b/freeldr/freeldr/arch/i386/machpc.h index 0917ab29048..9387ec5dc9b 100644 --- a/freeldr/freeldr/arch/i386/machpc.h +++ b/freeldr/freeldr/arch/i386/machpc.h @@ -1,4 +1,4 @@ -/* $Id: machpc.h,v 1.2 2004/11/09 23:36:19 gvg Exp $ +/* $Id: machpc.h,v 1.3 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -35,6 +35,7 @@ VOID PcConsPutCharAttrAtLoc(int Ch, U8 Attr, unsigned X, unsigned Y); U32 PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize); BOOL PcDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer); +BOOL PcDiskGetPartitionEntry(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry); #endif /* __I386_MACHPC_H_ */ diff --git a/freeldr/freeldr/arch/i386/machxbox.c b/freeldr/freeldr/arch/i386/machxbox.c index bbd585fccb1..aff720a6e02 100644 --- a/freeldr/freeldr/arch/i386/machxbox.c +++ b/freeldr/freeldr/arch/i386/machxbox.c @@ -1,4 +1,4 @@ -/* $Id: machxbox.c,v 1.2 2004/11/09 23:36:19 gvg Exp $ +/* $Id: machxbox.c,v 1.3 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -35,4 +35,6 @@ XboxMachInit(VOID) MachVtbl.PutCharAttrAtLoc = XboxVideoPutCharAttrAtLoc; MachVtbl.GetMemoryMap = XboxMemGetMemoryMap; MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors; + MachVtbl.DiskGetPartitionEntry = XboxDiskGetPartitionEntry; + } diff --git a/freeldr/freeldr/arch/i386/machxbox.h b/freeldr/freeldr/arch/i386/machxbox.h index 40552159d56..69bd21b6e00 100644 --- a/freeldr/freeldr/arch/i386/machxbox.h +++ b/freeldr/freeldr/arch/i386/machxbox.h @@ -1,4 +1,4 @@ -/* $Id: machxbox.h,v 1.2 2004/11/09 23:36:19 gvg Exp $ +/* $Id: machxbox.h,v 1.3 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -38,6 +38,7 @@ PVOID XboxMemReserveMemory(U32 MbToReserve); U32 XboxMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize); BOOL XboxDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer); +BOOL XboxDiskGetPartitionEntry(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry); #endif /* __I386_HWXBOX_H_ */ diff --git a/freeldr/freeldr/arch/i386/pccons.c b/freeldr/freeldr/arch/i386/pccons.c index a362dcb1902..201ef29bd61 100644 --- a/freeldr/freeldr/arch/i386/pccons.c +++ b/freeldr/freeldr/arch/i386/pccons.c @@ -1,4 +1,4 @@ -/* $Id: pccons.c,v 1.1 2004/11/08 22:02:47 gvg Exp $ +/* $Id: pccons.c,v 1.2 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -18,7 +18,7 @@ */ #include "freeldr.h" -#include "mm.h" +#include "machine.h" #include "arch.h" #include "debug.h" #include "machpc.h" diff --git a/freeldr/freeldr/arch/i386/pcdisk.c b/freeldr/freeldr/arch/i386/pcdisk.c index 21c86ff628e..ec67180ef2e 100644 --- a/freeldr/freeldr/arch/i386/pcdisk.c +++ b/freeldr/freeldr/arch/i386/pcdisk.c @@ -363,3 +363,12 @@ BOOL PcDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount return TRUE; } + +BOOL +PcDiskGetPartitionEntry(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry) +{ + /* Just use the standard routine */ + return DiskGetPartitionEntry(DriveNumber, PartitionNumber, PartitionTableEntry); +} + +/* EOF */ diff --git a/freeldr/freeldr/arch/i386/pcmem.c b/freeldr/freeldr/arch/i386/pcmem.c index b18e336e64c..509d251a155 100644 --- a/freeldr/freeldr/arch/i386/pcmem.c +++ b/freeldr/freeldr/arch/i386/pcmem.c @@ -1,4 +1,4 @@ -/* $Id: pcmem.c,v 1.1 2004/11/08 22:02:47 gvg Exp $ +/* $Id: pcmem.c,v 1.2 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -23,7 +23,7 @@ #include "freeldr.h" #include "arch.h" #include "debug.h" -#include "mm.h" +#include "machine.h" #include "machpc.h" #include "portio.h" #include "rtl.h" diff --git a/freeldr/freeldr/arch/i386/xboxdisk.c b/freeldr/freeldr/arch/i386/xboxdisk.c index 8a290bd0851..0d8bf3fd0c6 100644 --- a/freeldr/freeldr/arch/i386/xboxdisk.c +++ b/freeldr/freeldr/arch/i386/xboxdisk.c @@ -1,4 +1,4 @@ -/* $Id: xboxdisk.c,v 1.1 2004/11/09 23:36:19 gvg Exp $ +/* $Id: xboxdisk.c,v 1.2 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -17,12 +17,15 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Note: mostly ripped from atapi.c + * Some of this code was based on knowledge and/or code developed + * by the Xbox Linux group: http://www.xbox-linux.org * */ #include "freeldr.h" #include "debug.h" #include "hardware.h" +#include "machine.h" #include "machxbox.h" #include "portio.h" #include "rtl.h" @@ -30,6 +33,24 @@ #define XBOX_IDE_COMMAND_PORT 0x1f0 #define XBOX_IDE_CONTROL_PORT 0x170 +#define XBOX_SIGNATURE_SECTOR 3 +#define XBOX_SIGNATURE ('B' | ('R' << 8) | ('F' << 16) | ('R' << 24)) + +static struct +{ + U32 SectorCountBeforePartition; + U32 PartitionSectorCount; + U8 SystemIndicator; +} XboxPartitions[] = +{ + /* This is in the \Device\Harddisk0\Partition.. order used by the Xbox kernel */ + { 0x0055F400, 0x0098f800, PARTITION_FAT32 }, /* Store, E: */ + { 0x00465400, 0x000FA000, PARTITION_FAT_16 }, /* System, C: */ + { 0x00000400, 0x00177000, PARTITION_FAT_16 }, /* Cache1, X: */ + { 0x00177400, 0x00177000, PARTITION_FAT_16 }, /* Cache2, Y: */ + { 0x002EE400, 0x00177000, PARTITION_FAT_16 } /* Cache3, Z: */ +}; + #define IDE_SECTOR_BUF_SZ 512 #define IDE_MAX_POLL_RETRIES 100000 #define IDE_MAX_BUSY_RETRIES 50000 @@ -395,4 +416,29 @@ XboxDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, P return TRUE; } +BOOL +XboxDiskGetPartitionEntry(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry) +{ + U8 SectorData[IDE_SECTOR_BUF_SZ]; + + /* This is the Xbox, chances are that there is a Xbox-standard partitionless + * disk in it so let's check that first */ + + if (1 <= PartitionNumber && PartitionNumber <= sizeof(XboxPartitions) / sizeof(XboxPartitions[0]) && + MachDiskReadLogicalSectors(DriveNumber, XBOX_SIGNATURE_SECTOR, 1, SectorData)) + { + if (*((PU32) SectorData) == XBOX_SIGNATURE) + { + memset(PartitionTableEntry, 0, sizeof(PARTITION_TABLE_ENTRY)); + PartitionTableEntry->SystemIndicator = XboxPartitions[PartitionNumber - 1].SystemIndicator; + PartitionTableEntry->SectorCountBeforePartition = XboxPartitions[PartitionNumber - 1].SectorCountBeforePartition; + PartitionTableEntry->PartitionSectorCount = XboxPartitions[PartitionNumber - 1].PartitionSectorCount; + return TRUE; + } + } + + /* No magic Xbox partitions. Maybe there's a MBR */ + return DiskGetPartitionEntry(DriveNumber, PartitionNumber, PartitionTableEntry); +} + /* EOF */ diff --git a/freeldr/freeldr/arch/i386/xboxfont.c b/freeldr/freeldr/arch/i386/xboxfont.c index fe98e738b7b..f6a691804ed 100644 --- a/freeldr/freeldr/arch/i386/xboxfont.c +++ b/freeldr/freeldr/arch/i386/xboxfont.c @@ -1,4 +1,4 @@ -/* $Id: xboxfont.c,v 1.1 2004/11/08 22:02:47 gvg Exp $ +/* $Id: xboxfont.c,v 1.2 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -20,6 +20,7 @@ */ #include "freeldr.h" +#include "machine.h" #include "machxbox.h" U8 XboxFont8x16[256 * 16] = diff --git a/freeldr/freeldr/arch/i386/xboxmem.c b/freeldr/freeldr/arch/i386/xboxmem.c index a2624b44c0b..c8c2ad17bb2 100644 --- a/freeldr/freeldr/arch/i386/xboxmem.c +++ b/freeldr/freeldr/arch/i386/xboxmem.c @@ -1,4 +1,4 @@ -/* $Id: xboxmem.c,v 1.2 2004/11/09 23:36:19 gvg Exp $ +/* $Id: xboxmem.c,v 1.3 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -25,6 +25,7 @@ #include "mm.h" #include "rtl.h" #include "hardware.h" +#include "machine.h" #include "machxbox.h" #include "portio.h" diff --git a/freeldr/freeldr/arch/i386/xboxvideo.c b/freeldr/freeldr/arch/i386/xboxvideo.c index d295d3cc379..542091e599e 100644 --- a/freeldr/freeldr/arch/i386/xboxvideo.c +++ b/freeldr/freeldr/arch/i386/xboxvideo.c @@ -1,4 +1,4 @@ -/* $Id: xboxvideo.c,v 1.1 2004/11/08 22:02:47 gvg Exp $ +/* $Id: xboxvideo.c,v 1.2 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -23,6 +23,7 @@ #include "freeldr.h" #include "debug.h" #include "rtl.h" +#include "machine.h" #include "machxbox.h" static PVOID FrameBuffer; diff --git a/freeldr/freeldr/fs/fs.c b/freeldr/freeldr/fs/fs.c index 4b455422904..1e900f6a3d5 100644 --- a/freeldr/freeldr/fs/fs.c +++ b/freeldr/freeldr/fs/fs.c @@ -29,6 +29,7 @@ #include #include #include +#include ///////////////////////////////////////////////////////////////////////////////////////////// @@ -106,7 +107,7 @@ BOOL FsOpenVolume(U32 DriveNumber, U32 PartitionNumber) else { // Get requested partition - if (DiskGetPartitionEntry(DriveNumber, PartitionNumber, &PartitionTableEntry) == FALSE) + if (MachDiskGetPartitionEntry(DriveNumber, PartitionNumber, &PartitionTableEntry) == FALSE) { FileSystemError("Partition not found."); return FALSE; diff --git a/freeldr/freeldr/include/machine.h b/freeldr/freeldr/include/machine.h index cbf7c84c064..2ec30e6f93e 100644 --- a/freeldr/freeldr/include/machine.h +++ b/freeldr/freeldr/include/machine.h @@ -1,4 +1,4 @@ -/* $Id: machine.h,v 1.2 2004/11/09 23:36:20 gvg Exp $ +/* $Id: machine.h,v 1.3 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -20,6 +20,10 @@ #ifndef __MACHINE_H_ #define __MACHINE_H_ +#ifndef __DISK_H +#include "disk.h" +#endif + #ifndef __MEMORY_H #include "mm.h" #endif @@ -33,6 +37,7 @@ typedef struct tagMACHVTBL U32 (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize); BOOL (*DiskReadLogicalSectors)(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, PVOID Buffer); + BOOL (*DiskGetPartitionEntry)(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry); } MACHVTBL, *PMACHVTBL; VOID MachInit(VOID); @@ -44,6 +49,7 @@ extern MACHVTBL MachVtbl; #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)) +#define MachDiskGetPartitionEntry(Drive, Part, Entry) MachVtbl.DiskGetPartitionEntry((Drive), (Part), (Entry)) #endif /* __MACHINE_H_ */ diff --git a/freeldr/freeldr/machine.c b/freeldr/freeldr/machine.c index 97a83653ad7..90a69b58bb2 100644 --- a/freeldr/freeldr/machine.c +++ b/freeldr/freeldr/machine.c @@ -1,4 +1,4 @@ -/* $Id: machine.c,v 1.2 2004/11/09 23:36:19 gvg Exp $ +/* $Id: machine.c,v 1.3 2004/11/10 23:45:37 gvg Exp $ * * FreeLoader * @@ -25,6 +25,7 @@ #undef MachPutCharAttrAtLoc #undef MachGetMemoryMap #undef MachDiskReadLogicalSectors +#undef MachDiskGetPartitionEntry MACHVTBL MachVtbl; @@ -58,4 +59,10 @@ MachDiskReadLogicalSectors(U32 DriveNumber, U64 SectorNumber, U32 SectorCount, P return MachVtbl.DiskReadLogicalSectors(DriveNumber, SectorNumber, SectorCount, Buffer); } +BOOL +MachDiskGetPartitionEntry(U32 DriveNumber, U32 PartitionNumber, PPARTITION_TABLE_ENTRY PartitionTableEntry) +{ + return MachVtbl.DiskGetPartitionEntry(DriveNumber, PartitionNumber, PartitionTableEntry); +} + /* EOF */