@X @~
~V7 56 2 -5
~D 10
~H                    MUSS
~
~
~D 10
~H             MTL511
~D 10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                            ISSUE 12~
~V9 -1
~P
~V9 1
~YMTL511
~S~M~OMUTL IMPLEMENTATION DESCRIPTION
~S~M~OSection 51 Version 1
~S~OSection 51.1 Process Environment
~S~O1. General Description
~BThis module contains primitives to support runtime diagnostic
utilities.  These primitives establish an access route between
the process being debugged and the debugging process, and allow
byte accessing of the virtual store of the process being debugged.
~BThe primitives in this module are machine independent.
~S~O2. Interfaces
~
Other modules used:~
~
MUTL procedures:~
   TL.DEBUG~
   TL.END.DEBUG~
   TL.DATA~
~S~O2.1 Hardware Interface
~BAny machine.
~S~O2.2 Software Interface
~S11) TL.DEBUG~
~G2) TL.END.DEBUG~G~
~G3) TL.DATA~G~
~BThese procedures are described in MTL501 with the rest of the
runtime diagnostic primitives.
~S~O3. Implementation
~S~O3.1 Outline of Operation
~BAll three modes of debugging are catered for in the primitive
specification namely: current, file and remote.  Only current
process debugging is implemented.
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                MTL511
~V9 -1
~F
@TITLE MTL51(1,12)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
SECTION 51
RUNTIME DIAGNOSTIC
PROCESS ENVIRONMENT PRIMITIVES
@BOX 2.0
EXTERNAL ENVIRONMENT [MTL51/1]
MODULE HEADING
@BOX 3.0
TYPES
@BOX 4.0
VARIABLES AND LITERAL
DECLARATIONS
@BOX 5.0
MUTL PROCEDURES
51.1 : TL.DEBUG
51.2 : TL.END.DEBUG
51.3 : TL.DATA
@BOX 6.0
END
@BOX 1.1
::SECTION 51
@BOX 2.1
#MTL51/1
MODULE (TL.DEBUG,TL.END.DEBUG,TL.DATA,ENV.E);
@BOX 3.1
TYPE PROCESS.E IS
   $LO8 INFO;
TYPE ENV.E IS
   $LO8 MODE
   LABEL DEBUG.RET
   PROCESS.E PROCESS;
