X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FStorage%2FLVM%2Fmbr.c;h=78d3d24d2258bda65e5554509ae5852197fe3dc0;hb=HEAD;hp=67fdbce03d592f5410c9bddbc195587cebb8a1c1;hpb=e4342ad9de52043cb8f820643794dc44076f9bd9;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Storage/LVM/mbr.c b/KernelLand/Modules/Storage/LVM/mbr.c index 67fdbce0..78d3d24d 100644 --- a/KernelLand/Modules/Storage/LVM/mbr.c +++ b/KernelLand/Modules/Storage/LVM/mbr.c @@ -11,6 +11,7 @@ #include "mbr.h" // === PROTOTYPES === + int LVM_MBR_Detect(tLVM_Vol *Volume); int LVM_MBR_CountSubvolumes(tLVM_Vol *Volume, void *FirstSector); void LVM_MBR_PopulateSubvolumes(tLVM_Vol *Volume, void *FirstSector); Uint64 LVM_MBR_int_ReadExt(tLVM_Vol *Volume, Uint64 Addr, Uint64 *Base, Uint64 *Length); @@ -23,13 +24,25 @@ tLVM_Format gLVM_MBRType = { }; // === CODE === +int LVM_MBR_Detect(tLVM_Vol *Volume) +{ + tMBR mbr; + // TODO: handle non-512 byte sectors + if( LVM_int_ReadVolume( Volume, 0, 1, &mbr ) != 0 ) + return -1; // Stop on Errors + + if( mbr.BootFlag != LittleEndian16(0xAA55) ) + return 0; + + return 1; +} + /** * \brief Initialise a volume as */ int LVM_MBR_CountSubvolumes(tLVM_Vol *Volume, void *FirstSector) { tMBR *MBR = FirstSector; - int i; Uint64 extendedLBA; Uint64 base, len; int numPartitions = 0; @@ -39,7 +52,7 @@ int LVM_MBR_CountSubvolumes(tLVM_Vol *Volume, void *FirstSector) // Count Partitions numPartitions = 0; extendedLBA = 0; - for( i = 0; i < 4; i ++ ) + for( int i = 0; i < 4; i ++ ) { if( MBR->Parts[i].SystemID == 0 ) continue; @@ -73,6 +86,14 @@ int LVM_MBR_CountSubvolumes(tLVM_Vol *Volume, void *FirstSector) numPartitions ++; } } + // Detect the GPT protector + if( extendedLBA == 0 && numPartitions == 1 && MBR->Parts[0].SystemID == 0xEE ) + { + // TODO: Hand off to GPT parsing code + Log_Warning("LBA MBR", "TODO: Hand off to GPT"); + } + + // Handle extended partions while(extendedLBA != 0) { extendedLBA = LVM_MBR_int_ReadExt(Volume, extendedLBA, &base, &len);