DIRECTORY Basics USING[HighHalf], CedarMicrocode USING[RTMOVESTATUS, DISABLEMICROCODE, ENABLEMICROCODE, microcodeVersion], DeviceCleanup USING[Item, Reason, Await], GermSwap USING[switches], PrincOps USING[PsbIndex], RCMicrocodeOps USING[], -- export of rcMicrocodeExists VM USING[AddressForPageNumber, Allocate, Interval, Pin, PagesForWords], ZCT USING[ZeroCountTable, ZCTObject, FOSTableObject]; NewSafeStoragePinnedImpl: PROGRAM IMPORTS Basics, CedarMicrocode, DeviceCleanup, GermSwap, VM EXPORTS ZCT, RCMicrocodeOps = BEGIN zct: PUBLIC ZCT.ZeroCountTable _ NIL; rcMicrocodeWasEnabled: PUBLIC BOOL _ FALSE; rcMicrocodeExists: PUBLIC BOOL _ FALSE; ucVersion: NAT; useSoftware: BOOL _ GermSwap.switches[s]; -- for debugging InitializeCleanup: PUBLIC PROC = { TurnOn[firstTime: TRUE]; DO item: DeviceCleanup.Item; reason: DeviceCleanup.Reason _ DeviceCleanup.Await[@item]; SELECT reason FROM turnOff, kill => TurnOff[]; turnOn => TurnOn[]; ENDCASE; ENDLOOP; }; TurnOff: PROC = INLINE { -- save ucode state IF rcMicrocodeExists AND rcMicrocodeWasEnabled THEN CedarMicrocode.DISABLEMICROCODE[zct]; }; TurnOn: PROC [firstTime: BOOL _ FALSE] = INLINE { -- restore ucode state [] _ CedarMicrocode.RTMOVESTATUS[177777B--initialize--, gcStateBank]; IF firstTime OR rcMicrocodeWasEnabled THEN { ucVersion _ CedarMicrocode.ENABLEMICROCODE[zct]; rcMicrocodeWasEnabled _ TRUE; rcMicrocodeExists _ (ucVersion = CedarMicrocode.microcodeVersion) AND NOT useSoftware; IF NOT rcMicrocodeExists THEN { CedarMicrocode.DISABLEMICROCODE[zct]; rcMicrocodeWasEnabled _ FALSE; }; }; }; zctInterval: VM.Interval = VM.Allocate[count: VM.PagesForWords[SIZE[ZCT.ZCTObject]+SIZE[ZCT.FOSTableObject]], in64K--permanent--: TRUE]; Foo: TYPE = MACHINE DEPENDENT RECORD[ a: WORD _ 0, b: WORD _ 0, reclaimState: CARDINAL, collector: CARDINAL --PROCESS ]; gcsInterval: VM.Interval = VM.Allocate[count: 1, alignment: 8, in64K--permanent--: TRUE]; gcState: LONG POINTER TO Foo _ VM.AddressForPageNumber[gcsInterval.page]; gcStateBank: CARDINAL _ Basics.HighHalf[LOOPHOLE[gcState, LONG CARDINAL]]; VM.Pin[gcsInterval]; gcState.reclaimState _ 100000B; gcState.collector _ LAST[PrincOps.PsbIndex] + 1; VM.Pin[[page: zctInterval.page, count: 1]]; zct _ VM.AddressForPageNumber[zctInterval.page]; -- pinned. On a page boundary. END.  NewSafeStoragePinnedImpl.Mesa This code and global frame must be pinned. last edited December 6, 1983 2:33 pm by Paul Rovner START COMPATIBILITY BOILERPLATE END COMPATIBILITY BOILERPLATE START HERE START COMPATIBILITY BOILERPLATE END COMPATIBILITY BOILERPLATE ΚΌ– "cedar" style˜Iprocšœ™Kšœ*™*šœ3™3K˜šΟk ˜ Kšœœ ˜Kšœœ1œ˜XKšœœ˜)Kšœ œ ˜Kšœ œ ˜KšœœΟc˜7Kšœœ?˜GKšœœ,˜5—K˜Kšœ˜!Kšœ0˜;Jšœœ˜Kšœ˜K˜Jšœœœœ˜%Jšœœœœ˜+Jšœœœœ˜'Jšœ œ˜Jšœ œž˜;J™šΟnœœœ˜"Jšœœ˜š˜Kšœ˜Kšœ:˜:šœ˜Kšœ˜Kšœ˜Kšœ˜——Kšœ˜Kšœ˜—K˜šŸœœœž˜-šœœ˜.Kšœœ˜*—Kšœ˜K˜—š Ÿœœ œœœž˜IK™šœ™Kšœ œžœ˜E—Kšœ™K˜šœ œœ˜,Kšœœ˜0Kšœœ˜šœ˜Jšœ0œœ ˜D—šœœœ˜Kšœœ˜%Kšœœ˜K˜—K˜—K˜J˜—Kšœ ™ K˜šœ œ ˜š œœœœœ œœ˜TKšœ ž œœ˜——K˜šœ™š œœœ œœ˜%Kšœœ˜ Kšœœ˜ Kšœœ˜Kšœ œž ˜Kšœ˜—K˜Kš œ œ œ'ž œœ˜YKš œ œœœœ(˜IKš œ œœ œœ˜JKšœ˜Kšœ˜Kšœœ˜0—Kšœ™K˜Kšœ)˜+Kšœœ*ž˜PK˜Kšœ˜K˜——…— Τ