-- SwapperOps.Mesa Edited by Sandman on August 27, 1980 10:02 AM
-- Copyright Xerox Corporation 1979, 1980
DIRECTORY
AllocDefs USING [SwappingProcedure, SwapStrategy],
AltoDefs USING [MaxMDSPage, PageCount, PageNumber],
AltoFileDefs USING [vDC],
Region USING [Count, Handle, Index, NodeObject, Object, Page, PageStatus],
SegmentDefs USING [
AccessOptions, AllocInfo, BankIndex, Banks, DataSegmentHandle, FileHandle,
FileSegmentHandle, Frob, MemoryConfig, ObjectHandle, ObjectType,
SegmentHandle];
SwapperOps: DEFINITIONS SHARES SegmentDefs =
BEGIN OPEN AltoDefs, SegmentDefs;
-- Boot Primative Objects
BootDataSegment: PROCEDURE [base: PageNumber, pages: PageCount]
RETURNS [seg: DataSegmentHandle];
BootFileSegment: PROCEDURE [
file: FileHandle, base: PageNumber, pages: PageCount, access: AccessOptions,
addr: POINTER] RETURNS [seg: FileSegmentHandle];
BootFile: PROCEDURE [access: AccessOptions] RETURNS [file: FileHandle];
-- Primative Object Tables
Table: TYPE = RECORD [free: Frob, link: TableHandle, seg: DataSegmentHandle];
TableHandle: TYPE = POINTER TO Table;
PageTable: TYPE = ARRAY [0..MaxMDSPage] OF SegmentHandle;
PageMap: TYPE = POINTER TO PageTable;
RegionTable: TYPE = ARRAY Region.Index OF Region.Handle;
SystemTable: TYPE = RECORD [
mdsMap: PageMap,
table: TableHandle,
memConfig: POINTER TO MemoryConfig,
regions: POINTER TO RegionTable];
systemTable: SystemTable;
regions: RegionTable;
-- MDS Region variables
Page: TYPE = Region.Page;
Count: TYPE = Region.Count;
PageStatus: TYPE = Region.PageStatus;
memConfig: MemoryConfig;
ff, lf, rover: Region.Page;
mdsIndex: Region.Index;
mdsRegion: Region.Object;
map: PageMap;
mdsNodes: Region.NodeObject;
strategyList: POINTER TO AllocDefs.SwapStrategy;
Alloc: PROCEDURE [
base: PageNumber, pages: Count, info: AllocInfo, anyWhere: BOOLEAN]
RETURNS [success: BOOLEAN, page: Page];
Update: PROCEDURE [
base: Page, pages: Count, seg: SegmentHandle, simple: BOOLEAN];
Available: PROCEDURE [page: Page, info: AllocInfo] RETURNS [BOOLEAN];
Status: PROCEDURE [page: Page] RETURNS [seg: SegmentHandle, status: PageStatus];
TrySwapping: AllocDefs.SwappingProcedure;
Disable: PROCEDURE [BOOLEAN];
InvalidNode: ERROR [node: UNSPECIFIED];
-- Configuration Information
InitMemoryConfig: PROCEDURE;
ComputeRealMemory: PROC RETURNS [pages: CARDINAL, banks: Banks];
initMemoryConfig: POINTER TO SegmentDefs.MemoryConfig = LOOPHOLE[3B];
Direction: TYPE = {intoMDS, outofMDS};
MoveCode: PROCEDURE [direction: Direction];
EnableHyperspace, DisableHyperspace: PROCEDURE;
EnableBank, DisableBank: PROCEDURE [bank: BankIndex];
-- Object Management
FreePage: SegmentHandle = LOOPHOLE[0];
BusyPage: SegmentHandle = LOOPHOLE[1];
InvalidObject: SIGNAL [object: POINTER];
AllocateObject: PROCEDURE [CARDINAL] RETURNS [ObjectHandle];
LiberateObject: PROCEDURE [ObjectHandle];
ValidateObject: PROCEDURE [ObjectHandle];
EnumerateObjects: PROCEDURE [
type: ObjectType, proc: PROCEDURE [ObjectHandle] RETURNS [BOOLEAN]]
RETURNS [ObjectHandle];
-- Allocation Primatives
AllocVM: PROCEDURE [
base: PageNumber, pages: PageCount, info: AllocInfo, seg: SegmentHandle]
RETURNS [PageNumber];
UpdateVM: PROCEDURE [base: PageNumber, pages: PageCount, seg: SegmentHandle];
SwapOutUnlocked: PROCEDURE [seg: FileSegmentHandle];
SwapOutCodeSeg: PROCEDURE [seg: FileSegmentHandle];
UpdateCodebases: PROCEDURE [seg: FileSegmentHandle];
-- File Length Operations
NormalizeFileIndex: PROCEDURE [page: PageNumber, byte: CARDINAL]
RETURNS [PageNumber, CARDINAL];
RoundFileIndex: PROCEDURE [page: PageNumber, byte: CARDINAL]
RETURNS [PageNumber, CARDINAL];
TruncateFileIndex: PROCEDURE [page: PageNumber, byte: CARDINAL]
RETURNS [PageNumber, CARDINAL];
-- File Segment Positioning
FindSegHint: PROCEDURE [seg: FileSegmentHandle];
PositionSeg: PROCEDURE [seg: FileSegmentHandle, useseg: BOOLEAN]
RETURNS [BOOLEAN];
MapVM: PROCEDURE [seg: FileSegmentHandle, dc: AltoFileDefs.vDC];
-- Initialization
MemInit, MDSRegion, Swapper: PROGRAM;
InitMemory: PROCEDURE [ffvmp, lfvmp: CARDINAL];
END.