<<>> <> <> <> <> <<>> DIRECTORY TargetArchitecture, RS6000Architecture, BreakWorldArchitecture, RS6000BreakWorldUtilities, RS6000Manger; RS6000MangerImpl: CEDAR PROGRAM IMPORTS -- TargetArchitecture ,-- RS6000Architecture, BreakWorldArchitecture, RS6000BreakWorldUtilities, RS6000Manger EXPORTS RS6000Manger ~ { <> Install: PUBLIC PROCEDURE [ address: BreakWorldArchitecture.Address, manger: BreakWorldArchitecture.Address, patchCode: BreakWorldArchitecture.Address] RETURNS [] ~ { IF address.IsNullAddress[] THEN { ERROR RS6000Manger.CantInstall[ code: $NullAddress, message: "Install[null address]"]; }; IF manger.IsNullAddress[] THEN { ERROR RS6000Manger.CantInstall[ code: $NullAddress, message: "Install[null manger]"]; }; IF patchCode.IsNullAddress[] THEN { ERROR RS6000Manger.CantInstall[ code: $NullAddress, message: "Install[null patchCode]"]; }; { instruction: RS6000Architecture.RS6000Instruction ~ RS6000BreakWorldUtilities.RS6000InstructionFromBreakWorldAddress[address: address]; <> < {>> UninstallNormal[address: address, manger: manger]; <<};>> < {>> <> <<};>> < {>> <> <<};>> < {>> <> <<};>> < {>> <> <<};>> < {>> <> <> <<};>> }; UninstallNormal: PROCEDURE [ address: BreakWorldArchitecture.Address, manger: BreakWorldArchitecture.Address] ~ { errorCode: RS6000Manger.ErrorCode _ RS6000Manger.nullErrorCode; errorMessage: RS6000Manger.ErrorMessage _ RS6000Manger.nullErrorMessage; { -- extra scope to contain EXITS. instruction: RS6000Architecture.RS6000Instruction ~ RS6000BreakWorldUtilities.RS6000InstructionFromBreakWorldAddress[ address: manger, displacement: SheepOffset[]]; mangerRS6000Address: RS6000Architecture.RS6000Address ~ RS6000BreakWorldUtilities.RS6000AddressFromBreakWorldAddress[address: manger]; sheepAddress: RS6000Architecture.RS6000Address ~ RS6000Architecture.RS6000AddressFromDisplacement[ address: mangerRS6000Address, displacement: SheepOffset[]]; instructionAddress: RS6000Architecture.RS6000Address ~ RS6000BreakWorldUtilities.RS6000AddressFromBreakWorldAddress[address: address]; unrelocated: RS6000Architecture.RS6000Instruction ~ RS6000Architecture.Relocate[ instruction: instruction, from: sheepAddress, to: instructionAddress ! RS6000Architecture.CantRelocate => { errorCode _ $CantRelocate; errorMessage _ "Cannot unrelocate instruction to breakpoint address"; GO TO Cannot; }]; <> BreakWorldArchitecture.PokeInstruction[ pc: address, instruction: RS6000Architecture.TargetInstructionFromRS6000Instruction[ instruction: unrelocated]]; <> EXITS Cannot => { ERROR CantUninstall[code: errorCode, message: errorMessage]; }; }; RETURN; }; <> <> <> <> <<{ -- extra scope to contain EXITS.>> <> <> <> <> <> <> <> <> <> <> <> <> < {>> <> <> <> <<}];>> <> <<>> <> <> <> <> <> <> < {>> <> <<};>> <<};>> <> <<};>> <<>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <<};>> <<>> <> <> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <<};>> <<>> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <<};>> <> SheepOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.NormalManger; mangerAddress: LONG POINTER TO RS6000Manger.NormalManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; sheepAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.sheep; sheepCard: CARD32 ~ LOOPHOLE[sheepAddress]; offset _ (sheepCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; NormalContinueOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.NormalManger; mangerAddress: LONG POINTER TO RS6000Manger.NormalManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; normalContinueAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.normalContinue; normalContinueCard: CARD32 ~ LOOPHOLE[normalContinueAddress]; offset _ (normalContinueCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; NormalNoopOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.NormalManger; mangerAddress: LONG POINTER TO RS6000Manger.NormalManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; normalNoopAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.normalNoop; normalNoopCard: CARD32 ~ LOOPHOLE[normalNoopAddress]; offset _ (normalNoopCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; TagOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.NormalManger; mangerAddress: LONG POINTER TO RS6000Manger.NormalManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; tagAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.tag; tagCard: CARD32 ~ LOOPHOLE[tagAddress]; offset _ (tagCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; DctiOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.BranchManger; mangerAddress: LONG POINTER TO RS6000Manger.BranchManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; dctiAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.dcti; dctiCard: CARD32 ~ LOOPHOLE[dctiAddress]; offset _ (dctiCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; BranchDelayOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.BranchManger; mangerAddress: LONG POINTER TO RS6000Manger.BranchManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; branchDelayAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.branchDelay; branchDelayCard: CARD32 ~ LOOPHOLE[branchDelayAddress]; offset _ (branchDelayCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; BranchContinueOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.BranchManger; mangerAddress: LONG POINTER TO RS6000Manger.BranchManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; branchContinueAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.branchContinue; branchContinueCard: CARD32 ~ LOOPHOLE[branchContinueAddress]; offset _ (branchContinueCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; CallAddrHiOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.CallManger; mangerAddress: LONG POINTER TO RS6000Manger.CallManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; callAddrHiAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.callAddrHi; callAddrHiCard: CARD32 ~ LOOPHOLE[callAddrHiAddress]; offset _ (callAddrHiCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; CallJmpOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.CallManger; mangerAddress: LONG POINTER TO RS6000Manger.CallManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; callJmpAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.callJmp; callJmpCard: CARD32 ~ LOOPHOLE[callJmpAddress]; offset _ (callJmpCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; CallNoopOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.CallManger; mangerAddress: LONG POINTER TO RS6000Manger.CallManger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; callNoopAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.callNoop; callNoopCard: CARD32 ~ LOOPHOLE[callNoopAddress]; offset _ (callNoopCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; JmplO7JmpOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.JmplO7Manger; mangerAddress: LONG POINTER TO RS6000Manger.JmplO7Manger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; jmplO7JmpAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.jmplO7Jmp; jmplO7JmpCard: CARD32 ~ LOOPHOLE[jmplO7JmpAddress]; offset _ (jmplO7JmpCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; JmplO7NoopOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.JmplO7Manger; mangerAddress: LONG POINTER TO RS6000Manger.JmplO7Manger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; jmplO7NoopAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.jmplO7Noop; jmplO7NoopCard: CARD32 ~ LOOPHOLE[jmplO7NoopAddress]; offset _ (jmplO7NoopCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; JmplO7PadOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.JmplO7Manger; mangerAddress: LONG POINTER TO RS6000Manger.JmplO7Manger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; jmplO7PadAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.jmplO7Pad; jmplO7PadCard: CARD32 ~ LOOPHOLE[jmplO7PadAddress]; offset _ (jmplO7PadCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; JmplG0JmpOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.JmplG0Manger; mangerAddress: LONG POINTER TO RS6000Manger.JmplG0Manger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; jmplG0JmpAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.jmplG0Jmp; jmplG0JmpCard: CARD32 ~ LOOPHOLE[jmplG0JmpAddress]; offset _ (jmplG0JmpCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; JmplG0DelayOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.JmplG0Manger; mangerAddress: LONG POINTER TO RS6000Manger.JmplG0Manger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; jmplG0DelayAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.jmplG0Delay; jmplG0DelayCard: CARD32 ~ LOOPHOLE[jmplG0DelayAddress]; offset _ (jmplG0DelayCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; JmplG0PadOffset: PROCEDURE [] RETURNS [TargetArchitecture.Displacement] ~ TRUSTED { offset: TargetArchitecture.Displacement _ TargetArchitecture.nullDisplacement; manger: RS6000Manger.JmplG0Manger; mangerAddress: LONG POINTER TO RS6000Manger.JmplG0Manger ~ @manger; mangerCard: CARD32 ~ LOOPHOLE[mangerAddress]; jmplG0PadAddress: LONG POINTER TO RS6000Architecture.RS6000Instruction ~ @manger.jmplG0Pad; jmplG0PadCard: CARD32 ~ LOOPHOLE[jmplG0PadAddress]; offset _ (jmplG0PadCard - mangerCard) * BYTES[UNIT]; RETURN [offset]; }; <> CantInstall: PUBLIC ERROR [ code: RS6000Manger.ErrorCode, message: RS6000Manger.ErrorMessage] ~ CODE; CantUninstall: PUBLIC ERROR [ code: RS6000Manger.ErrorCode, message: RS6000Manger.ErrorMessage] ~ CODE; }.