DIRECTORY BootFile USING [Location], PrincOps USING [ControlModule, PageCount, PageNumber, Priority], SystemVersion USING [Date, MachineType, ReleaseNumber]; BootStartList: DEFINITIONS = BEGIN versionID: CARDINAL = 06203; Limit: CARDINAL = 37777B; Base: TYPE = LONG BASE POINTER TO Header; Index: TYPE = Base RELATIVE POINTER [0..Limit] TO Entry; nullIndex: Index = Index.FIRST; startIndex: Index = LOOPHOLE[SIZE[Header]]; SpaceIndex: TYPE = Base RELATIVE POINTER [0..Limit] TO space Entry; nullSpaceIndex: SpaceIndex = LOOPHOLE[nullIndex]; SwapUnitIndex: TYPE = Base RELATIVE POINTER [0..Limit] TO swapUnit Entry; nullSwapUnitIndex: SwapUnitIndex = LOOPHOLE[nullIndex]; Switches: TYPE = RECORD [a, b, c, d: CARDINAL]; StateVectorCounts: TYPE = ARRAY PrincOps.Priority OF CARDINAL; Header: TYPE = MACHINE DEPENDENT RECORD [ version(0): CARDINAL, release(1): SystemVersion.ReleaseNumber, buildDate(4): SystemVersion.Date, requiredUCode(6): ARRAY SystemVersion.MachineType OF SystemVersion.Date, controlList(14): PrincOps.ControlModule, initLoadState(15): SwapUnitIndex, mdsBase(16): PrincOps.PageNumber, pdaPages(18): PrincOps.PageCount, stateVectorCounts(20): StateVectorCounts, stateVectorSize(28): CARDINAL, nProcesses(29): CARDINAL, lastVMPage(30): PrincOps.PageNumber, lastBootLoadedPage(32): PrincOps.PageNumber, switches(34): Switches, locDebuggerMicrocode(38): BootFile.Location, locDebuggerGerm(49): BootFile.Location, locDebugger(60): BootFile.Location, locDebuggee(71): BootFile.Location ]; EntryType: TYPE = {space, swapUnit, stop}; SpaceClass: TYPE = {empty, unitary, family}; SwapUnitState: TYPE = {resident, residentDescriptor, swappable}; SwapUnitInfo: TYPE = MACHINE DEPENDENT RECORD [ readOnly(0:0..0): BOOL, state(0:1..2): SwapUnitState]; SpaceType: TYPE = MACHINE DEPENDENT RECORD [ body(0): SELECT class(0:0..1): SpaceClass FROM empty => [fill(0:2..17B): Index _ nullIndex], -- an unused Space unitary => -- a Space with no swap units. [swapUnit(0:2..17B): SwapUnitIndex], -- (only swapUnit.info is significant.) family => [ -- a Space tiled with swap units. anyResidentChildren(0:2..2): BOOL, anyResidentDescriptorChildren(0:3..3): BOOL, anySwappableChildren(0:4..4): BOOL, allResidentChildren(0:5..5): BOOL, allResidentDescriptorChildren(0:6..6): BOOL, allSwappableChildren(0:7..17B): BOOL ], ENDCASE]; BackingLocation: TYPE = {null, self}; EntryPointer: TYPE = LONG POINTER TO Entry; SpaceEntryPointer: TYPE = LONG POINTER TO space Entry; SwapUnitEntryPointer: TYPE = LONG POINTER TO swapUnit Entry; Entry: TYPE = MACHINE DEPENDENT RECORD [ body(0): SELECT option(0:0..1): EntryType FROM space => [ readOnly(0:2..2): BOOL, bootLoaded(0:3..16B): BOOL, backingStore(0:17B..17B): BackingLocation, type(1): SpaceType, pages(2): PrincOps.PageCount, vmPage(4): PrincOps.PageNumber, backingPage(6): --File.PageNumber-- LONG CARDINAL ], swapUnit => [ info(0:2..17B): SwapUnitInfo, parent(1): SpaceIndex, base(2): PrincOps.PageCount, -- relative to parent.vmPage pages(4): PrincOps.PageCount ], stop => [fill(0:2..17B): Index _ nullIndex], -- terminates the Start List. ENDCASE]; Proc: TYPE = PROC [index: Index] RETURNS [stop: BOOL _ FALSE]; h: Base; Initialize: PROC [LONG POINTER TO Header]; Enumerate: PROC [proc: Proc]; StartListHasBeenDestroyed: ERROR; Destroy: PROC RETURNS [page: PrincOps.PageNumber, count: PrincOps.PageCount]; IndexToEntryPointer: PROC [index: Index] RETURNS [EntryPointer] = INLINE {RETURN[@h[index]]}; IndexToSpaceEntryPointer: PROC [index: SpaceIndex] RETURNS [SpaceEntryPointer] = INLINE {RETURN[@h[index]]}; IndexToSwapUnitEntryPointer: PROC [index: SwapUnitIndex] RETURNS [SwapUnitEntryPointer] = INLINE {RETURN[@h[index]]}; END. ψBootStartList.mesa last edited by Levin on June 20, 1983 2:14 pm Last Edited by: Birrell, March 30, 1983 4:51 pm This interface defines the format of the start list, which is constructed by MakeBoot and interpreted by initialization code. It also defines some procedures to be used during initialization to access the actual start list instance. The start list has the following properties: 1) It consists of a Header (h) and a sequence of Entries. 2) The sequence of entries contains an arbitrary mixture of "space" and "swapUnit" variants and is terminated by a "stop" variant. 3) No guarantee is made about the order of virtual memory intervals spanned by the space Entries or of the subintervals spanned by the swapUnit Entries. 4) No guarantee is made about the order of swapUnit Entries relative to their parent space Entry. 5) The set of space Entries completely tiles the virtual memory range [PageNumber.FIRST..h.lastVMPage]. 6) The start list contains a swapUnit Entry that describes itself. The following four fields are for early linkage to a world-swap debugger before the file system is able to find one. Procedures "proc" will be called for all entries except the "stop" entry. This signal is raised by Enumerate if Destroy has been called. ΚR– "Cedar" style˜Jšœ™Jšœ-™-J™/J˜šΟk ˜ Jšœ œ ˜Jšœ œ2˜@Jšœœ$˜7—J˜Jšœ œ˜J˜Jš˜J˜Jšœι™ιJ˜šœ,™,Jšœ:™:J™ƒJ™™J™bJ™hJ™C—J™Jšœ œ ˜J˜Jšœœ ˜Jš œœœœœœ˜)Jš œœœœ œ˜8Jšœœ˜Jšœœœ ˜+Jš œ œœœ œ ˜CJšœœ ˜1Jš œœœœ œ˜IJšœ#œ ˜7J˜Jšœ œœœ˜/J˜Jš œœœœœ˜>J˜J˜š œœœ œœ˜)Jšœ œ˜J˜(J˜!Jšœœœ˜HJšœ(˜(Jšœ!˜!Jšœ!˜!Jšœ!˜!Jšœ)˜)Jšœœ˜Jšœœ˜Jšœ$˜$Jšœ,˜,Jšœ˜Jšœt™tJšœ,˜,Jšœ'˜'Jšœ#˜#Jšœ"˜"Jšœ˜—J˜Jšœ œ˜*Jšœ œ˜,Jšœœ-˜@J˜š œœœ œœ˜/Jšœœ˜Jšœ˜J˜—š œ œœ œœ˜,šœ œ˜.Jšœ/Οc˜Ašœ ž˜*Jšœ&ž'˜M—šœ ž!˜.Jšœœ˜"Jšœ'œ˜,Jšœœ˜#Jšœœ˜"Jšœ'œ˜,Jšœ ˜$Jšœ˜—Jšœ˜ ——J˜šœœ˜%J˜—Jš œœœœœ˜+Jš œœœœœ ˜6Jš œœœœœ˜J˜Jšœ˜J˜Jš Οn œœœœœ ˜*J˜šŸ œœ˜Jšœ>™>—˜šœœ˜!Jšœ>™>——J˜šŸœœœ8˜MJ˜—šŸœœœ˜HJšœœ ˜—J˜šŸœœœ˜WJšœœ ˜—J˜šŸœœœ˜`Jšœœ ˜—J˜Jšœ˜J˜J˜J˜—…—„Ξ