<> <> <> <> DIRECTORY DiskFace USING[ Label, Type ], BasicLoadStateFormat USING[ LoadStateObject ], LoadState USING[ Handle ], PrincOps USING [op, PageNumber, PageValue, wordsPerPage], Rope USING[ ROPE ], WorldVM USING [Address, Incarnation, World]; WVMPrivate: DEFINITIONS = BEGIN OPEN Rope; <> pageSize: CARDINAL = PrincOps.wordsPerPage; PageNumber: TYPE = PrincOps.PageNumber; PageAddress: PROC[mempage: PageNumber] RETURNS[ WorldVM.Address ] = INLINE { RETURN[ mempage * LONG[pageSize] ]; }; DiskAddress: TYPE = RECORD[ deviceType: DiskFace.Type, deviceOrdinal: CARDINAL, diskPage: LONG CARDINAL, -- device-relative page number of start of run offset: CARDINAL, -- page number from start of run, for label checksum calculation labelCheck: CARDINAL -- label checksum of start of run (Pilot relic: should use entire label) ]; onlyMDS: WorldVM.Address = --TEMP kludge-- 400000B; WorldType: TYPE = { none, local, other, remote }; World: TYPE = REF WorldObject; WorldObject: PUBLIC TYPE = RECORD[ name: ROPE, incarnation: WorldVM.Incarnation _ FIRST[WorldVM.Incarnation], lock: NAT _ 0, state: { creating, created, bad } _ creating, running: BOOLEAN _ TRUE, vmBackingMap: WVMPrivate.VMBackingMap _ NIL, basicLoadState: REF BasicLoadStateFormat.LoadStateObject _ NIL, loadState: LoadState.Handle _ NIL, loadStateValid: BOOL _ FALSE, mdsBase: WorldVM.Address _ onlyMDS, foo: SELECT type: WorldType FROM none => NULL, local => NULL, other => NULL, remote => [host: WVMPrivate.Machine] ENDCASE]; <> VMBackingMap: TYPE = REF VMBackingMapObject; VMBackingMapObject: TYPE; CreateVMBackingMap: PROC[world: WorldVM.World] RETURNS[ VMBackingMap ]; <> ReadVMBackingMap: PROC[world: WorldVM.World, log: VMBackingMap] RETURNS[basic, real: WorldVM.Address -- loadtstae addresses --]; GetVMBackingMapEntry: PROC[log: VMBackingMap, mempage: PageNumber] RETURNS[ DiskAddress ]; <> PageHandle: TYPE = REF PageInfo; PageInfo: TYPE; PageData: TYPE = ARRAY [0..pageSize) OF CARDINAL; GetPage: PROC[world: WorldVM.World, mempage: PageNumber] RETURNS[ data: REF PageData, handle: PageHandle ]; <> ReleasePage: PROC[handle: PageHandle]; WriteAndReleasePage: PROC[handle: PageHandle]; <> MapEntry: TYPE = PrincOps.PageValue; Machine: TYPE[3]; LocateRemote: PROC[ROPE] RETURNS[ Machine ]; GoRemote: PROC[host: Machine]; ReadRemoteCore: PROC [host: Machine, data: REF PageData, mempage: PageNumber] RETURNS [map: MapEntry, ok: BOOLEAN]; WriteRemoteCore: PROC [host: Machine, data: REF PageData, mempage: PageNumber, map: MapEntry] RETURNS [BOOL]; ReadRemoteDisk: PROC[host: Machine, data: REF PageData, addr: DiskAddress, label: LONG POINTER TO DiskFace.Label]; WriteRemoteDisk: PROC[host: Machine, data: REF PageData, addr: DiskAddress, label: LONG POINTER TO DiskFace.Label]; <> LocateOther: PROC; -- outload, boot physical volume, return after inload -- GoOther: PROC; -- outload, return after inload -- ReadOtherCore: PROC[data: REF PageData, mempage: PageNumber] RETURNS[ok: BOOLEAN]; WriteOtherCore: PROC[data: REF PageData, mempage: PageNumber] RETURNS[BOOL]; ChannelDirection: TYPE = { read, write }; MoveLocalDiskPage: PROC[ data: REF PageData, direction: ChannelDirection, addr: DiskAddress]; <> <<>> GetLoadState: PROC[world: World, basic, real: WorldVM.Address]; <> <<>> Patch: PROC[world: WorldVM.World, addr: WorldVM.Address, offset: [0..1], byte: PrincOps.op] RETURNS[oldByte: PrincOps.op]; END.