.TITLE $INSHD - INSTALL HEADER ROUTINE .IDENT /03.1/ ;HJL050 ; ;**-1 ; COPYRIGHT (C) 1974, 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE ; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION: 02 ; BY: H. LEV ; DATE: 10/02/73 ; MODIFIED: 12/10/74 ADD LOGICAL DEVICE ASSIGNMENT ; 3/10/75 CHANGE DEVICE ASSIGNMENT TO USE ALUN$ ; ; HJL002 9/19/75 ADD MULTI-USER PROTECTION SUPPORT ; ; HJL005 10/30/75 CHANGES TO WRITE TASK FILE ID INTO TASK ; HEADER TO BE ABLE TO SUPPORT DISK COMPRESSION ; ; HJL025 3/12/76 CHANGE PCB, TCB, AND TASK HEADER FORMAT ; 6/8/76 ADD DEFAULT PRIORITY TO TCB ; ; ; HJL050 13-JAN-77 ADD $CLIPT AND U.CLI SUPPORT ;HJL050 ; ; JGD02 29-MAY-77 CHECKS PRIVLEGE MASK WORD(BIT 2, U.PRV1) TO ; SEE IF USER IS ALLOWED TO A)RUN TASKS OR ; B)RUN TASKS ONLY OWNED BY HIS UIC. THE ; EXCEPTION TO THIS IS THAT ANY TASK BUILT WITH ; UIC=[377,377] OR [200,200] MAY BE RUN BY ANY ; USER. SINCE TKB AND FTB DEFAULT TO THE USER'S UIC ; FOR TASK OWNERSHIP, NOT ONLY IS THE USER PREVENTED ; FROM RUNNING CRITICAL SYSTEM TASKS, BUT ALSO FROM ; RUNNING TASKS BUILT BY OTHER NON PRIVLEGED USERS, ; UNLESS THE OTHER'S TASK IS EXPLICITLY BUILT WITH THE ; UIC=[200,200] SWITCH. ; ;HJL050 ; JAK002 14-JUN-77 FLAG CLI FLAG IN T.ST3 ;HJL050 ; ;HJL050 ; ;HJL050 ; ; THIS MODULE READS AND FILLS IN THE TASK HEADER FOR THE ; INSTALL MCR COMMAND .MCALL ALUN$,CALL,DEVDF$,DIR$,HDRDF$,RETURN,TCBDF$,UCBDF$ ; JGD02 DEVDF$ ; DEFINE DCB, UCB, AND SCB OFFSETS HDRDF$ ; DEFINE TASK HEADER OFFSETS TCBDF$ ; DEFINE TCB OFFSETS UCBDF$ ; JGD02 .IFNDF D$$H11&D$$J11&D$$M11&D$$ZMD&D$$Z11 ; JGD02 U.PRV1=U.CW3 ; FOR SYSTEMS WITH ONLY DL11'S ; JGD02 .IFF ; JGD02 U.PRV1=U.LUIC-2 ; FOR SYSTEMS WITH MULTIPLEXERS ; JGD02 .ENDC ; JGD02 ; ; LOCAL DATA ; LUN3 = 3 ; DEVICE ASSIGNMENT LUN ; ALUN: ALUN$ LUN3,XX,0 ; ASSIGN LUN DPB PRVMSK: .WORD 0 ; PRIVLEGE MASK ; JGD02 LUIC: .WORD 0 ; UIC OF FILE OWNER(LOGON UIC) ; JGD02 .SBTTL LOCAL DATA ERR1: .ASCIZ <15>/INS -- ILLEGAL UIC/ ERR2: .ASCIZ <15>/INS -- TOO MANY LUNS/ ERR3: .ASCIZ <15>%INS -- ILLEGAL DEVICE % ERR4: .ASCIZ <15>/INS -- PRIVLEGE VIOLATION - RUN COMMAND NOT ALLOWED/ ; JGD02 ERR5: .ASCIZ <15>/INS -- PRIVLEGE VIOLATION - TASK OWNERSHIP/ ; JGD02 .EVEN TSKTB: .RAD50 /...MCR/ ; ;HJL050 .WORD $MCRPT ; ;HJL050 ;HJL050 .IF DF C$$LIS ;HJL050 ;HJL050 .RAD50 /...DCL/ ; ;HJL050 .WORD $CLIPT ; ;HJL050 ;HJL050 .IFTF ;HJL050 ;HJL050 .RAD50 /SHF.../ ; ;HJL050 .WORD $SHFPT ; ;HJL050 .RAD50 /TKTN / ; ;HJL050 .WORD $TKNPT ; ;HJL050 .WORD 0 ; END OF TABLE ;HJL050 ; ;+ ; *** - $INSHD MCR INSTALL COMMAND HEADER OVERLAY ; THIS OVERLAY VERIFIES THE TASK HEADER, SETS THE ; LUN ASSIGNMENT IN THE HEADER AND WRITES THE ; MODIFIED HEAD BACK TO DISK. IT RECEIVES CONTROL ; FROM $INSLB WHICH READS THE 1ST RECORD OF ; THE LABEL BLOCK AND HEADER BLOCK INTO CORE AND ; SETS UP THE PCB POINTERS IN THE HEADER. ALSO ; A TCB HAS BEEN ALLOCATED AND IS FILLED IN. ; ;- $INSHD::MOV #$LBLBF,R0 ; SET BUFFER POINTER MOV R0,R5 ; SAVE LABEL BLOCK ADDRESS MOV #$LBLBN,R1 ; GET ADDRESS OF LOGICAL BLOCK NUMBER ADD #1,(R1) ; POINT TO ADC 2(R1) ; SECOND BLOCK OF LABEL CALL $READ ; READ 2ND RECORD OF LABEL BLOCK CALL PRIVCK ; CHECK RUN PRIVLEGES ALLOWED ; JGD02 MOV #$HDRBF,R4 ; GET HEADER BLOCK ADDRESS TST $UIC ; IS UIC DEFINED ON COMMAND? BEQ 10$ ; NO MOV $UIC,H.CUIC(R4) ; SET DEFAULT UIC BR 20$ ; SKIP 10$: MOV H.DUIC(R4),H.CUIC(R4) ; SET CURRENT UIC FROM DEFAULT UIC 20$: TSTB H.CUIC(R4) ; IS UIC VALID? BEQ 30$ ; NO TSTB H.CUIC+1(R4) ; MAYBE BEQ 30$ ; DEFINITELY NO MOV H.NLUN(R4),R3 ; GET NUMBER OF LUNS CMP R3,#255. ; VALID NUMBER? BHI 32$ ; NO ADD #H.LUN,R4 ; POINT TO FIRST LUN TST R3 ; ANY LUNS? BEQ 90$ ; NO, NO NEED TO ASSIGN THEM BR 40$ ; SKIP AROUND JUMPS 30$: JMP INSHD1 ; ILLEGAL UIC 32$: JMP INSHD2 ; TOO MANY LUNS ; ; GET NEXT LUN AND ASSIGN IT ; 40$: TST (R5) ; IS LUN DEFINED? BNE 42$ ; YES, THEN GO SEARCH DEVICE TABLE CLR (R4)+ ; UPDATE LUN POINTER BR 85$ ; 42$: CMP (R5),#"OV ; OVERLAY PSUEDO DEVICE? BNE 50$ ; NO MOV $TCB,R0 ; YES, GET TASK LOAD MOV T.LDV(R0),R2 ; DEVICE UCB ADDRESS FROM TCB BR 80$ ; 50$: MOV (R5),ALUN+A.LUNA ; SET DEVICE NAME MOV 2(R5),ALUN+A.LUNU ; AND UNIT DIR$ #ALUN ; ASSIGN LUN BCS 55$ ; DPB ERROR TST $DSW ; ANY ERRORS? BPL 60$ ; NO 55$: CALL INSHD3 ; YES, ILLEGAL DEVICE CLR (R4)+ ; DON'T ASSIGN IT BR 85$ ; 60$: CALL $SWSTK,80$ ; SWITCH TO SYSTEM STATE MOV $HEADR,R2 ; GET TASK HEADER ADDRESS MOV H.LUN+<*4>(R2),6(SP) ; SET UCB ADDRESS IN R2 RETURN ; RETURN TO USER STATE 80$: MOV R2,(R4)+ ; PUT UCB ADDRESS IN HEADER LUT 85$: CALL $RDHDR ; UPDATE HEADER POINTER CLR (R4)+ ; UPDATE HEADER POINTER CALL $RDHDR ; UPDATE HEADER POINTER TST (R5)+ ; UPDATE LABEL POINTER CALL RDLBL ; READ LABEL BLOCK IF NECESSARY TST (R5)+ ; UPDATE LABEL POINTER CALL RDLBL ; READ LABEL BLOCK IF NECESSARY DEC R3 ; ALL UNITS ASSIGNED? BNE 40$ ; NO, DO NEXT ONE 90$: MOV (R4)+,R3 ; GET COUNT OF WINDOW BLOCKS 92$: ADD #W.BLGH,R4 ; SKIP OVER ALL WINDOWS DEC R3 ; DONE? BGT 92$ ; NO, LOOP UNTIL DONE CALL $RDHDR ; UPDATE HEADER BLOCK MOV #$FDB,R5 ; GET FDB ADDRESS MOV F.FNB(R5),(R4)+ ; MOVE IN FILE ID CALL $RDHDR ; MOV F.FNB+2(R5),(R4)+ ; MOVE IN FILE SEQUENCE NUMBER CALL $RDHDR ; MOV F.FNB+4(R5),(R4)+ ; MOVE IN VOLUME SEQUENCE NUMBER CMP (R4)+,(R4)+ ; SKIP TO AREA FOR TASK NAME CALL $RDHDR ; MOV $TCB,R5 ; GET ADDRESS OF TCB MOV T.NAM+2(R5),(R4)+ ; STORE SECOND PART IN R2 CALL $RDHDR ; MOV T.NAM(R5),(R4)+ ; STORE FIRST PART IN R1 ADD #512.,R4 ; FORCE WRITE OF TASK HEADER CALL $RDHDR ; AND DO IT ; ; INSERT TCB INTO STD ; 981$: MOV $TCB,R0 ; GET TCB ADDRESS MOV R0,R1 ; COPY TCB ADDRESS MOV R0,R2 ; TWICE ADD #T.RCVL,R1 ; SET ADDRESS OF RECIEVE LIST HEAD ADD #T.ASTL,R2 ; SET ADDRESS OF AST LIST HEAD MOV R1,T.RCVL+2(R0) ; SET RECIEVE LIST BACK POINTER MOV R2,T.ASTL+2(R0) ; SET AST LIST BACK POINTER BIT #FE.PLA,$FMASK ; PLAS SUPPORTED? BEQ 985$ ; NO MOV R0,R1 ; GET ADDRESS OF ATTACHMENT LIST HEAD ADD #T.ATT,R1 ; MOV R1,T.ATT+2(R0) ; AND SET BACK POINTER MOV R0,R1 ; GET ADDRESS OF RECEIVE BY ADD #T.RRFL,R1 ; REFERENCE LIST HEAD MOV R1,T.RRFL+2(R0) ; SET BACK POINTER TO IT 985$: BIS #TS.OUT!TS.EXE,T.STAT(R0) ; SET OUT AND NOT EXECUTING BIS #T3.PMD,T.ST3(R0) ; SET NO PMD BIT #100,$FLGS ; POST MORTEM DUMP REQUESTED? BNE 99$ ; NO BIC #T3.PMD,T.ST3(R0) ; YES, CLEAR BLOCKING BIT 99$: CALL $SWSTK,180$ ; SWITCH TO SYSTEM STACK MOV #$TSKHD,R1 ; GET POINTER TO TCBS SUB #T.TCBL,R1 ; FAKE IT OUT TO LOOK LIKE REAL TCB 100$: MOV T.TCBL(R1),R2 ; POINT TO NEXT TCB TST T.TCBL(R2) ; IS THIS THE NULL TASK TCB? BEQ 110$ ; YES, SO INSERT NEW TASK BEFORE IT. CMPB T.DPRI(R0),T.DPRI(R2) ; NEW TASK PRI > THIS ONE? BHI 110$ ; YES MOV R2,R1 ; NO, MAKE CURRENT TCB INTO PREVIOUS ONE BR 100$ ; LOOP 110$: MOV R2,T.TCBL(R0) ; SET NEW TCB TO POINT TO CURRENT TCB MOV R0,T.TCBL(R1) ; SET PREVIOUS TCB TO POINT TO NEW TCB. 120$: MOV #TSKTB,R1 ; GET ADDRESS OF SPECIAL TASK NAME TABLE ;HJL050 125$: TST (R1) ; END OF TABLE? ;HJL050 BEQ 150$ ; YES ;HJL050 CMP T.NAM(R0),(R1) ; NO, NAMES THE SAME? ;HJL050 BNE 127$ ; NO ;HJL050 CMP T.NAM+2(R0),2(R1) ; MAYBE ;HJL050 BEQ 130$ ; YES ;HJL050 127$: ADD #6,R1 ; NO, GET ADDRESS OF NEXT ENTRY ;HJL050 BR 125$ ; LOOP ;HJL050 ;HJL050 .IFT ;HJL050 ;HJL050 130$: CMP 4(R1),#$CLIPT ; IS THIS DCLS TCB POINTER? ;HJL050 BNE 140$ ; NO ;HJL050 BIS #T3.CLI,T.ST3(R0) ; FLAG AS CLI ;JAK002 BIT #FE.MUP,$FMASK ; YES, MULTI-USER PROTECTION SUPPORTED? ;HJL050 BEQ 150$ ; NO, DON'T SET POINTER ;HJL050 ;HJL050 .IFF ;HJL050 ;HJL050 130$: ;HJL050 ;HJL050 .ENDC ;HJL050 ;HJL050 140$: MOV R0,@4(R1) ; SET UP ADDRESS OF TASK ;HJL050 150$: BIT #2,$FLGS ; RUN TASK NOW? ;**-25 BEQ 180$ ; NO MOV R0,-(SP) ; SAVE TCB ADDRESS MOV $TKTCB,R2 ; GET OUR TCB ADDRESS MOV T.UCB(R2),R2 ; GET TI TO USE FOR THIS TASK MOV $UIC,R1 ; GET SPECIFIED UIC IF ANY BNE 160$ ; GO IT MOV U.UIC(R2),R1 ; OTHERWISE DEFAULT TO TI UIC 160$: MOV R1,R3 ; COPY UIC BIT #FE.MUP,$FMASK ; MULTI-USER PROTECTION? BEQ 167$ ; NO BIT #U2.PRV,U.CW2(R2) ; YES, IS THIS PRIVILEGED USER? BNE 167$ ; YES, USE R1 AS PROTECTION UIC MOV U.LUIC(R2),R1 ; NO, GET LOGIN UIC FOR PROTECTION 167$: CALL $TSKRP ; REQUEST TASK WITH PROTECTION MOV (SP)+,R0 ; RETRIEVE TCB ADDRESS BIT #4,$FLGS ; REMOVE AFTER RUN? BEQ 170$ ; NO BIS #T3.REM,T.ST3(R0) ; YES, SET REMOVE ON EXIT FLAG 170$: BIT #20,$FLGS ; ESCAPE TERMINATE COMMAND? BEQ 180$ ; NO BIS #T3.MCR,T.ST3(R0) ; YES, SET TO PROMPT ON EXIT 180$: RETURN ; RETURN TO USER STATE AND ROOT .SBTTL SUBROUTINES ;+ ; *** - RDLBL - READ NEXT RECORD OF LABEL IF END OF BUFFER HAS ; BEEN REACHED. ; ; THIS ROUTINE READS THE NEXT BLOCK OF THE HEADER IN ; ; IF THE BUFFER POINTER POINTS BEYOND THE BUFFER ; ; INPUT: ; R5 - BUFFER POINTER, POINTS TO NEXT LOCATION IN BUFFER ; ; OUTPUT: ; R5 - POINTS TO NEXT LOCATION IN BUFFER ; (UPDATED IF READ, LEFT ALONE IF NOT) ; ;- RDLBL: CMP R5,#$LBLBF+512. ; LABEL BLOCK EMTPY? BLO 10$ ; NO MOV #$LBLBF,R0 ; YES, GET BUFFER ADDRESS MOV R0,R5 ; MOV #$LBLBN,R1 ; READ IN ADD #1,(R1) ; POINT TO NEXT ADC 2(R1) ; LABEL BLOCK CALL $READ ; 10$: RETURN ; ;+ ; JGD02 ; *** - PRIVCK - CHECK U.PRV1 IN THE TERMINALS UCB TO SEE WHICH(IF ANY) ; JGD02 ; RUN PRIVLEGES ARE ALLOWED. AT PRESENT TWO FLAVORS ; JGD02 ; EXIST AND ARE DEFINED BY BITS IN PRVMSK. ; JGD02 ; ; JGD02 ; DEFINITION OF PRVMSK, THE ACCESS RIGHTS PRIVLEDGE MASK ; JGD02 ; ; JGD02 ; BIT 00 ALL RUN PRIVLEGES ARE DENIED ; JGD02 ; ; JGD02 ; BIT 01 RUN PRIVLEGES ARE ALLOWED IF AND ONLY IF THE DEFAULT PROTECTION ; JGD02 ; UIC DEFINED BY U.LUIC IN THE TERMINAL UIC, IS EQUAL TO THE ; JGD02 ; DEFAULT TASK UIC(H.DUIC) WHICH IS SET EITHER BY THE UIC OPTION ; JGD02 ; AT TASK BUILD(BIGTKB) OR SET TO THE TERMINAL'S U.LUIC AT TASK- ; JGD02 ; BUILD(AS BY FTB) IF THE UIC OPTION OMITTED ; JGD02 ; ; JGD02 ; BIT 02 IMMEDIATELY ACTIVATE TASK XXXXXX UPON EXIT FROM HELLO. THIS ; JGD02 ; ALLOWS FOR USERS TO BE PERMANTLY SLAVED TO CLI'S OTHER THAN MCR ; JGD02 ; ; JGD02 ; BIT 03 SET TERMINAL TO SLAVE BEFORE ACTIVATING REQUESTED TASK ; JGD02 ; ; JGD02 ; BIT 04 DO NOT ABORT ANY TASKS AT LOGOFF ; JGD02 ; ; JGD02 ; BIT 06 PASS A MESSAGE TO UPDATE THE NUMBER OF DISK BLOCKS AND FILES ; JGD02 ; USED BY THE USER AND TO PLACE THE INFORMATION IN THE USER'S ; JGD02 ; ACCOUNT BLOCK. ; JGD02 ; ; JGD02 ; BIT 15 IF SET, THE USER IS SET PRIVLEGED REGARDLESS OF TERMINAL UIC. ; JGD02 ; ; JGD02 ; THE FUNCTION OF THIS IS SUBROUTINE IS EITHER TO VERIFY THAT THERE IS NO ; JGD02 ; PRIVLEGE VIOLATION IF THE TASK IS RUN, OR TO PRINT A WARNING ERROR ; JGD02 ; MESSAGE AND EXIT FROM INSTALL ; JGD02 ; ; JGD02 ; R4 - IS ONLY REGISTER USED AND DOESN'T INTERFERE WITH NON-MODIFIED ; JGD02 ; INSHD CODE ; JGD02 ;- ; JGD02 ; JGD02 PRIVCK: MOV $TKTCB,R4 ; GET TCB ADRESS ; JGD02 MOV T.UCB(R4),R4 ; GET TERMINAL'S UCB ADDRESS ; JGD02 MOV U.PRV1(R4),PRVMSK ; GET TERMINALS PRIVLEDGE MASK ; JGD02 TST PRVMSK ; IF NO MASK BITS ARE SET - ; JGD02 BEQ 40$ ; THEN RETURN TO MAINLINE CODE AT ONCE ; JGD02 BIT #1,PRVMSK ; SEE IF ANY RUN PRIVLEDGES ALLOWED ; JGD02 BEQ 20$ ; EQUAL TO ZERO SO SOMETHING IS ALLOWED ; JGD02 ; BRANCH AROUND TO 20$ TO SEE WHAT ; JGD02 MOV #ERR4,R0 ; BIT #1 IS SET, SO NO RUN COMMANDS ARE ALLOWED ; JGD02 JMP INSHDE ; THIS USER. PRINT ERROR MESSAGE AND EXIT ; JGD02 20$: BIT #2,PRVMSK ; ANYTHING MORE TO CHECK FOR ; JGD02 BEQ 40$ ; BIT 2 IS NOT SET SO RETURN TO MAINLINE CODE ; JGD02 MOV U.LUIC(R4),LUIC ; SAVE PROTECTION UIC WORD ; JGD02 MOV #$HDRBF,R4 ; GET HEADER BLOCK ADRESS ; JGD02 CMP H.DUIC(R4),LUIC ; ARE THE DEFAULT AND PROTECTION UIC THE SAME ; JGD02 BEQ 40$ ; YES, THEN RETURN ; JGD02 CMP #177777,H.DUIC(R4) ; IS THE TASK BUILT WITH A UIC OF [377,377] ; JGD02 ; AND HENCE MAY BE RUN BY ALL ; JGD02 BEQ 40$ ; YES, SO RETURN ; JGD02 CMP #100200,H.DUIC(R4) ; WAS THE TASK BUILT WITH FTB USING THE ; JGD02 ; DEFAULT UIC =[200,200](BEFOR THE PATCH) ; JGD02 BEQ 40$ ; IF YES, THEN RETURN ; JGDOD MOV #ERR5,R0 ; NO, THE USER MAY NOT RUN THIS TASK, WARN HIM ; JGD02 JMP INSHDE ; PRINT ERROR MESSAGE, AND EXIT ; JGD02 40$: RETURN ; RETURN ; JGD02 ; ; JGD02 ; ; JGD02 .SBTTL ERROR PROCESSING INSHD1: MOV #ERR1,R0 ; BR INSHDE ; INSHD2: MOV #ERR2,R0 ; BR INSHDE ; INSHD3: MOV #ERR3,R0 ; GET ERROR MESSAGE ADDRESS MOV R0,-(SP) ; COPY IT ADD #23.,R0 ; SKIP TO END OF MESSAGE MOVB (R5),(R0)+ ; PUT IN DEVICE NAME MOVB 1(R5),(R0)+ ; CLR R2 ; SET TO SUPPRESS LEADING ZEROES MOV 2(R5),R1 ; GET UNIT NUMBER CALL $CBOMG ; CONVERT TO OCTAL MOVB #':,(R0)+ ; PUT IN COLON CLRB (R0) ; MARK TERMINATOR MOV (SP)+,R0 ; RESTORE BUFFER ADDRESS BIS #40,$FLGS ; SET TO RETURN FROM ERROR PRINTING CALL $INSER ; PRINT ERROR RETURN ; INSHDE: TST (SP)+ ; POP OFF RETURN ADDRESS JMP $INSER ; .END