;UN.BSH DEFINED GIVES A PROGRAM TO UNBASH RSX11M AGAIN AFTER ;RUNNING THE BASH PROGRAM. .IF NDF,UN.BSH .TITLE BSH11M ;BASH RSX11M FOR PREV KNL MODE .IFF .TITLE UBSHM ;UNBASH RSX11M FROM BSH11M .ENDC .IDENT /GCE001/ ;GLENN EVERHART, 7/24/1981 .IF NDF,UN.BSH PUMSK=170000 PKMSK=140000 .IFF PUMSK=140000 ;BASHED "PREV USER" PSW PKMSK=170000 ;BASHED "PREV KNL PSW" FOR TEMPLATES .ENDC ; SET UP FOR RSX11M V3.2 MAPPED ;THIS ROUTINE IS INTENDED TO BE BYILT PRIVILEGED AND ;MAPPED TO RSX11M (/PR:4 OR /PR:5) AND WILL FIND THE REFERENCES ;TO "PMODE" IN THE RSX11M EXECUTIVE AND ARRANGE ALL TASKS TO ;HAVE PREVIOUS KERNEL MODE PSWS LOADED WHENEVER RSX GENERATES ; A NEW PSW. NOTE THAT ZAPPING INITIAL PSWS AFTER TASK INSTALLATION ;IS STILL NEEDED. (ZAP THEM ON DISK). ; ; ; NOTE THAT RSX11M+ IS SUFFICIENTLY SIMILAR TO RSX11M THAT A SIMPLE ;CONDITIONAL (MTPI/MFPI VS MTPD/MFPD) WILL ALLOW THIS ROUTINE TO ;WORK FOR RSX11M+ TOO. FOR ANY PROGRAM TO USE THESE SERVICES IT IS ; NECESSARY EITHER: ; ; A: TO INSTALL THE TASK (SINCE INSTALL SETS THE INITIAL PSW IN THE ; TASK HEADER ON DISK) AND THEN ZAP (OR DDT OR WHATEVER) THE ; TASK HEADER'S INITIAL PSW WORD ON DISK TO HAVE THE PREVIOUS ; MODE KERNEL (140000 NORMALLY VS. 170000 FOR BOTH CURRENT AND ; PREVIOUS USER MODES AS IS NORMAL), OR ; B: HAVE THE TASK ISSUE ANY SST OR GET ANY AST AND RETURN FROM IT. THE ; PSW WILL THEN BE IN PREVIOUS KERNEL MODE. ; ; *** NOTE *** ; ; ON IAS OTHER ADDRESSES ARE NEEDED, BUT BE CAREFUL THERE TO SET THE ; 4000 BIT AS WELL (REGISTER SET) SINCE IAS USES REGISTER SET 1. ; ; TO ADAPT TO RSX11M+, REMOVE THE ";" IN NEXT LINE: ; K$$ID=0 ;DEFINE KERNEL I/D SPACE ; ;FOLOWING ARE CODE SEQUENCES SOUGHT: ; (NOTE: THIS PATCH WILL NOT BE MADE FOR RSX11M+ IF SUPER LIBS ; ARE INCLUDED... THE CODE IS NOT THERE AND USERS MAY BASH ; THEIR OWN "OLD PSW" ON STACK TO SET THEIR PSW AS THEY LIKE ; AFTER AST EXIT.) ;DRATX ;AFTER $DRATX DRATX: .IF NDF,K$$ID BIS #PUMSK,-(R3) BIC #PR7,(R3)+ ;4 WORDS TOTAL .IFF .IF NDF,UN.BSH BIS #50000,@R3 .IFF BIS #40000,@R3 .ENDC BMI 9$ .WORD 4767,1000 ; JSR PC,1000 ;4 WORDS NOW OK 9$: NOP .ENDC ; ;DRDSP PMODE ENTRY IS OK AS IS ;INITL PMODE ENTRY IS OK AS IS ;POWER PMODE ENTRY IS OK AS IS ; ;SSTSR ;AFTER $TRP04 SSTSR: .IF NDF,K$$ID MOV #PUMSK,@R4 RETURN ;3 WORDS TOTAL .IFF MOV #PUMSK,@R1 BIT #1,-(R4) ;USE 3 WORDS .ENDC ; ;IN SYSXT ; AFTER $NONSI SYSXT: MOV #PUMSK,@R1 MOV (R3)+,-(R1) ;3 WORDS TOTAL ; ;NOW HUNT UP ALL THESE POINTS AND FIX THEM UP. ;NOTICE 2ND WORD GETS CHANGED IN EACH CASE TO PKMSK (USER MODE, PREV KNL) TAST: TST (SP)+ MOV #140340,4(SP) ;STACK HAS DSW,PC,PS,... .MCALL ASTX$S ;BE SURE AST SERVICE MAPPED IN ASTX$S BASHM:: .IF DF,K$$ID .MCALL WSIG$S,MRKT$S,WTSE$S MRKT$S #1,#3,#1,#TAST WTSE$S #1 ;DO MARKTIME WITH AST. ;THE ABOVE MAKES IT LIKELY THAT THE AST EXIT ROUTINE WILL BE ;MAPPED INTO KERNEL SPACE FOR PATCH HERE. ; MOV @#177776,-(SP) MOV #140340,@#177776 ;;;SET NO INTS, PREV KERNEL MODE KIPAR0=172340 ;KNL I SPACE APR 0 UIPAR0=177640 ;USER I SPACE APR 0 UIPDR0=177600 ;USER I SPACE PDR 0 ;;;COPY KERNEL I APRS, PDRS INTO USER APRS. ;;; THIS IS NEEDED SINCE PRIVILEGED TASKS MAP INTO KERNEL D SPACE ;;; NATURALLY IN RSX11M+ AND WE NEED TO ALTER KERNEL I SPACE. SINCE ;;; WE CANNOT ALLOW RSX TO PUT US BACK INTO THE STANDARD CONTEXT, ;;; JUST TAKE NO CHANCES AND SET PREVIOUS KERNEL MODE PRIORITY 7 HERE ;;; (WE DON'T NEED PREV USER MODE AND MAY HAVE TO ALTER SOME DATA ;;; SPACES IF THE PROGRAM CHANGES) AND KEEP AT PRIO 7 UNTIL ;;; DONE DOING THE MODS. THE RSX11M VERSION CAN RUN NORMALLY SINCE ;;; THE PATCHES ARE 1 WORD IN PLACE AND INTERRUPTING THE PATCHING ;;; PROCESS WON'T MESS ANYTHING UP ANYWAY. ;;; ;;; SAVE USER APR5/PDR5 TOO MOV @#UIPAR0,-(SP) MOV @#UIPDR0,-(SP) MOV #KIPAR0,R0 MOV #UIPAR0,R1 MOV #6,R2 ;;;COPY APR0 THRU APR6 (24K) ;(NOTE THIS ASSUMES 20K EXEC AND 4K DIR COMMON MAPPED) 54$: MOV (R0)+,(R1)+ ;;;COPY AN APR SOB R2,54$ ;;;AND DO ALL 6 MOV #6,R2 MOV #77406,R0 ;;;4K R/W ACCESS MOV #UIPDR0,R1 ;;;PDR AREA 55$: MOV R0,(R1)+ ;;;SET 4K R/W ACCESS IN ALL KNL INST AREA SOB R2,55$ ;;;NOTICE WE DO 6 SINCE DRATX STUFF IS IN DIR11M MAPPED BY APR5. ;;; (MUST TASKBUILD STACK OF 4100 WORDS OR LARGER TO ALLOW US TO ;;; MAP OVER APR5 HERE!! .IFTF MOV #4,R0 ;WORDS TO DO MOV #$DRATX,R1 ;START ADDRESS MOV R1,R2 ;END ADDRESS ADD #1500.,R2 ;IS MUCH HIGHER MOV #DRATX,R3 ;R3=PATTERN JSR PC,LOCIT SUB #6,R1 ;POINT AT WORD .IFF MOV #PKMSK,@R1 ;ZAP RSX11M .IFT .IF NDF,UN.BSH .IF DF,DBB.. CMP @R1,#50000 ;RIGHT INST? BEQ 21$ ;YEA, DO MOV @R1,R0 ;LET REGS SHOW JUNK MOV @#-2,R2 MOV @#UIPAR0+2+2+2+2+2,R3 IOT ;CRASH!!!! ; 21$: .ENDC BIC #30000,@R1 .IFF .IF DF,DBB.. CMP @R1,#40000 ;RIGHT INST? BEQ 21$ ;YEA, DO MOV @R1,R0 ;LET REGS SHOW JUNK MOV @#-2,R2 MOV @#UIPAR0+2+2+2+2+2,R3 IOT ;CRASH!!!! ; 21$: .ENDC BIS #10000,@R1 .ENDC .IFTF MOV #3,R0 ;WORDS IN SEARCH PATTERN MOV #$TRP04,R1 ;START ADDRESS MOV R1,R2 ADD #10000,R2 ;END ADDRESS MOV #SSTSR,R3 ;R3=PATTERN JSR PC,LOCIT ;FIND PATTERN, R1=END ADDR+2 SUB #4,R1 ;POINT AT 2ND WORD OF PAT'N MOV #PKMSK,@R1 ;ZAP RSX11M MOV #$NONSI,R1 ;START ADDRESS MOV #3,R0 ;NO. WORDS TO DO MOV R1,R2 ;END ADDRESS ADD #14000,R2 ;IS FAR AWAY MOV #SYSXT,R3 ;R3=PATTERN JSR PC,LOCIT ;FIND THE END SUB #4,R1 ;POINT AT AREA TO ZAP MOV #PKMSK,@R1 ;ZAP IT AS NEEDED .IFT MOV (SP)+,@#UIPDR0 MOV (SP)+,@#UIPAR0 MOV (SP)+,@#177776 ;RE-ENABLE INTERRUPTS ; NOTE: WE DON'T BOTHER RESTORING USER MODE PAR/PDRS SINCE ; THIS TASK IS DONE WITH THEM AND WILL NOW EXIT. RSX WON'T TRY ; TO RE USE THESE SETTINGS ANYWAY, SO NO BOTHER IF THEY ; CHANGE. .ENDC ;K$$ID .MCALL EXIT$S EXIT$S ;GO BACK TO RSX11M ; ;LOCIT -- FIND PATTERN ; ENTRY R0=# WORDS IN PATTERN, R1=START ADDR TO LOOK, R2=END ADDR ; R3=PATTERN MASK ADDRESS ; EXIT R1=END + 2 OF PATTERN LOCIT: MOV R1,R4 ;COPY LENGTH, START MOV R3,R5 ;COPY PATTERN LOC'N LLP: CMP (R1)+,(R3) ;SEE IF HAVE 1ST WORD BEQ 1$ ;IF GOT IT CHECK REST CMP R1,R2 ;PAST END? BLO LLP ;IF NOT GO ON BR 999$ 1$: TST (R3)+ MOV R0,-(SP) ;SAVE PATTERN LENGTH DEC R0 ;COUNT DOWN WORDS TO TEST MOV R1,-(SP) ;SAVE START ADDRESS 2$: CMP (R1)+,(R3)+ ;SAME PATTERN? BNE 3$ ;IF NOT, RESET SEARCH FOR 1ST WORD DEC R0 BGT 2$ ;IF ALIKE COUNT DOWN TILL ALL DONE CMP (SP)+,(SP)+ ;FIX STACK ; ALL WENT OK SO WE NOW HAVE THE PATTERN BR 998$ 3$: MOV R5,R3 ;POINT AT START OF PATTERN AGAIN MOV (SP)+,R1 ;RESET ADDRESS MOV (SP)+,R0 ;AND PATTERN LENGTH BR LLP ;THEN GO BACK, LOOK FOR 1ST WORD OF PATTERN 999$: MOV #6,R1 ;4 IS HARMLESS AREA. SO IS 6. (0 OR 2) 998$: ;HERE R1 IS END OF PATTERN + 2 RTS PC .END BASHM