.TITLE XDTUNL - UNLOAD XDT .SBTTL XDTUNL - TITLE PAGE .IDENT /V01.00/ ; ; ************************************************************************ ; * ; THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS ONLY. DIGITAL EQUIPMENT * ; COMPUTER USER'S SOCIETY, DIGITAL EQUIPMENT CORPORATION, MONSANTO, AND * ; THE AUTHOR DISCLAIM ALL WARRANTIES ON THE PROGRAM, INCLUDING WITHOUT * ; LIMITATION, ALL IMPLIED WARRANTIES OF MERCHANTABLITY AND FITNESS. * ; * ; FULL PERMISSION AND CONSENT IS HEREBY GIVEN TO DECUS AND TO THE DECUS * ; SPECIAL INTEREST GROUPS TO REPRODUCE, DISTRIBUTE, AND PUBLISH AND * ; PERMIT OTHERS TO REPRODUCE IN WHOLE OR IN PART, IN ANY FORM AND * ; WITHOUT RESTRICTION, THIS PROGRAM AND ANY INFORMATION RELATING TO IT. * ; * ; ************************************************************************ ; ; THIS ROUTINE UNLOADS XDT. ; ; VERSION: 01.00 ; ; AUTHOR: R.W. STAMERJOHN MAPC 10-MAR-80 ; ; MODIFICATION HISTORY: ; ; V01.00 RWS 10-MAR-80 INITIAL VERSION .SBTTL XDTUNL - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; SYMBOLICS DEFINITIONS (EXEMC.MLB). ; .MCALL HWDDF$ ;DEFINE HWD OFFSETS HWDDF$ .MCALL PCBDF$ ;DEFINE PCB OFFSETS PCBDF$ ; ; OTHER MACROS (RSXMAC.SML). ; .MCALL CALL,CALLR,RETURN ;SUBROUTINE MACROS ; ; GLOBAL DECLARATIONS: ; .GLOBL XDTUNL ;ROUTINE ENTRY ; ; GLOBAL REFERENCES: ; ; XDT CODE REFERENCES. ; .GLOBL SSTADR ;XDT VECTOR ADDRESSES .GLOBL ADR1 ;XDT BREAKPOINT ADDRESSES .GLOBL UIN ;XDT BREAKPOINT INSTRUCTIONS ; ; XDT POOL REFERENCES. ; .GLOBL SYSBEG ;START OF TEMPLATE .GLOBL SYSSIZ ;SIZE OF TEMPLATE .GLOBL TRP014 ;TRAP 14 ADDRESS ; ; RSX11M SUBROUTINES. ; .GLOBL $DEACB ;(CORAL) DEALLOCATE CORE BLOCK .GLOBL $EMTRP ;(DRDSP) EMT INSTRUCTION .GLOBL $ILINS ;(SSTSR) ILLEGAL INSTRUCTION .GLOBL $IOTRP ;(SSTSR) IOT INSTRUCTION .GLOBL $SGFLT ;(SSTSR) SEGMENT FAULT .GLOBL $TRACE ;(SSTSR) TRACE TRAP ROUTINE .GLOBL $TRTRP ;(DRDSP) TRAP INSTRUCTION .GLOBL $TRP04 ;(SSTST) ODD ADDRESS TRAP .SBTTL XDTUNL - MACRO DEFINITIONS ; ; DEFINE SYSTEM STATE MACRO. ; .MACRO SYSTEM ADDR EMT 376 .WORD ADDR S.R0 = 2 S.R1 = 4 S.R2 = 6 S.R3 = 10 .ENDM SYSTEM ; ; DEFINE FATAL ERROR MACRO. ; .MACRO FATAL MSG TRAP 1 .ASCIZ #MSG# .EVEN .ENDM FATAL .SBTTL XDTUNL - LOCAL DATA ; ; EXECUTIVE MAPPING TABLE. ; EXEADR: .WORD $TRP04 ;ODD ADDRESS .WORD $SGFLT ;SEGMENT FAULT .WORD $TRACE ;TRACE TRAP .WORD $IOTRP ;IOT INSTRUCTION .WORD $ILINS ;ILLEGAL INSTRUCTION .WORD $EMTRP ;EMT INSTRUCTION .WORD $TRTRP ;TRAP INSTRUCTION .SBTTL XDTUNL * UNLOAD XDT ; ;+ ; UNLOAD XDT. REMOVE BREAKPOINTS, UNHOOK FROM EXECUTIVE, FREE PARTITION. ; ; INPUT: ; ; NO SPECIAL REGISTERS. ; ; OUTPUT: ; ; XDT UNLOADED. ; ;- ; XDTUNL:: ;REF. LABEL CMP @#14,#$TRACE ;IS XDT ALREADY LOADED? BEQ 1000$ ; IF EQ - NO, ERROR MOV @#14,R0 ;GET ADDRESS OF XDT POOL BUFFER MOV #TRP014,R1 ;GET ADDRESS OF XDT TEMPLATE CMP (R0)+,(R1)+ ;PERFORM SIMPLE VERIFICATION BNE 1000$ ; IF NE - NO, ERROR CMP (R0)+,(R1)+ ;CONTINUE CHECK BNE 1000$ ; IF NE - NO, ERROR CMP (R0)+,(R1)+ ;CONTINUE CHECK BNE 1000$ ; IF NE - NO, ERROR CMP (R0)+,(R1)+ ;CONTINUE CHECK BEQ 2000$ ; IF EQ - ASSUME XDT POOL BUFFER 1000$: FATAL ;DECLARE FATAL ERROR ; ; CORRECT ADDRESS OF SYSTEM BUFFER TO ITS BEGINNING. ; 2000$: SUB #SYSBEG,R1 ;GET OFFSET FROM START SUB R1,R0 ;GET START OF SYSTEM BUFFER MOV R0,R5 ;COPY TO A SAFE REGISTER ; ; RESET BREAKPOINTS AND UNHOOK XDT FROM EXECUTIVE INTERRUPTS. ; SYSTEM 4000$ ;;ENTER SYSTEM STATE MTPS #PR7 ;;;DISABLE INTERRUPTS MOV @#KISAR6,-(SP) ;;;SAVE APR6 MOV @#KISDR6,-(SP) ;;;SAVE PDR6 MOV P.REL(R5),@#KISAR6 ;;;MAP XDT MOV #77406,@#KISDR6 ;;; ALL 4 KW MOV #ADR1,R0 ;;;GET ADDRESS OF BREAKPOINTS MOV #UIN,R1 ;;;GET BREAKPOINT INSTRUCTIONS MOV #8.,R2 ;;;GET LOOP COUNTER 3000$: MOV (R1)+,@(R0)+ ;;;RESTORE INSTRUCTION SOB R2,3000$ ;;; AND LOOP TILL DONE MOV #EXEADR,R0 ;;;GET EXECUTIVE TRAP TABLE MOV #SSTADR,R1 ;;;GET EXECUITVE TRAP ADDRESS MOV #7.,R2 ;;;GET LOOP COUNTER 3100$: MOV (R0)+,@(R1)+ ;;;RESTORE TRAP ADDRESS SOB R2,3100$ ;;; AND LOOP TILL DONE MOV (SP)+,@#KISDR6 ;;;RESTORE PDR6 MOV (SP)+,@#KISAR6 ;;;RESTORE APR6 MTPS #PR0 ;;;ENABLE INTERRUPTS RETURN ;;RETURN TO TASK STATE ; ; UNLOAD XDT FROM PARTITION. ; 4000$: BIT #PS.SYS,P.STAT(R5) ;IS PARTITION SYSTEM? BNE 5000$ ; IF NE - YES, GO HANDLE MOV P.MAIN(R5),R4 ;GET REAL PCB ADDRESS MOV P.MAIN(R4),R3 ;GET REAL MAIN PCB SYSTEM 6000$ ;;ENTER SYSTEM STATE MOV P.STAT(R5),P.STAT(R4) ;;RESTORE PARTITION FLAGS BICB P.BUSY+0(R4),P.BUSY+1(R4) ;;MARK PCB NOT BUSY BICB P.BUSY+0(R4),P.BUSY+1(R3) ;;MARK MAIN PCB NOT BUSY RETURN ;;RETURN TO TASK STATE ; ; UNLOAD XDT FROM SYSTEM PARTITION ; 5000$: SYSTEM 6000$ ;;ENTER SYSTEM STATE MOV P.MAIN(R5),R4 ;;GET MAIN PCB ADDRESS 5100$: CMP P.SUB(R4),R5 ;;IS NEXT PCB US? BEQ 5200$ ;; IF EQ - YES, CONTINUE MOV P.SUB(R4),R4 ;;GET NEXT PCB BR 5100$ ;; AND CONTINUE 5200$: MOV P.SUB(R5),P.SUB(R4) ;;UNLINK OURSELVES FROM CHAIN RETURN ;;RETURN TO SYSTEM STATE ; ; RETURN XDT BUFFER TO POOL. ; 6000$: SYSTEM 7000$ ;;ENTER SYSTEM STATE MOV R5,R0 ;;COPY BUFFER ADDRESS MOV #SYSSIZ,R1 ;;GET SIZE OF BUFFER CALLR $DEACB ;;RETURN BUFFER TO POOL ; ; ALL DONE, RETURN TO CALLER. ; 7000$: RETURN ;RETURN .END