DIRECTORY GermSwap USING [LP, mdsiGerm], PrincOps, PrincOpsUtils, SparcSoftcard, SoftcardBDVMPrivate, VM USING [Interval, PageNumber, PageCount], VMInternal; SoftcardBDVMPrivateImpl: MONITOR LOCKS VMInternal.vmStateLock IMPORTS GermSwap, PrincOpsUtils, VMInternal EXPORTS SoftcardBDVMPrivate SHARES VMInternal ~ BEGIN hook: CARD16 ~ 210B; MagicStructure: TYPE ~ RECORD [ -- three words (48 bits)! region: PrincOps.PageNumber, swPages: CARD16 ]; softcardPage: CARD32 = SparcSoftcard.softcardPageSizeByte; GetBDVMInterval: PUBLIC PROC RETURNS [interval: VM.Interval] ~ { pMagicStructure: PUBLIC LONG POINTER TO READONLY MagicStructure _ LOOPHOLE[GermSwap.LP[LOOPHOLE[PrincOps.SD + hook], GermSwap.mdsiGerm]]; interval _ [pMagicStructure.region, pMagicStructure.swPages]; }; AllocateRealMemory: ENTRY PROC [vmPage: PrincOps.PageNumber, realPage: PrincOps.RealPageNumber] RETURNS [errCode: INT _ 0] ~ { ENABLE UNWIND => NULL; vmEntry: VMInternal.VMMapEntry _ VMInternal.GetVMMap[vmPage]; specialFlags: PrincOps.PageFlags _ PrincOps.flagsNone; specialEntry: in VMInternal.VMMapEntry; newRME: VMInternal.RMMapEntry _ [ dataState: none, needsBackingStoreWrite: FALSE, body: pinned[pinReason: specialRealPageInUse, pinCount: 0] ]; WITH vmE: vmEntry SELECT VMInternal.InOut[vmEntry] FROM out => IF vmE.dataState#none THEN RETURN[1] --Error nobody should have seen it yet ENDCASE => RETURN[2]; specialEntry _ [ state: PrincOpsUtils.PageStateFromFlags[specialFlags], body: in[real: realPage] ]; WITH rmE: VMInternal.rmMap[realPage] SELECT FROM free => NULL; ENDCASE => RETURN[3]; VMInternal.rmMap[realPage] _ newRME; VMInternal.SetVMMap[vmPage, specialEntry]; }; SetBDVM: PROC RETURNS [int: VM.Interval] ~ { realP: PrincOps.RealPageNumber _ firstBDRealAd/PrincOps.bytesPerPage; vmPage: PrincOps.PageNumber; int _ GetBDVMInterval[]; vmPage _ int.page; THROUGH [0..int.count) DO [] _ AllocateRealMemory[vmPage, realP]; vmPage _ vmPage+1; realP _ realP+1; ENDLOOP; }; firstBDRealAd: PUBLIC CARD32 _ SparcSoftcard.cedarBackDoorBaseByte+20000h; interval: VM.Interval _ SetBDVM[]; firstBDVMAd: PUBLIC LONG POINTER _ PrincOpsUtils.AddressForPageNumber[interval.page]; maxBDVMBytes: PUBLIC CARD32 _ interval.count*PrincOps.bytesPerPage; END. JSoftcardBDVMPrivateImpl.mesa Copyright Σ 1988 by Xerox Corporation. All rights reserved. Ch. Le Cocq, October 26, 1988 Christian Le Cocq December 7, 1988 2:04:14 pm PST Allocation of the Softcard backdoor memory. Description of the procedure. Beware ! you cannot raise an error under VM lock (as I learned painfully) Κτ˜code•Mark outsideHeaderšœ™Kšœ<™