-- Cedar Remote Debugging: Internal WorldVM Interface
-- WVMPrivate.mesa
-- Andrew Birrell July 26, 1983 3:55 pm
DIRECTORY
Booting USING [Bootee, Switches],
Device USING[ Type ],
Environment USING [wordsPerPage],
PilotDisk USING [Label],
Rope USING[ ROPE ],
WorldVM USING [Address, World];
WVMPrivate: DEFINITIONS =
BEGIN
pageSize: CARDINAL = Environment.wordsPerPage;
PageNumber: TYPE = INT -- [0..LAST[WorldVM.Address]/pageSize) --;
PageAddress: PROC[mempage: PageNumber] RETURNS[ WorldVM.Address ] = INLINE
{ RETURN[ mempage * LONG[pageSize] ] };
DiskAddress: TYPE = RECORD[
deviceType: Device.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)
];
-- Map log machinery (Includes run-table machinery in Cedar debuggees) --
MapLog: TYPE = REF MapLogObject;
MapLogObject: TYPE;
CreateMapLog: PROC[world: WorldVM.World] RETURNS[ MapLog ];
-- May read only swapped-in (or resident) client pages.
ReadMapLog: PROC[world: WorldVM.World, log: MapLog]
RETURNS[patchTable, loadState: WorldVM.Address];
GetMapLogEntry: PROC[log: MapLog, mempage: PageNumber]
RETURNS[ DiskAddress ];
LocalPatchTable: PROC RETURNS[patchTable: WorldVM.Address];
-- Implemented in WVMMapLog, because it comes from the maplog descriptor.
PatchTable: PROC[world: WorldVM.World] RETURNS[ WorldVM.Address ];
-- returns address of world's patch table.
-- Page cache --
PageHandle: TYPE = REF PageInfo;
PageInfo: TYPE;
PageData: TYPE = ARRAY [0..pageSize) OF CARDINAL;
GetPage: PROC[world: WorldVM.World, mempage: PageNumber, coreOnly: BOOLEAN]
RETURNS[ data: REF PageData, handle: PageHandle ];
-- If "coreOnly" and page is not swapped in, returns [NIL,NIL].
ReleasePage: PROC[handle: PageHandle];
WriteAndReleasePage: PROC[handle: PageHandle];
-- Remote page transfers --
MapEntry: TYPE = MACHINE DEPENDENT RECORD [
flags: RECORD[logSE, W, D, R: BOOLEAN],
page: [0..7777B]];
Machine: TYPE[3];
LocateRemote: PROC[Rope.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];
ReadRemoteDisk: PROC[host: Machine,
data: REF PageData,
addr: DiskAddress,
label: LONG POINTER TO PilotDisk.Label];
WriteRemoteDisk: PROC[host: Machine,
data: REF PageData,
addr: DiskAddress,
label: LONG POINTER TO PilotDisk.Label];
-- World-swap page transfers --
LocateOther: PROC; -- outload, boot physical volume, return after inload --
GoOther: PROC; -- outload, return after inload --
ReallySwapAndBoot: SAFE PROC[boot: Booting.Bootee, switches: Booting.Switches];
ReadOtherCore: PROC[data: REF PageData, mempage: PageNumber]
RETURNS[map: MapEntry, ok: BOOLEAN];
WriteOtherCore: PROC[data: REF PageData, mempage: PageNumber, map: MapEntry];
ChannelDirection: TYPE = { read, write };
MoveLocalDiskPage: PROC[
data: REF PageData,
direction: ChannelDirection,
addr: DiskAddress];
END.