.TITLE CATPRV - CATCHALL PRIVILEGED ROUTINES .IDENT /2.0/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided or ; otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: CATPRV.MAC ; Author: Robin Miller ; Date: September 22, 1982 ; ; Description: ; ; This module conatins the privileged commands for Catchall. ; ; This module must be assembled with LB:[1,1]EXEMC.MLB to define the ; TCB and UCB offsets, and with LB:[1,1]RSXMC.MAC to define the $SWSTK ; (switch to system state) macro. ; ; Modification History: ; ; September 10, 1984 by Robin Miller. ; Added check for redirection when looking at the terminal UCB. ; ; September 10, 1984 by Robin Miller. ; Change booting of [1,51]DSCSYS to [6,54]BRUSYS for RSX-11M+. ; ;- .NLIST BEX .IF NDF DEBUG ; DON'T ASSEMBLE IF DEBUGGING .MCALL TCBDF$, UCBDF$, HDRDF$ TCBDF$ ; DEFINE TASK CONTROL BLOCK OFFSETS UCBDF$ ; DEFINE UNIT CONTROL BLOCK OFFSETS HDRDF$ ; DEFINE FILE HEADER BLOCK OFFSETS .ENDC ; END DEBUG CONDITIONAL ; Local storage: BRUM1: .ASCIZ "MOU LB0:/OVR" BRUM2: .ASCIZ "BOOT LB0:[6,54]BRUSYS" .EVEN MOUFLG: .WORD 0 ; LB0: MOUNTED FLAG -1 = MOUNTED .SBTTL CKEXEC -- CHECK FOR CORRECT EXECUTIVE ;+ ; ; CKEXEC - Check for correct Executive. ; ; This routine checks a series of locations in the Executive starting ; at label $BTMSK. There are 16 words which will be checked. Each ; word corresponds to a bit position. For example, word 0 = 1, ; word 1 = 2, word 2 = 4, word 3 = 10, etc. ; ; Inputs: ; None ; ; Outputs: ; Returns if correct Executive, else an error message is displayed, ; and Catchall exits with a severe error code. ; ;- CKEXEC:: .IF DF DEBUG ; ASSEMBLE IF DEBUGGING RETURN ; ALWAYS RETURN SINCE WE ; CAN'T ACCESS $BTMSK .IFF MOV #1,R0 ; SET FOR BIT 0 MOV #$BTMSK,R1 ; SET BIT MAP LOCATION MOV #16.,R2 ; SET LOOP COUNT 10$: CMP R0,(R1)+ ; MATCH ? BNE 20$ ; IF NE, NO ASL R0 ; SET FOR NEXT BIT SOB R2,10$ ; LOOP TILL DONE RETURN ; MADE IT 20$: WRTMSG WRONG, JMP EXISEV ; EXIT WITH SEVERE ERROR .ENDC ; END DEBUG CONDITIONAL .SBTTL BYE - LOGOUT THE USERS TERMINAL ;+ ; ; BYE - Logout the users terminal. ; ; This routine is called to logout a users terminal. If the terminal ; is TT0:, logoff is refused. ; ;- .ENABL LSB BYE:: TSTB LUNBUF+G.LUNU ; IS THIS TERMINAL TT0: ? BNE 10$ ; IF NE, NO (CONTINUE...) WRTMSG LOGMSG, JMP EXIERR ; AND EXIT WITH ERROR 10$: RETURN .DSABL LSB .SBTTL PSDI -- SPECIAL COMMAND FOR PSDI ;+ ; ; PSDI -- Special command for PSDI to set terminal privileged. ; ;- WIPE: .ASCII "XXXXXX"" " WIPSIZ = .-WIPE VWIPE: .ASCII "[K""[A" ; Clear the "PSDI" line. VWIPES = .-VWIPE .EVEN WIPCNT:.WORD WIPSIZ ; Size of wipe out message VWIPEC:.WORD VWIPES ; Size of wipe for VT100. PSDI:: .IF NDF DEBUG ; DON'T ASSEMBLE IF DEBUGGING CALL $SWSTK,10$ ; SWITCH TO SYSTEM STATE MOV $TKTCB,R0 ;; GET OUR TCB ADDRESS MOV T.UCB(R0),R0 ;; GET OUT TI: UCB ADDRESS 5$: MOV U.RED(R0),R0 ;; Follow the redirect pointer. CMP R0,U.RED(R0) ;; End of redirect list ? BNE 5$ ;; If NE, no. MOV U.UIC(R0),U.LUIC(R0) ;; MAKE LOGIN & DEFAULT UIC'S SAME BIS #U2.PRV,U.CW2(R0) ;; SET THE TERMINAL PRIVILEGED RETURN ;; RETURN TO USER STATE .ENDC ; END DEBUG CONDITIONAL 10$: BIT #S.EMCR,STATUS ; ARE WE EXITING TO THE MCR ? BEQ 30$ ; IF EQ, NO (PRESUME INDIRECT) MOV #WIPE,R0 ; SET TO OVERWRITE 'PSDI' MOV WIPCNT,R1 ; COPY THE BYTE COUNT MOVB #'+,VFC ; SET FOR OVERPRINT BIT #S.VFAM,STATUS ; VT100 FAMILY TERMINAL ? BEQ 20$ ; IF EQ, NO MOV #VWIPE,R0 ; SET TO OVERWRITE 'PSDI' MOV VWIPEC,R1 ; COPY THE BYTE COUNT 20$: CALL WRITE ; OVERPRINT 'PSDI' 30$: JMP EXISUC ; AND EXIT WITH SUCCESS .SBTTL SHUTUP -- SHUTDOWN THE SYSTEM ;+ ; ; SHUTUP - Shutdown the system. ; ; This routine allows a non-privileged user to run SHUTUP from TT0:. ; ;- .ENABL LSB SHUTUP:: TSTB LUNBUF+G.LUNU ; IS THIS TT0: ? BEQ 10$ ; IF EQ, YES (THIS IS OK) WRTMSG SHUMSG, JMP EXIERR ; AND EXIT WITH ERROR 10$: RETURN .DSABL LSB .SBTTL BRUSYS -- BOOTS BRUSYS INTO MEMORY FOR BACKUP ;+ ; ; BRUSYS - Boot BRUSYS into memory for performing backups. ; ; This command is being added so that non-privileged TT0: can be ; used to boot BRUSYS into memory after shutting the system down. ; The system disk (LB0:) must be dismounted or the command is refused. ; ;- .ENABL LSB BRUSYS::TSTB LUNBUF+G.LUNU ; IS THIS TERMINAL TT0: ? BEQ 10$ ; IF EQ, YES WRTMSG BRUMS1, JMP EXIERR ; AND EXIT WITH ERROR 10$: MOV #-1,MOUFLG ; PRESUME DISK IS MOUNTED .IF NDF DEBUG ; DON'T ASSEMBLE IF DEBUGGING CALL $SWSTK,40$ ; SWITCH TO SYSTEM STATE MOV #.LB0,R0 ;; GET THE UCB FOR LB0: MOV U.RED(R0),R0 ;; GET UCB REDIRECTED TO BITB #US.MNT,U.CTL+1(R0) ;; IS THE DISK MOUNTED ? BEQ 20$ ;; IF EQ, YES CLR MOUFLG ;; SHOW DISK IS DISMOUNTED 20$: RETURN ;; RETURN TO USER STATE .ENDC ; END DEBUG CONDITIONAL 40$: TST MOUFLG ; IS THE DISK MOUNTED ? BEQ 50$ ; IF EQ, NO (CONTINUE) WRTMSG BRUMS2, JMP EXISEV ; AND EXIT WITH SEVERE ERROR 50$: MOV #BRUM1,R0 ; SET TO SPAWN "MOU LB:/OVR" CALL MOVE ; GO DO IT CALL SPAWN ; SPAWN THE COMMAND LINE CMP R0,#EX$SUC ; WAS MOUNT SUCCESSFUL ? BEQ 60$ ; IF EQ, YES JMP EXST ; NO, EXIT WITH STATUS 60$: MOV #BRUM2,R0 ; SET TO MOVE "BOO LB:[6,54]BRUSYS" CALL MOVE ; GO DO IT CALL SPAWN ; GO SPAWN IT (SHOULDN'T RETURN) JMP EXST ; EXIT WITH STATUS .DSABL LSB .SBTTL CHKPRV - Determine If Terminal Is Privileged ;+ ; ; CHKPRV - Determine if terminal is privileged. ; ; This routine sets bit S.PRIV in the STATUS word if the terminal is ; privileged when catchall is started. This bit is checked later to ; determine if the terminal needs to be set privileged if the command ; requires privileges to execute (B.PRIV in offset O.STAT). ; ; This routine also sets bit S.EMCR in the STATUS word if this task is ; exiting to the MCR. This bit is used in spawn to determine if a ; should be appended to the command line to force an MCR prompt. ; ; Inputs: ; None ; ; Outputs: ; All registers are preserved. ; ;- CHKPRV::JSR R2,$SAVVR ; SAVE R0 - R2 .IF NDF DEBUG ; DON'T ASSEMBLE IF DEBUGGING MOV $TKTCB,R0 ; GET OUR TCB ADDRESS BIT #T3.MCR,T.ST3(R0) ; ARE WE EXITING TO THE MCR ? BEQ 10$ ; IF EQ, NO BIS #S.EMCR,STATUS ; YES, SHOW THAT WE ARE 10$: MOV T.UCB(R0),R0 ; GET TI: UCB ADDRESS 15$: MOV U.RED(R0),R0 ; Follow the redirect pointer. CMP R0,U.RED(R0) ; End of redirect list ? BNE 15$ ; If NE, no. BIT #U2.PRV,U.CW2(R0) ; IS THE TERMINAL PRIVILEGED BEQ 20$ ; IF EQ, NO BIS #S.PRIV,STATUS ; SHOW TERMINAL IS PRIVILEGED .ENDC ; END DEBUG CONDITIONAL 20$: RETURN .SBTTL SETPRV -- SET NON-PRIVILEGED TERMINAL PRIVILEGED ;+ ; ; SETPRV - Set non-privileged terminal privileged. ; ; This routine is called to temporarily set the users terminal privileged ; so that a privileged command can be spawned to it. If the terminal was ; set privileged, bit S.SPRV is set in the STATUS word to show the terminal ; must be reset back to non-privileged. ; ; Inputs: ; None. ; ; Outputs: ; All registers are preserved. ; ;- SETPRV::JSR R2,$SAVVR ; SAVE R0 - R2 TST STATUS ; IS DEBUGGING OUTPUT ENABLED ? BMI 10$ ; IF MI, YES BIT #S.PRIV,STATUS ; IS TERMINAL ALREADY PRIVILEGED ? BNE 10$ ; IF NE, YES .IF NDF DEBUG ; DON'T ASSEMBLE IF DEBUGGING CALL $SWSTK,10$ ; SWITCH TO SYSTEM STATE MOV $TKTCB,R0 ;; GET OUR TCB ADDRESS MOV T.UCB(R0),R0 ;; GET OUR TI: UCB ADDRESS 5$: MOV U.RED(R0),R0 ;; Follow the redirect pointer. CMP R0,U.RED(R0) ;; End of redirect list ? BNE 5$ ;; If NE, no. BIS #U2.PRV,U.CW2(R0) ;; SET THE TERMINAL PRIVILEGED BIS #S.SPRV,STATUS ;; SHOW TERMINAL SET PRIVILEGED RETURN ;; RETURN TO USER STATE .ENDC ; END DEBUG CONDITIONAL 10$: RETURN .SBTTL NOPRIV - SET TERMINAL NON-PRIVILEGED ;+ ; ; NOPRIV - Set terminal non-privileged. ; ; This routine resets a terminal back to non-privileged if it was ; temporarily set privileged to execute a privileged task. ; ;- NOPRIV::JSR R2,$SAVVR ; SAVE R0 - R2 BIT #S.SPRV,STATUS ; WAS TERMINAL SET PRIVILEGED ? BEQ 10$ ; IF EQ, NO BIC #S.SPRV,STATUS ; RESET INCASE ANOTHER COMMAND .IF NDF DEBUG ; DON'T ASSEMBLE IF DEBUGGING CALL $SWSTK,10$ ; SWITCH TO SYSTEM STATE MOV $TKTCB,R0 ;; GET OUR TCB ADDRESS MOV T.UCB(R0),R0 ;; GET OUR TI: UCB ADDRESS 5$: MOV U.RED(R0),R0 ;; Follow the redirect pointer. CMP R0,U.RED(R0) ;; End of redirect list ? BNE 5$ ;; If NE, no. BIC #U2.PRV,U.CW2(R0) ;; RESET TERMINAL TO NON-PRIVILEGED RETURN ;; RETURN TO USER STATE .ENDC ; END DEBUG CONDITIONAL 10$: RETURN .SBTTL QUIET - SET TO EXIT QUIETLY ;+ ; ; QUIET - Set to exit quietly. ; ; This routine inhibits the MCR prompt by clearing T3.MCR in the TCB. ; ;- QUIET:: JSR R2,$SAVVR ; SAVE R0 - R2 .IF NDF DEBUG ; DON'T ASSEMBLE IF DEBUGGING CALL $SWSTK,10$ ; SWITCH TO SYSTEM STATE MOV $TKTCB,R0 ;; GET OUR TCB ADDRESS BIC #T3.MCR,T.ST3(R0) ;; INHIBIT MCR PROMPT ON EXIT RETURN ;; RETURN TO USER STATE .ENDC ; END DEBUG CONDITIONAL 10$: RETURN ; Subroutine to force an MCR prompt when Catchall exits. NQUIET::JSR R2,$SAVVR ; SAVE R0 - R2 .IF NDF DEBUG ; DON'T ASSEMBLE IF DEBUGGING CALL $SWSTK,10$ ; SWITCH TO SYSTEM STATE MOV $TKTCB,R0 ;; GET OUR TCB ADDRESS BIS #T3.MCR,T.ST3(R0) ;; FORCE AN MCR PROMPT ON EXIT RETURN ;; RETURN TO USER STATE .ENDC ; END DEBUG CONDITIONAL 10$: RETURN .END