<> <> <> <> <<>> DIRECTORY BootFile USING [MDSIndex], GermSwap USING [gCross, lCross, LP, mdsiGerm, nGCross, nLCross, pMon, pRequest, ReadMDS, Request, Switches], PrincOps USING [Port, SD, sBootSwitches, TrapLink], PrincOpsUtils USING [COPY, Free, LongCOPY, MyGlobalFrame, MyLocalFrame, WriteMDS]; GermSwapImpl: PROGRAM IMPORTS GermSwap, PrincOpsUtils EXPORTS GermSwap SHARES GermSwap = BEGIN <> Initialize: PUBLIC PROCEDURE [mdsiOther: BootFile.MDSIndex] = BEGIN <> OPEN port: LOOPHOLE[Port, PrincOps.Port]; InitializeMDS[]; <> port.dest _ [frame[PrincOpsUtils.MyLocalFrame[]]]; -- temporarily connect Port to self Procedure[]; <> GermSwap.lCross.accesslink _ GermSwap.gCross; GermSwap.lCross.pc _ port.frame.pc; GermSwap.lCross.returnlink _ PrincOps.TrapLink; PrincOpsUtils.Free[port.frame]; port.frame _ GermSwap.lCross; <> PrincOpsUtils.COPY[ from: PrincOpsUtils.MyGlobalFrame[], nwords: GermSwap.nGCross, to: GermSwap.gCross]; PrincOpsUtils.LongCOPY[ from: GermSwap.lCross, nwords: GermSwap.nLCross+GermSwap.nGCross, to: GermSwap.LP[GermSwap.lCross, mdsiOther]]; <> GermSwap.pMon.CrossMDSCall _ LOOPHOLE[GermSwap.gCross+(@port-LOOPHOLE[PrincOpsUtils.MyGlobalFrame[], POINTER TO PrincOps.Port])]; GermSwap.pMon.pcCross _ GermSwap.lCross.pc END; switches: PUBLIC GermSwap.Switches; bootedFrom: PUBLIC GermSwap.Request; InitializeMDS: PUBLIC PROCEDURE = BEGIN switches _ LOOPHOLE[GermSwap.LP[@PrincOps.SD[PrincOps.sBootSwitches], GermSwap.mdsiGerm], LONG POINTER TO GermSwap.Switches]^; bootedFrom _ LOOPHOLE[GermSwap.LP[GermSwap.pRequest, GermSwap.mdsiGerm], LONG POINTER TO GermSwap.Request]^; END; <> Port: PORT RETURNS [mdsiOther: BootFile.MDSIndex, Dest: PROCEDURE]; Procedure: PROCEDURE = BEGIN -- address of this frame must be same in both MDS's; global frames must be "similar" mdsiOther: BootFile.MDSIndex; Dest: PROCEDURE; mdsiBack: BootFile.MDSIndex; DO [mdsiOther, Dest] _ Port[]; [Dest, mdsiBack] _ Save2AndWriteMDS[Dest, GermSwap.ReadMDS[], mdsiOther]; Dest[]; PrincOpsUtils.WriteMDS[mdsiBack]; ENDLOOP END; Save2AndWriteMDS: PROCEDURE [s1, s2: UNSPECIFIED, mdsi: BootFile.MDSIndex] RETURNS [t1, t2: UNSPECIFIED] = LOOPHOLE[PrincOpsUtils.WriteMDS]; -- t1=s1 AND t2=s2! END.