-- File: [Indigo]<Sakura>Dragon>DragonBackDoorImpl.sak -- Backdoor process procedures -- BackDoor: DEVICE = { IN OUT GUARDIAN {} CONTROL { DO WHEN ClockB UP: NULL; MCMD ← CMDIn; IF MCMD THEN { [MInst, ] ← DecodeMbusCommand[]; SELECT MInst FROM ReadQuad => BDReadQuad[]; WriteQuad => BDWriteQuad[]; WriteSingle => BDWriteSingle[]; ReadMap => NULL; SetRpDirty => BDSetRpDirty[]; DoMapOp => NULL; ENDCASE}; ENDLOOP} }; BDReadQuad: PROC = { success: BOOLEAN; ReadOneWord: PROC = { WHEN ClockB UP: IF success THEN MWData ← Data[DataIndex].D[MWord]; WHEN ClockA UP: { IF success THEN MDataOut ← [Data[MWData]]; MWord ← (MWord+1) MOD 4}; }; [success, DataIndex] ← FullMatch[MRP, MBL]; WHEN ClockA UP: IF success THEN MShared ← TRUE; THROUGH [1..4] DO ReadOneWord[] ENDLOOP; WHEN ClockB UP: MShared ← FALSE}; -- BDReadQuad BDWriteQuad: PROC = { success: BOOLEAN; WriteOneWord: PROC = { WHEN ClockB UP: IF success THEN Data[DataIndex].D[MWord] ← MRdData; WHEN ClockA UP: MWord ← MWord+1; ReadDataFromBus[@MRdData]}; [success, DataIndex] ← FullMatch[MRP, MBL]; WHEN ClockA UP: NULL; -- (A) IF success THEN { MShared ← TRUE; MWord ← 0; ReadDataFromBus[@MRdData]}; THROUGH [1..3] DO WriteOneWord[] ENDLOOP; WHEN ClockB UP: { IF success THEN Data[DataIndex].D[MWord] ← MRdData; IF success THEN MShared ← FALSE}}; -- BDWriteQuad BDWriteSingle: PROC = { success: BOOLEAN; [success, DataIndex] ← FullMatch[MRP, MBL]; WHEN ClockA UP: ReadDataFromBus[@MRdData]; -- (A) WHEN ClockB UP: IF success THEN Data[DataIndex].D[MWord] ← MRdData};-- BDWriteSingle BDSetRpDirty: PROC = { success: BOOLEAN; [success, DataIndex] ← FullMatch[MRP, MBL]; WHEN ClockA UP: NULL; -- (A) WHEN ClockB UP: IF success THEN Data[DataIndex].RpDirty ← TRUE}; -- BDSetRpDirty