<> <> <> <> DIRECTORY Mach, YggEnvironment, YggFile, YggLog, YggRestartFile; YggRestartFileImpl: CEDAR MONITOR IMPORTS Mach EXPORTS YggRestartFile = BEGIN RecordID: TYPE = YggLog.RecordID; WordNumber: TYPE = YggEnvironment.WordNumber; ReadRestartRecord: PUBLIC ENTRY PROC [] RETURNS [recordIDForCheckpointCompleteRecord: RecordID] ~ { mappedAddress: Mach.vmAddressT; kernCode: Mach.kernReturnT; pointerToCards: LONG POINTER TO ARRAY [0..3] OF CARD32; [mappedAddress: mappedAddress, kernCode: kernCode] _ Mach.vmAllocateWithPager[targetTask: Mach.taskSelf[], address: 0, size: 4096, anywhere: TRUE, pagingObject: [9], offset: 0, raiseSignal: TRUE]; pointerToCards _ LOOPHOLE[mappedAddress]; TRUSTED { recordIDForCheckpointCompleteRecord _ [sign: positive, low: pointerToCards[0], high: pointerToCards[1]]; }; [] _ Mach.vmDeallocate[targetTask: Mach.taskSelf[], address: mappedAddress, size: 4096, raiseSignal: TRUE]; }; WriteRestartRecord: PUBLIC ENTRY PROC [ recordIDForCheckpointCompleteRecord: RecordID] = { mappedAddress: Mach.vmAddressT; kernCode: Mach.kernReturnT; pointerToCards: LONG POINTER TO ARRAY [0..3] OF CARD32; [mappedAddress: mappedAddress, kernCode: kernCode] _ Mach.vmAllocateWithPager[targetTask: Mach.taskSelf[], address: 0, size: 4096, anywhere: TRUE, pagingObject: [9], offset: 0, raiseSignal: TRUE]; pointerToCards _ LOOPHOLE[mappedAddress]; TRUSTED { pointerToCards[0] _ recordIDForCheckpointCompleteRecord.low; pointerToCards[1] _ recordIDForCheckpointCompleteRecord.high; }; [] _ Mach.vmDeallocate[targetTask: Mach.taskSelf[], address: mappedAddress, size: 4096, raiseSignal: TRUE]; }; END.