@BOX 4.1
@BOX 5.1
PSPEC PROC.TYPE($IN,$IN,ADDR ENV.E);
LSPEC TL.DEBUG($IN,ADDR[$LO8],ADDR PROC.TYPE)/$IN;
LSPEC TL.END.DEBUG(ADDR ENV.E);
LSPEC TL.DATA(ADDR ENV.E,$IN,$IN32,$IN,ADDR[$LO8])/$IN;
*CODE 3;
#MTL51.1
#MTL51.2
#MTL51.3
@BOX 6.1
*END
@END
@TITLE MTL51/1(1,12)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
EXTERNAL ENVIRONMENT
@BOX 2.0
TYPES
@BOX 3.0
VARIABLES AND LITERALS
@BOX 4.0
PROCEDURES
@BOX 5.0
END
@BOX 1.1
::EXTERNAL ENVIRONMENT
@BOX 2.1
IMPORT TYPE FRAME.E;
@BOX 3.1
ADDR PW0, PW2;
@BOX 4.1
PSPEC T.PROC($IN,$IN);
LSPEC READ.TRAP($IN)/ADDR TPROC;
LSPEC SET.TRAP($IN,ADDR TPROC);
LSPEC READ.RECOVERY.STATUS($IN)/$IN;
LSPEC SET.RECOVERY.STATUS($IN,$IN);
LSPEC PPC.CMD();
LSPEC CHANGE.ACCESS ($IN,$LO32);
LSPEC READ.SEGMENT.STATUS($IN);
@BOX 5.1
::END
@END
@TITLE MTL51.1(1,12)
@COL 1S-2R-3T-4T-5R-6R-7R-8C-9F
@COL 10R
@ROW 10-5
@FLOW 1-2-3N-4N-5
@FLOW 4Y-6-7-8-9
@FLOW 3Y-10-9
@BOX 1.0
TL.DEBUG(MODE,[PROCESS.NAME],DEBUG.PROC)STATUS
@BOX 2.0
NOTE DEBUG MODE
@BOX 3.0
NOT CURRENT PROCESS DEBUGGING
@BOX 4.0
DIRECT MODE DEBUGGING
@BOX 5.0
TRAP MODE DEBUGGING
[MTL51.1.1]
@BOX 6.0
SET TL.END.DEBUG RETURN LABEL
@BOX 7.0
CALL DEBUG COMMAND
PROCESSOR
@BOX 8.0
TL.END.DEBUG
RETURN
@BOX 9.0
END
@BOX 10.0
SET STATUS
@BOX 1.1
PROC TL.DEBUG (MD,NAME,DEBUG.PR);
$IN I;
ENV.E ENV;
P.SPEC DEBUG.TRAP($IN,$IN);
ADDR DEBUG.TRAP [16] O.TRAPS;
$IN16[16] O.STATUS;
@BOX 2.1
0 => TL.DEBUG;
MD => MODE OF ENV;
@BOX 3.1
IF MD & 7 /= 0
@BOX 4.1
IF MD & %10 = 0
@BOX 5.1
#MTL51.1.1
@BOX 6.1
-> F51.1B6.1;
F51.1B6.2:;
-> F51.1B8;
F51.1B6.1:;
^F51.1B6.2 => DEBUG.RET OF ENV;
@BOX 7.1
DEBUG.PR^ (-1,-1,^ENV);
@BOX 8.1
F51.1B8:;
@BOX 9.1
END
@BOX 10.1
-1 => TL.DEBUG;
@END
@TITLE MTL51.1.1(1,12)
@COL 1S-2R-3R-5R-6T-7R-8C-9R-10F
@FLOW 1-2-3-5-6N-7-5
@FLOW 6Y-5
@FLOW 8Y-9-10
@BOX 1.0
TRAP MODE CURRENT PROCESS
@BOX 2.0
INCLUDE DEBUG TRAP PROCEDURE
[MTL51.1.2]
@BOX 3.0
SAVE TRAPS AND RECOVERY STATUS
SET TL.END.DEBUG RETURN
@BOX 5.0
SET ALL TRAPS TO DEBUG.TRAP
INHIBIT TRAPPING FOR ORGANISATIONAL COMMANDS
@BOX 6.0
PROCESS A SINGLE COMMAND
OK?
@BOX 7.0
SIGNAL COMMAND ERROR VIA DEBUG.TRAP
@BOX 8.0
TL.DEBUG RETURN
@BOX 9.0
RESET ORIGINAL TRAPS AND RECOVERY STATUS
@BOX 10.0
END
@BOX 1.1
::BEGIN
@BOX 2.1
#MTL51.1.2
@BOX 3.1
;FOR I < 16 DO
   READ.TRAP (I) => O.TRAPS[I];
   READ.RECOVERY.STATUS (I) => O.STATUS[I];
OD
->F51.1.1B3.1;
F51.1.1B3.2:;
->F51.1.1B8;
F51.1.1B3.1:;
^F51.1.1B3.2 => DEBUG.RET OF ENV;
@BOX 5.1
FOR I < 16 DO
   SET.TRAP (I,^DEBUG.TRAP);
   SET.RECOVERY.STATUS(I,0);
OD
SET.RECOVERY.STATUS(4,1);
@BOX 6.1
PPC.CMD();
IF PW0 = 0
@BOX 7.1
DEBUG.TRAP (4,0-PW0);
@BOX 8.1
F51.1.1B8:;
@BOX 9.1
FOR I < 16 DO
   SET.TRAP (I,O.TRAPS[I]);
   SET.RECOVERY.STATUS(I,O.STATUS[I]);
