.TITLE DDTMU ;MAIN PROGRAM FOR DDT22 INTERTASK DEBUGGER ;NOTE THAT IT MUST BE LINKED WITH A VERSION OF DDT22 THAT WAS ;ASSEMBLED WITH MU$DBG DEFINED AND $VMEM DEFINED AT LEAST WITH I/O ;PAGE ACCESS. UNDER RSX11M (M+?) ALSO IT IS DESIRABLE TO DEFINE ;R$XMDB TO ALLOW QUICK MAPPING TO A TASK. NOTE THAT DDT AND THE ;TASK MUST NOT MOVE IN MEMORY DURING DEBUGGING; THIS MAY MEAN A QUIESCENT ;SYSTEM BUT SHOULD MEAN AT ANY RATE THAT THE SHUFFLER IS REMOVED ;TEMPORARILY AND THAT NO CHECKPOINT SPACE IS ALLOCATED IF SOMEONE ;ELSE IS TO BE ON. THIS WILL PREVENT TASK MOTION. ; ; NOTE: IF R$XMDB IS DEFINED, CALLS DMG11M (IN DDT) TO REMAP THE TASK ;AT EVERY MSG FROM THE TASK. ; .MCALL EXIT$S,ASTX$S .MCALL SRDA$S,SDAT$,DIR$,RCVD$S,RSUM$S .MCALL RSUM$ ;N.B. -- SUSPEND/RESUME USED FOR TSK SYNCHRONIZATION. DONE FOR ;SYSTEM COMPATIBILITY (M,M+,IAS,RSX11D). ;INTERNAL GLOBALS: .GLOBL DDTMU,TSKSAV,TSKRSU ;EXTERNAL GLOBALS: .GLOBL D.TRAV ;TRAP .GLOBL D.EMTV ;EMT .GLOBL D.SEGV ;SEG TRP .GLOBL D.IOTV ;IOT .GLOBL D.NXMT ;NXM .GLOBL D.ILGT ;ILL INST .GLOBL D.BRK ;BPT .MCALL WSIG$S,ENAR$S,DSAR$S,RCVD$S,SDAT$S ; ; GETMP - MAP TASK'S APR IN. ASSUMES RCVBUF & RCVBUF+2 ARE TSK NAME. ; .MACRO PUSH,LIST .IRP X, MOV X,-(SP) .ENDR .ENDM .MACRO POP,LIST .IRP X, MOV (SP)+,X .ENDR .ENDM .IF DF,R$XMDB GETMP: PUSH MOV RCVBUF,R0 ;1ST HALF OF TSK NAME MOV RCVBUF+2,R1 ;2ND HALF TSKNAM JSR PC,DBG11M ;NOW TSKAPR ARRAY HAS TASK APR'S. MOVE TO VKPAR0 AREA IN DDT .GLOBL TSKAPR,VKPAR0 MOV #TSKAPR,R0 MOV #VKPAR0,R1 MOV #8.,R2 1$: MOV (R0)+,(R1)+ DEC R2 BGT 1$ ;COPY APR IMAGES. ;DON'T ALTER PARMAP. USER HAS TO TURN THAT ON. POP RTS PC .ENDC RCVBUF: .BLKW 15. ;BUFFER FOR RECEIVED DATA SNDBUF: SDAT$ ,SNDDAT .GLOBL SNDDAT,RCVBUF SNDDAT: .BLKW 13. SNDTNM=SNDBUF+S.DATN ;TASK NAME ADDRESS TO SEND [BACK] TO. DOFLG: .WORD 0 ;MAIN LINE. ; FLOW: ; ALLOW AST'S AND SET UP A MESSAGE INPUT AST TO MTMSG ;TO PROCESS ALL AST'S FROM TSK MESSAGES RECEIVED. (THIS ASSUMES ;THAT DDT IS STARTED PRIOR TO STARTING THE TASK. WE WILL ASSUME ;THAT OUR TASK NAME IS DDT22M (M FOR MULTITASK, NOT FOR RSX11M) ;SO THAT A TASK MAY SEND DATA TO OUR DEBUGGER BY TASK NAME. ; SAVE TSK START ADDRESS IN JOBSA AND TSK NAME HERE FOR USE WITH ;MESSAGES. ; EXECUTE A BPT TO GET BACK TO DDT COMMAND LEVEL. ; ** NOTE THAT TSKRSU MUST REPLACE D.UR7 WITH THE CORRECT DEFAULT ;LOOP ADDRESS ONCE IT IS DONE TO GET DDT TO CONTINUE ITS OWN ;TASK IN THE DDT IDLE LOOP. ; FALL INTO THE DDT IDLE LOOP WHICH ENABLES AST'S AND WAITS ;FOR SIGNIFICANT EVENTS. DDTMU: ;FIRST AWAIT A MESSAGE FROM THE USER TASK THAT HE STARTED. ;DDT IDLE LOOP - NORMALLY DDT IS HERE ONCE ITS TASK IS STARTED ; AND THE OTHER TASK IS INITIALIZED. SRDA$S #GOAST ;INITIAL AST ENTRY AT GOAST ENAR$S D.MU0: WSIG$S BR D.MU0 ;WAIT TILL WE GET INITIAL MSG D.MU1: SRDA$S #MUAST ;SET AST ENTRY AT MUAST ON RCV DATA. ENAR$S MOV #1,DOFLG ;NOTE THE BPT WILL RESET THE PC BUT JOBSA SHOULD BE OK ANYWAY. NOP ;(IN CASE WE NEED PATCHING ONLINE) BPT ;ENTER DDT COMMAND MODE AGAIN NOP ;(IN CASE WE NEED PATCHING ONLINE) DDTIDL: ENAR$S ;ALLOW MESSAGE IN AST'S TO OCCUR. WSIG$S BR DDTIDL ;AST ENTRIES... START PROCESSING GOAST: RCVD$S ,#RCVBUF ;GET DATA READ IN MOV RCVBUF,SNDTNM ;AND SAVE TSK NAME MOV RCVBUF+2,SNDTNM+2 .IIF DF,R$XMDB, JSR PC, GETMP ;SET UP DDT MAP ; ;FORMAT OF MESSAGES: ;+4 WORD CODE OF MSG TYPE. IGNORED FIRST TIME. ; AFTER, 0=BPT, 2=ODD ADDR,4=ILL INST,6=EMT,10=TRAP, ; 12=IOT,14=SEG ERR ;+6 WORD PC AT TRAP (START ADDRESS ON 1ST MSG) ;+10 WORD POINTER TO SAVED R0-R5,SP,PC,PSW ;+12 WORD POINTER TO FPU SAVE AREA (STAT, AC0-AC5) ;+14 WORD PSW AT TRAP ; ;FORMAT OF MESSAGES SENT BACK: ; WORD PC TO START WITH ; WORD PSW TO START WITH ; MOV RCVBUF+6,JOBSA ;SAVE START ADDRESS IN DDT MOV RCVBUF+6,D.UR7 ;ALSO SAVE AS USER PC MOV #D.MU1,2(SP) ;SET TO GO TO D.MU1 ON EXIT ;THIS ALLOWS THE PROCESSING TO FALL INTO THE BPT. JSR PC,FILPTR ;FILL DDT ADDR POINTERS TO REGS ASTX$S ; ;MUAST - NORMAL MSG-IN AST MUAST: RCVD$S ,#RCVBUF ;GET DATA IN MOV RCVBUF,SNDTNM ;AND SAVE TSK NAME MOV RCVBUF+2,SNDTNM+2 MOV RCVBUF+6,JOBSA ;SAVE START ADDRESS IN DDT MOV RCVBUF+14,D.USTA ;SAVE PSW OF TASK TOO. .IIF DF,R$XMDB, JSR PC, GETMP ;SET UP DDT MAP JSR PC,FILPTR ;FILL IN TSK ADDRESSES (JUST PRECAUTION) SRDA$S #MUAST MOV R0,-(SP) ;NEED A REGISTER MOV RCVBUF+4,R0 ;GET MSG TYPE CODE BIT #^C16,R0 BEQ 1$ MOV (SP)+,R0 ;IGNORE ILLEGAL CODES ASTX$S 1$: MOV R0,-(SP) MOV 2(SP),R0 ;RESTORE R0 MOV (SP)+,(SP) ;MOVE UP ADDR ADD #CODMAP,(SP) MOV @(SP)+,-(SP) ;GET WHERE TO GO JMP ASTSET ;GO FAKE TRAP ENTRY NOW. CODMAP: .WORD D.BRK,D.NXMT,D.ILGT,D.EMTV .WORD D.TRAV,D.IOTV,D.SEGV,D.BRK ;FILPTR - FILL DDT REG ADDR SYMBOLS WITH CORECT TSK VALUES. FILPTR: MOV R0,-(SP) MOV RCVBUF+10,R0 ;GET POINTER TO SAVED AREA MOV #2,-(SP) MOV R0,U.R0 ADD @SP,R0 MOV R0,U.R1 ;FILL IN ADDRESSES ADD @SP,R0 MOV R0,U.R2 ADD @SP,R0 MOV R0,U.R3 ADD @SP,R0 MOV R0,U.R4 ADD @SP,R0 MOV R0,U.R5 ADD @SP,R0 MOV R0,U.SP ADD @SP,R0 MOV R0,U.PC ADD (SP)+,R0 MOV R0,U.PS MOV RCVBUF+12,R0 .IF DF,$D$FPU MOV R0,FPSTT MOV #10,-(SP) ADD #2,R0 MOV R0,FPAC ADD @SP,R0 MOV R0,FPAC+6 ADD @SP,R0 MOV R0,FPAC+6+6 ;AC2 ADD @SP,R0 MOV R0,FPAC+6+6+6 ;AC3 ADD @SP,R0 MOV R0,FPAC+24. ;AC4 ADD (SP)+,R0 MOV R0,FPAC+30. ;AC5 .ENDC MOV (SP)+,R0 RTS PC ; ;TSKSAV - PERFORM SPECIAL INITS NEEDED ONCE INTO BPT SERVICE. ; ; (NONE AT PRESENT) TSKSAV: CLC ;SAY ALL IS WELL RTS PC ;TSKRSU - RESUME THE TASK BY SENDING IT A CONTINUE MSG WITH SOME PS INFO ; TO USE. TSKRSU: TST DOFLG ;GOTTEN INIT'ED YET? BNE 1$ ;YES, LET US SEND MSG RTS PC ;NO, RETURN 1$: ;ASSUMES WE HAVE D.USTA AND D.UR7 AS WHERE TO GO. ALSO ASSUMES TASK NAME ;IS SET UP. MOV D.UR7,SNDDAT ;TELL WHERE TO START MOV D.USTA,SNDDAT+2 ;AND WITH WHAT PSW MOV #DDTIDL,D.UR7 ;THEN FIX UP TO IDLE HERE BIC #360,D.USTA ;AND BE SURE NO T BIT IS SET. DSAR$S ;BE SURE NO AST RECOGNIZE TILL BACK IN IDLE DIR$ #SNDBUF ;EMIT THE DATA TO THE TARGET TASK 10$: RSUM$S #SNDTNM ;RESUME THE TASK THEN. CMPB @#$DSW,#IE.ITS ;IS TASK NOT SUSPENDED? BNE 2$ ;IF NOT THAT PROBLEM JUST GO ;IF TASK NOT SUSPENDED, COULD BE THAT DDT GOT CONTROL TOO FAST. WSIG$S ;WAIT A SIG EVENT TIME TO GIVE OTHER GUY CONTROL BR 10$ ;THEN TRY AGAIN. 2$: ;REF LABEL RTS PC ; ; ASTSET ; ; ENTER A PSEUDO INTERRUPT FROM AN RSX AST ENTRY. ; ** NOTE: SPECIAL VERSION FOR M/TSK DDT GETS PS/PC PAIR FROM MESSAGE BUFF. ;CALL (FROM INSIDE AN AST): ; MOV #,-(SP) ;FAKE JSR RETURN ; JMP ASTSET ; ; RETURNS FROM THE AST (ISSUES THE ASTX$S) AND RETURNS TO THE ;INTERRUPT HANDLER AFTER THE AST. THE INTERRUPT HANDLER WILL APPEAR TO ;HAVE JUST RECEIVED THE HARDWARE INTERRUPT. THE ASSUMPTION (VALID IN ;RSX11M V3.1) IS THAT THE AST STACK IS: ; E.F. WORD #1 ; E.F. WORD #2 ; E.F. WORD #3 ; E.F. WORD #4 ; AST PSW ; AST PC OF TASK ; SP: OLD $DSW ; ;WE MOVE THE AST-RELATED STUFF DOWN THE STACK, COPY THE AST PS,PC PAIR TO ;THE TOP, AND CAUSE THE AST TO RETURN TO THE INTERRUPT HANDLER WITH ;THE TASK STACK THEN CONTAINING THE ORIGINAL AST PS,PC PAIR. .MCALL ASTX$S .GLOBL ASTSET ASTSET: ;FIRST BE SURE WE HAVE AN EVEN, NONZERO ADDRESS TO GO TO. TST (SP) ;RETURN ADDR ZERO? BNE 1$ ;NO, LOOKS OK. 2$: TST (SP)+ BR 100$ ;SOMETHING WRONG. JUST EXIT THE AST. 1$: BIT #1,(SP) ;IS ADDRESS EVEN BNE 2$ ;NO, EXIT AST. MOV 2(SP),-(SP) ;COPY NEW $DSW INTO PLACE MOV 6(SP),4(SP) ;MOVE THE OLD PC DOWN MOV 10(SP),6(SP) ;MOVE DOWN OLD PS MOV 12(SP),10(SP) ;...OLD STATUS 4... MOV 14(SP),12(SP) ;...3... MOV 16(SP),14(SP) ;...2... MOV 20(SP),16(SP) ;...AND 1 ... ;NOW WE HAVE FREED THE TOP WORD OF THE STACK AND MOVED THE AST STACK ;DOWN 1 WORD. FILL IT IN AND MOVE DOWN THE OTHER WORD. MOV RCVBUF+14,20(SP) ;FILL IN OTHER TASK PS ; MOV 6(SP),20(SP) ;PUT AST PS INTO PLACE MOV 6(SP),RSV ;SAVE TEMP LOC MOV 10(SP),6(SP) ;MOVE DOWN STATUS 4 MOV 12(SP),10(SP) ;...3... MOV 14(SP),12(SP) ;...2... MOV 16(SP),14(SP) ;...AND 1, TO MOVE ALL THESE DOWN. ;NOW 16(SP) MAY BE FILLED IN WITH THE AST PC ;NOTE WE WANT THE TRAP HANDLERS TO SEE THE PC IN THE OTHER TASK SO FILL ;THAP PC HERE INSTEAD OF THE NORMAL ONE. MOV RCVBUF+6,16(SP) ;GET TASK PC FROM MSG BUFFER ; MOV 4(SP),16(SP) ;FILL IN THE AST PC FOR INT. HANDLER. MOV RSV,4(SP) ;AND LET THE OLD PS APPLY TO THE INT HANDLER 100$: ASTX$S ;NOW OFF TO THE INTERRUPT HANDLER. RSV: .WORD 0 ;TEMP .END DDTMU