<> <> <> <> <> <<>> <> <<>> DIRECTORY BootFile USING [DiskFileID, nullLink], DiskFace USING [PageCount, PageNumber, wordsPerPage], File USING [FileID, FP, nullFileID, nullFP, PageNumber, VolumeFile, VolumeID], PhysicalVolume USING [LogicalPage, LogicalPageCount, TimeParameters]; VolumeFormat: CEDAR DEFINITIONS = BEGIN <> Attributes: TYPE = MACHINE DEPENDENT { <> physicalRoot(1), -- physical volume root page badPageList(2), -- ? badPage(3), subVolumeMarker(4), -- physical volume marker pages logicalRoot(5), -- logical volume root page <> freePage(9728), -- label of a truly free page in a logical volume header(9729), -- for file run-table and properties data(9730), -- for file data pages lastCedar(9984), (LAST[CARDINAL]) }; AbsID: TYPE = RECORD[File.VolumeID]; <> RelID: TYPE = RECORD[File.FP]; <> <> PRSeal: CARDINAL = 121212B; -- word zero of a valid physical volume root page PRCurrentVersion: CARDINAL = 6; PhysicalRoot: TYPE = MACHINE DEPENDENT RECORD [ seal(0): CARDINAL _ PRSeal, -- must be 1st field version(1): CARDINAL _ PRCurrentVersion, -- must be 2nd field labelLength(2): CARDINAL [0..volumeLabelLength) _ 0, pvID(3): File.VolumeID, bootingInfo(10B): ARRAY PVBootFile OF BootFile.DiskFileID _ ALL[nullDiskFileID], <<"bootingInfo" be at this offset as the microcode knows where to find it.>> label(54B): PACKED ARRAY [0..volumeLabelLength) OF CHARACTER _ nullLabel | NULL, subVolumeCount(100B): [0..maxSubVols), subVolumeMarkerID(101B): AbsID _ NULL, badPageCount(106B): DiskFace.PageCount _ 0, maxBadPages(110B): DiskFace.PageCount _ allocatedBadPages, onLineCount(112B): CARDINAL _ 0, -- TEMPORARILY unused. subVolumes(113B): ARRAY [0..maxSubVols) OF SubVolumeDesc, fill1(231B): ARRAY [0..374B - 231B) OF WORD _ ALL[0], -- fill to whole page timeParametersValid(374B): BOOL _ FALSE, timeParameters(375B): TimeParameters _ NULL, checksum(377B): CARDINAL _ 0 -- MUST be the last field of this page ]; PVBootFile: TYPE = File.VolumeFile[checkpoint..bootFile]; maxSubVols: CARDINAL [4..7] = 6; <> SubVolumeDesc: TYPE = MACHINE DEPENDENT RECORD [ lvID(0): File.VolumeID, lvSize(5): LogicalPageCount, lvPage(7): LogicalPage, pvPage(11B): DiskFace.PageNumber, nPages(13B): LogicalPageCount ]; rootPageNumber: DiskFace.PageNumber = [0]; credentialsPageNumber: DiskFace.PageNumber = [2]; volumeLabelLength: CARDINAL = 40; nullLabel: PACKED ARRAY [0..volumeLabelLength) OF CHARACTER = ALL[0C]; TimeParameters: TYPE = PhysicalVolume.TimeParameters; <> LogicalPage: TYPE = PhysicalVolume.LogicalPage; -- Page number relative to a logical volume -- LogicalPageCount: TYPE = PhysicalVolume.LogicalPageCount; nullDiskFileID: BootFile.DiskFileID = [fID: [rel[LOOPHOLE[File.nullFP]]], firstPage: 0, firstLink: BootFile.nullLink]; <> BadPageList: TYPE = ARRAY [0..allocatedBadPages) OF DiskFace.PageNumber; <> allocatedBadPages: CARDINAL = DiskFace.wordsPerPage/SIZE[DiskFace.PageNumber]; <> nullBadPage: DiskFace.PageNumber = rootPageNumber; <> LRSeal: CARDINAL = 131313B; LRCurrentVersion: CARDINAL = 5; LogicalRoot: TYPE = MACHINE DEPENDENT RECORD [ seal (0): CARDINAL _ LRSeal, version (1): CARDINAL _ LRCurrentVersion, vID (2): File.VolumeID, labelLength (7): CARDINAL[0..volumeLabelLength) _ 0, label (10B): PACKED ARRAY [0..volumeLabelLength) OF CHARACTER _ nullLabel, type (34B): VolumeType _ cedar, volumeSize (35B): LogicalPageCount, bootingInfo (37B): ARRAY LVBootFile OF BootFile.DiskFileID _ ALL[nullDiskFileID], <> rootFile (125B): ARRAY File.VolumeFile OF RootFile _ ALL[], fill (265B): ARRAY [265B..374B) OF CARDINAL _ ALL[0], coCedar(374B): BOOL _ FALSE, lastFileID(375B): File.FileID _ File.nullFileID, checksum (377B): CARDINAL _ 0 ]; LVBootFile: TYPE = File.VolumeFile[checkpoint..debuggee]; RootFile: TYPE = MACHINE DEPENDENT RECORD[ fp(0): File.FP _ File.nullFP, page(4): File.PageNumber _ [0] ]; VolumeType: TYPE = MACHINE DEPENDENT { pilot(0), pilotDebugger(1), pilotDebuggerDebugger(2), cedar(3) }; <> <> PSMSeal: CARDINAL = 141414B; -- word zero of a valid subvolume end marker page PSMCurrentVersion: CARDINAL = 0; PhysicalMarker: TYPE = MACHINE DEPENDENT RECORD [ seal(0): CARDINAL _ PSMSeal, -- must be 1st field version(1): CARDINAL _ PSMCurrentVersion, -- must be 2nd field <> pvID(2): File.VolumeID, label(7): PACKED ARRAY [0..volumeLabelLength) OF CHARACTER _ nullLabel, bootingInfo(33B): ARRAY PVBootFile OF BootFile.DiskFileID _ ALL[nullDiskFileID], maxBadPages(77B): DiskFace.PageCount, -- size of bad page table labelLength(101B:0..5): CARDINAL [0..volumeLabelLength) _ 0, <> fill(101B:6..12): [0..128) _ 0, svNumber(101B:13..15): [0..maxSubVols), -- ordinal number of preceding subvolume descriptor(102B): SubVolumeDesc -- copy of descriptor for preceding subvolume ]; <> <> LSMSeal: CARDINAL = 151515B; LSMCurrentVersion: CARDINAL = 0; LogicalSubvolumeMarker: TYPE = MACHINE DEPENDENT RECORD [ seal (0): CARDINAL _ LSMSeal, version (1): CARDINAL _ LSMCurrentVersion, labelLength (2:0..5): CARDINAL [0..volumeLabelLength) _ 0, type (2:6..7): VolumeType _ cedar, coCedar (2:8..8): BOOL _ FALSE, pad (2:9..15): [0..128) _ 0, label (3): PACKED ARRAY [0..volumeLabelLength) OF CHARACTER _ nullLabel, bootingInfo (27B): ARRAY LVBootFile OF BootFile.DiskFileID _ ALL[nullDiskFileID] <<, clientRootFile (115B): File.Capability _ File.nullCapability>> ]; <> <> VAMObject: TYPE = MACHINE DEPENDENT RECORD[ <> rover(0): LogicalPage, size(2): LogicalPageCount, used(vamChunkPos): SEQUENCE COMPUTED CARDINAL OF VAMChunk ]; VAMChunk: TYPE = PACKED ARRAY CARDINAL OF BOOL; vamChunkPos: CARDINAL = 4; <> <> LogicalRunObject: TYPE = MACHINE DEPENDENT RECORD[ headerPages(0): CARDINAL, maxRuns(1): CARDINAL, intention(2): RunTableIntention, runs(5): SEQUENCE COMPUTED CARDINAL OF LogicalRun ]; RunTableIntention: TYPE = MACHINE DEPENDENT RECORD[ unstable(0:0..0): BOOL _ FALSE, spare(0:1..15): [0..77777B) _ 0, size(1): INT _ 0 -- delete if < 0 ]; LogicalRun: TYPE = MACHINE DEPENDENT RECORD[ first(0): LogicalPage, size(2): RunPageCount ]; lastLogicalRun: LogicalPage = [LAST[INT]]; -- end marker in LogicalRunObject -- RunPageCount: TYPE = CARDINAL; -- not INT, to maximise packing of run-tables on disk END.