OD
@BOX 10.1
::END
@END
@TITLE MTL51.1.2(1,12)
@COL 1S-2R-4R-5R-6F
@FLOW 1-2-4-5-6
@BOX 1.0
DEBUG.TRAP (CLASS,CODE)
@BOX 2.0
RESET ALL TRAPS
@BOX 4.0
CALL DEBUG COMMAND PROCESSOR
@BOX 5.0
RESET ALL TRAPS TO DEBUG TRAP
@BOX 6.0
EXIT VIA RETURN FROM TRAP
END
@BOX 1.1
PROC DEBUG.TRAP(CLASS,CODE);
$IN I;
@BOX 2.1
FOR I < 16 DO
   SET.TRAP (I,O.TRAPS[I]);
   SET.RECOVERY.STATUS(I,O.STATUS[I]);
OD
@BOX 4.1
DEBUG.PR^ (CLASS,CODE,^ENV);
@BOX 5.1
FOR I < 16 DO
   SET.TRAP (I,^DEBUG.TRAP);
   SET.RECOVERY.STATUS(I,0);
OD
SET.RECOVERY.STATUS(4,1);
@BOX 6.1
RETURN.FROM.TRAP();
END
@END
@TITLE MTL51.2(1,12)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
TL.END.DEBUG(^ENV)
@BOX 2.0
RETURN TO TL.DEBUG
@BOX 3.0
END
@BOX 1.1
PROC TL.END.DEBUG(ENV);
LABEL FRIG;
@BOX 2.1
DEBUG.RET OF ENV^ => FRIG;
;-> FRIG;
@BOX 3.1
END;
@END
@TITLE MTL51.3(1,12)
@COL 1S-2T-4T-5T-6T-7R-8R-9F
@COL 10R
@ROW 6-10
@FLOW 1-2N-4N-5N-6N-7-8-9
@FLOW 2Y-10-9
@FLOW 4Y-7
@FLOW 5Y-10
@FLOW 6Y-10
@BOX 1.0
TL.DATA(^ENV,SEG,VIRT.ADDR,DIRN,[VALUE])STATUS
@BOX 2.0
NOT DEBUGGING CURRENT PROCESS?
@BOX 4.0
READ SEGMENT STATUS
ACCESS ALLOWED
@BOX 5.0
CAN ACCESS BE CHANGED?
@BOX 6.0
CHANGE ACCESS ON SEGMENT
FAILED?
@BOX 7.0
READ/WRITE DATA
@BOX 8.0
CHANGEACCESS BACK IF NECESSARY
@BOX 9.0
END
@BOX 10.0
SET STATUS
@BOX 1.1
PROC TL.DATA(ENV,SEG,VA,DN,VAL);
$IN ACC, F, I, Z;
ADDR [$LO8] P,T;
@BOX 2.1
0 => TL.DATA;
IF MODE OF ENV^ & 7 /= 0
@BOX 4.1
8 !> DN;
0 => F => ACC;
READ.SEGMENT.STATUS(SEG);
IF PW0 = 0 AND PW2 => ACC & DN = DN
@BOX 5.1
IF ACC & %10 = 0
@BOX 6.1
1 => F;
CHANGE.ACCESS(SEG,%10 ! DN);
IF PW0 /= 0
@BOX 7.1
SIZE (VAL) => Z;
MAKE ($LO8,Z,VA) => P;
IF DN & 2 /= 0 THEN
   P => T;
   VAL => P;
   T => VAL;
FI
FOR I < Z DO
   P^[I] => VAL^[I];
OD
@BOX 8.1
IF F /=0 THEN
   CHANGE.ACCESS(SEG,ACC);
FI
@BOX 9.1
END
@BOX 10.1
-1 => TL.DATA;
@END

