-- File: VMControl.mesa -- Last edited by Levin: 12-Jul-82 14:56:50 DIRECTORY DiskIODefs USING [InitializeDiskIO, FinalizeDiskIO], FrameDefs USING [IsBound], ImageDefs USING [ AddCleanupProcedure, AllReasons, CleanupItem, CleanupProcedure, RemoveCleanupProcedure], LogDefs USING [DisplayNumber], Map USING [Clean, SETF, WriteProtected], SegmentDefs USING [MachineType, memConfig], VMStorage USING [InitializeStorage, FinalizeStorage, longTerm], VMDefs USING [CacheIndex], VMPrivate USING [ FinalizeVMCache, FinalizeVMFile, FinalizeVMIO, FinalizeVMPageMgr, InitializeVMCache, InitializeVMFile, InitializeVMIO, InitializeVMPageMgr, MDSPageNumber]; VMControl: PROGRAM IMPORTS DiskIODefs, FrameDefs, ImageDefs, LogDefs, Map, SegmentDefs, VMPrivate, VMStorage EXPORTS VMDefs, VMPrivate SHARES DiskIODefs, VMStorage = BEGIN OPEN VMPrivate; -- Procedures and Variables Exported to VMDefs -- InitializeVM: PUBLIC PROCEDURE [ min, max: VMDefs.CacheIndex, numOps: CARDINAL _ 20] = BEGIN loggingEnabled _ FrameDefs.IsBound[LogDefs.DisplayNumber]; VMStorage.InitializeStorage[]; InitializeClobberCatcher[]; [] _ DiskIODefs.InitializeDiskIO[minOps: numOps]; InitializeVMIO[]; InitializeVMPageMgr[]; InitializeVMCache[min, max]; InitializeVMFile[max]; END; FinalizeVM: PUBLIC PROCEDURE = BEGIN FinalizeVMFile[]; FinalizeVMCache[]; FinalizeVMPageMgr[]; FinalizeVMIO[]; DiskIODefs.FinalizeDiskIO[]; FinalizeClobberCatcher[]; VMStorage.FinalizeStorage[]; END; -- Procedures and Variables Exported to VMSpecial -- DisableClobberCatcher: PUBLIC PROCEDURE = FinalizeClobberCatcher; -- Procedures and Variables Exported to VMPrivate -- loggingEnabled: PUBLIC BOOLEAN; clobberCatcherEnabled: PUBLIC BOOLEAN; WriteEnable: PUBLIC PROCEDURE [page: MDSPageNumber] = BEGIN IF ~clobberCatcherEnabled THEN RETURN; wpTable[page] _ FALSE; [] _ Map.SETF[page, Map.Clean]; END; WriteProtect: PUBLIC PROCEDURE [page: MDSPageNumber] = BEGIN IF ~clobberCatcherEnabled THEN RETURN; wpTable[page] _ TRUE; [] _ Map.SETF[page, Map.WriteProtected]; END; -- Internal Procedures -- WPTable: TYPE = PACKED ARRAY MDSPageNumber OF BOOLEAN; wpTable: POINTER TO WPTable; cleanupItem: ImageDefs.CleanupItem _ [link: , mask: ImageDefs.AllReasons, proc: Cleanup]; InitializeClobberCatcher: PROCEDURE = BEGIN clobberCatcherEnabled _ SegmentDefs.memConfig.AltoType IN SegmentDefs.MachineType[D0..Dorado]; IF ~clobberCatcherEnabled THEN RETURN; wpTable _ VMStorage.longTerm.NEW[WPTable _ ALL[FALSE]]; ImageDefs.AddCleanupProcedure[@cleanupItem]; END; FinalizeClobberCatcher: PROCEDURE = BEGIN IF ~clobberCatcherEnabled THEN RETURN; ImageDefs.RemoveCleanupProcedure[@cleanupItem]; -- Nothing should be write-protected at this point, but just in case... Cleanup[OutLd]; VMStorage.longTerm.FREE[@wpTable]; clobberCatcherEnabled _ FALSE; END; Cleanup: ImageDefs.CleanupProcedure = BEGIN SELECT why FROM Finish, Abort => FinalizeClobberCatcher[]; OutLd, Save, Checkpoint => FOR i: MDSPageNumber IN MDSPageNumber DO IF wpTable[i] THEN [] _ Map.SETF[i, Map.Clean]; ENDLOOP; InLd, Restore, Restart => FOR i: MDSPageNumber IN MDSPageNumber DO IF wpTable[i] THEN [] _ Map.SETF[i, Map.WriteProtected]; ENDLOOP; ENDCASE; END; END.