DIRECTORY SPARCArchitecture, SPARCManger; CirioBreakpoint: CEDAR DEFINITIONS ~ { registerSaveArea: NAT ~ 64 * BYTES[SPARCArchitecture.SPARCContents]; PatchStruct: TYPE ~ MACHINE DEPENDENT RECORD [ closureCaller: ClosureCaller, manger: SPARCManger.Manger ]; ClosureCaller: TYPE ~ MACHINE DEPENDENT RECORD [ save: SPARCArchitecture.SPARCInstruction, callSaveRegs: SPARCArchitecture.SPARCInstruction, argSaveAreaOnce: SPARCArchitecture.SPARCInstruction, retAddrHi: SPARCArchitecture.SPARCInstruction, retAddrLo: SPARCArchitecture.SPARCInstruction, argHiClientData: SPARCArchitecture.SPARCInstruction, callClientProc: SPARCArchitecture.SPARCInstruction, argLoClientData: SPARCArchitecture.SPARCInstruction, callRestoreRegs: SPARCArchitecture.SPARCInstruction, argSaveAreaAgain: SPARCArchitecture.SPARCInstruction, restore: SPARCArchitecture.SPARCInstruction ]; }. N CirioBreakpoint.mesa Copyright 1989, 1990, 1991 by Xerox Corporation. All rights reserved. Peter B. Kessler, March 29, 1990 10:31 am PST Patches can't be monitored, since the processor executes out of them. My accesses of the patches and the pc's executing in them are races. That isn't a problem because the pc's never get to the patches until I'm done setting them up (fortunately), and I don't clear the patch. Clearing a breakpoint is just putting the instruction back, since you can't tell when the pc (or several of them) are done with the patch (that's is a garbage collection problem). This closureCaller is for Cirio: it includes pushing an extra register window to avoid some register saving and to allocate space for saving the rest of the registers, and putting the ``return address'' of the patch in %i7, so Cirio can figure out where the breakpoint is. save %sp, -(spOffset+stackAllocationForCallee+registerSaveArea), %sp -- allocate a register window and a register save area. call _save_regs add %sp, spOffset+stackAllocationForCallee, %o0 -- save_regs(@registerSaveArea). sethi %hi(return_address), %i7 or %i7, %lo(return_address), %i7 -- set up ``return address''. sethi %hi(clientData), %o0 call clientProc or %lo(clientData), %o0 -- clientProc(clientData). call _restore_regs add %sp, spOffset + stackAllocationForCallee, %o0 -- restore_regs(@registerSaveArea). restore %sp, +(spOffset+stackAllocationForCallee+registerSaveArea), %sp -- deallocate the register window and register save area. Constants. 64 words for saving the registers (except %o0 and %o7, which we don't care about here). Types. Patches are self-describing, in that they include the address of the replaced instruction (in the header) and the replaced instruction (relocated into the patch). in the delay slot. in the delay slot. in the delay slot. (cedarcode) styleNewlineDelimiter codeK er=HJ-Jk KK Kunitln &KKKPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndentboo@DJPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndentco79J CharProps8PostfixXeroxCharCodesPostfixXeroxCharCodesPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent PclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent,/J PostfixXeroxCharCodesPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent "JPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndentPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent!JPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndentJPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndentoz JPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent PclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent JPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndentJ8PostfixXeroxCharCodesPostfixXeroxCharCodesPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndentPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent.1J PostfixXeroxCharCodesPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent#%PclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent@GJPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndent9;JPclearTabStops 0.75 in flushLeft tabStop 2.0 in flushLeft tabStop 0 bp restIndenthead "DKcWWK  .KK KK  0K**K1144KK//K//K44K3344KK4455KK,,KKLjb