.TITLE MOVE ; ; PRIVLEDGED MCR TASK TO CHANGE PARTITIONS OF AN EXECUTING TASK. ; IF THE EXECUTING TASK IS IN THE ACTIVE TASK LIST (ATL) AND IS ; CHECKPOINTABLE, THE EXECUTIVE IS FORCED TO CHECKPOINT IT. ; MOVE WAITS UNTIL THE TASK IS IN THE MEMORY REQUIRED LIST (MRL) ; AND THEN RELINKS IT TO THE NEW PARTITION. IF THE TASK IS ; INITIALLY IN THE MRL, IN IS SIMPLY RELINKED TO THE NEW PARTITION. ; ; CALLING SEQUENCE ; ; MCR>MOVE TNAME[/TI=TTN][/PAR=PARNAM] ; ; TNAME = NAME OF TASK TO BE MOVED ; TTN = TERMINAL FROM WHICH THE TASK IS EXECUTING ; PARNAM = PARTITION THE TASK IS TO BE MOVED TO ; ; IF THE TI SWITCH IS NOT INPUT, THE REQUESTING TI WILL BE ASSUMED. ; IF THE PAR SWITCH IS NOT INPUT, THE TASK WILL BE MOVED BETWEEN ; THE TWO PARTITIONS SPECIFIED BY DPAR1 AND DPAR2. IF THE PAR ; SWITCH IS INPUT, ALL PARTITIONS WILL BE SCANNED FOR THE TASK ; RATHER THAN JUST DPAR1 AND DPAR2 ; ; WRITTEN AUGUST 1976 R B FRENCH THE BOEING COMPANY ; ; TASK BUILD FILE ; ; MOVE/PR/-CP/-FP=MOVE,ALLOC,[1,1]EXEC.STB/SS ; / ; TASK=...MOV ; UNITS=1 ; ASG=TI:1 ; PRI=240 ; PAR=MCR ; LIBR=SYSRES:RO ; STACK=32 ; / ; ;**************************************************************** ; * ; DEFAULT PARTITIONS - DPAR1 AND DPAR2 MUST BE DEFINED FOR THE * ; PARTICULAR SYSTEM USING MOVE. * ; * DPAR1: .RAD50 /GEN / ; * DPAR2: .RAD50 /VG / ; * ; * ;**************************************************************** ; .MCALL DIR$,GMCR$,MRKT$,WSIG$S,RQST$,QIOW$,EXIT$S MOVE: DIR$ #GMCR ;GET MCR LINE MOV #GMCR+G.MCRB+4,R0 ;SCAN FOR 1ST NON-BLANK 10$: CMPB (R0)+,#' BEQ 10$ ; DEC R0 ;BACK UP ONE CHARACTER MOV #1,R1 ;SET PERIOD ACCEPT FLAG JSR PC,$CAT5 ;CONVERT TASKNAME TO RAD50 MOV R1,TNAME BCS SWITCH JSR PC,$CAT5 MOV R1,TNAME+2 BCC SWITCH DEC R0 ;BACK UP ONE CHARACTER ; SWITCH: CMPB (R0)+,#'/ ;ANY SWITCHES? BNE DFAULT ;BRANCH IF NOT TISW: CMPB (R0),#'T ;CHECK FOR TI SWITCH BNE PARSW ;IF NOT TI, GO CHECK FOR PAR CMPB 1(R0),#'I BNE PARSW ADD #2,R0 ;STEP OVER SWITCH CMPB (R0)+,#'= ;CHECK FOR EQUALS BEQ 20$ 10$: JMP SYNERR 20$: CMPB (R0)+,#'T ;CHECK FOR TT BNE 10$ CMPB (R0)+,#'T BNE 10$ MOVB (R0),R2 ;TI NUMBER TO R2 SUB #60,R2 ;CONVERT TO BINARY MOV .PUDBA,R1 ;GET PUD ADDRESS 30$: CMP U.DN(R1),#"TT ;IS IT A TT? BNE 40$ CMPB U.UN(R1),R2 ;RIGHT UNIT NUMBER? BEQ 50$ 40$: ADD #U.SZ,R1 ;STEP TO NEXT PUD ENTRY CMP R1,.PUDEA ;END OF PUD? BNE 30$ JMP NOTERM 50$: INC R0 ;STEP R0 MOV R1,TIADR ;SAVE TI POINTER JSR PC,CHECK TST R0 ;R0 CLEARED? BEQ DFAULT ;THEN NO MORE SWITCHES INC R0 PARSW: CMPB (R0)+,#'P ;CHECK FOR PAR SWITCH BEQ 20$ 10$: JMP SYNERR 20$: CMPB (R0)+,#'A BNE 10$ CMPB (R0)+,#'R BNE 10$ CMPB (R0)+,#'= ;CHECK FOR EQUALS BEQ 30$ JMP SYNERR 30$: CLR R1 ;NO PERIOD ACCEPT JSR PC,$CAT5 ;CONVERT 1ST WORD OF PARTITION MOV R1,NEWPAR ;SAVE IT BCS 40$ CLR R1 JSR PC,$CAT5 ;CONVERT 2ND WORD OF PARTITION MOV R1,NEWPAR+2 ;SAVE IT 40$: DEC R0 MOV R0,-(SP) ;SAVE R0 MOV #NEWPAR,R0 JSR PC,TPDSCN MOV R0,PARADR ;SAVE PARTITION POINTER MOV (SP)+,R0 ;RESTORE R0 JSR PC,CHECK TST R0 ;R0 CLEAR? BEQ DFAULT INC R0 BR TISW ; DFAULT: TST NEWPAR ;PAR SWITCH GIVEN? BNE 10$ ;BRANCH IF SO MOV #DPAR1,R0 ;GET TPD POINTER FOR GEN PARTITION JSR PC,TPDSCN MOV R0,DPAR1 MOV #DPAR2,R0 ;GET TPD POINTER FOR VG PARTITION JSR PC,TPDSCN MOV R0,DPAR2 ; 10$: MOV .CRTSK,R3 ;GET OUR ATL NODE TST TIADR ;TI SWITCH GIVEN? BNE SCAN MOV A.TI(R3),TIADR ;AND SAVE OUR TI POINTER ; SCAN: DIR$ #MRKT ;ISSUE MARK TIME DIRECTIVE MOV #.ATLLH,R0 ;GET ALT LISTHEAD MOV @#177776,-(SP) ;PSW TO STACK BIS #140,@#177776 ;;INHIBIT TASK SWITCHING 10$: MOV (R0),R0 ;;GET A NODE CMP (R0),.ATLLH ;;END OF ATL? BEQ MRL CMP A.TI(R0),TIADR ;;CHECK TI BNE 10$ MOV A.TD(R0),R1 ;;GET STD ADDRESS CMP (R1)+,TNAME ;;CHECK 1ST WORD OF TNAME BNE 10$ CMP (R1),TNAME+2 ;;CHECK 2ND WORD OF TNAME BNE 10$ JSR PC,PARCHK BCC FOUND BR 10$ MRL: MOV .TPDBA,R0 ;;GET START OF TPD 10$: ADD #T.RF,R0 ;;OFFSET TO MRL CMP (R0),R0 ;;EMPTY? BEQ 30$ MOV R0,R2 ;;SAVE LISTHEAD 15$: MOV (R0),R0 ;;GET NEXT NODE MOV A.TD(R0),R1 ;;GET STD ADDRESS CMP (R1)+,TNAME ;;CHECK 1ST WORD OF TNAME BNE 20$ CMP (R1),TNAME+2 ;;CHECK 2ND WORD OF TNAME BNE 20$ JSR PC,PARCHK BCC RELINK 20$: CMP (R0),R2 ;;END OF MRL? BNE 15$ MOV R2,R0 ;;RESET R0 TO LISTHEAD 30$: ADD #T.SZ-T.RF,R0 ;;STEP TO NEXT PARTITION CMP R0,.TPDEA ;;END OF TPD? BLT 10$ JSR PC,..ENB0 ;;ENABLE TASK SWITCHING JMP QIO ;AND GO PRINT ERROR MESSAGE FOUND: MOV R0,R1 ;;ATL NODE TO R1 ADD #A.CF,R1 ;;OFFSET TO CTL LINKAGE CMP (R1),R1 ;;IS TASK IN CTL? BNE 20$ 10$: JSR PC,..ENB0 ;;ENABLE TASK SWITCHING JMP NOTCKP ;AND GO PRINT ERROR MESSAGE 20$: BIT #AF.CD,A.TF(R0) ;;CHECKPOINTING DISABLED? BNE 10$ ; CMPB #TS.LRS,A.TS(R0) ;;IS THIS TASK LOADING? BHIS WAIT CMPB #TS.RUN,A.TS(R0) ;;IS THIS TASK 'ACTIVE' IN THE ATL BHI WAIT CMPB #TS.WF4,A.TS(R0) ;;MIGHT BE (RANGE IS TS.RUN - TS.WF4) BLO WAIT BIT #AF.MC,A.TF(R0) ;;IS IT MARKED FOR CHECKPOINTING? BNE WAIT MOV R3,-(SP) ;;SAVE R3 JSR PC,ALLOC ;;ALLOCATE CHECKPOINT SPACE MOV (SP)+,R3 ;;RESTORE R3 BCC 3$ JSR PC,..ENB0 ;;ENABLE TASK SWITCHING JMP NOSPAC 3$: MOVB A.TS(R0),A.CS(R0) ;;SAVE OLD STATUS TSTB A.IR(R0) ;;I/O IN PROGRESS? BEQ 7$ MOVB #TS.SUS,A.TS(R0) ;;SUSPEND THE TASK JSR PC,..ENB0 ;ENABLE TASK SWITCHING 5$: WSIG$S TSTB A.IR(R0) ;I/O STILL IN PROGRESS? BEQ 6$ ;BRANCH IF NOT CMP #1,A.EF(R3) ;MARK TIME EF SET? BNE 5$ ;IF NOT, GO WAIT SO MORE MOVB A.CS(R0),A.TS(R0) ;RESTORE THE STATUS JMP TIMOUT 6$: MOV @#177776,-(SP) ;PSW TO STACK BIS #140,@#177776 ;;INHIBIT TASK SWITCHING 7$: BISB #AF.CP,A.TF(R0) ;;DECLARE TASK CHECKPOINTED BICB #AF.MC,A.TF(R0) ;;RESET MARKED FOR CP FLAG -- ;;THIS MUST BE DONE NOW SO THE TASK ;;WILL NOT BE THROWN OUT ON ITS WAY ;;BACK IN. IT MAY BE DONE NOW BECAUSE ;;DEQUE LOOKS AT BOTH AF.CP & AF.MC MOVB #TS.SFC,A.TS(R0) ;;SET STATUS TO "SUSPENDED FOR CHECKPOINT" MOVB A.RP(R0),A.CP(R0) ;;SAVE OLD PRIORITY ; WTMRL: JSR PC,..ENB0 20$: WSIG$S CMPB #TS.MRL,A.TS(R0) ;TASK IN MRL? BEQ 30$ CMP #1,A.EF(R3) ;MARK TIME FLAG SET? BNE 20$ JMP TIMOUT 30$: MOV @#177776,-(SP) ;PSW TO STACK BIS #140,@#177776 ;;INHIBIT TASK SWITCHING RELINK: MOV PARADR,A.PD(R0) ;;SWITCH PARTITIONS MOV R0,R4 ;;DELETE NODE FROM CURRENT CTL ADD #A.CF,R4 JSR PC,..NDEL ;; MOV R4,R1 MOV PARADR,R2 ;;INSERT NODE IN NEW CTL ADD #T.CF,R2 JSR PC,..ICTL ;; MOV R0,R4 ;;DELETE NODE FROM CURRENT MRL JSR PC,..NDEL ;; MOV R4,R1 ADD #T.RF-T.CF,R2 ;;INSERT NODE IN NEW MRL JSR PC,..IPRI ;; ; JSR PC,..ENB0 ;;ENABLE TASK SWITCHING MOV #RQST+R.QSPN,R4 MOV PARADR,R5 MOV (R5)+,(R4)+ ;PUT PARTITION NAME IN DPB MOV (R5),(R4) DIR$ #RQST ;RUN CLEANX EXIT$S ; WAIT: JSR PC,..ENB0 ;;ENABLE TASK SWITCHING WSIG$S CMP #1,A.EF(R3) ;MARK TIME FLAG SET? BNE 10$ JMP TIMOUT 10$: JMP SCAN ; ; ROUTINE TO SCAN TASK PARTITION DIRECTORY. CALLED WITH ; ADDRESS OF RAD50 NAME OF PARTITION IN R0. TPD ADDRESS ; OF PARTITION IS RETURNED IN R0. IF PARTITION IS NOT ; FOUND, MOVE WILL PRINT AN ERROR MESSAGE AND EXIT. ; TPDSCN: MOV .TPDBA,R1 ;GET START OF TPD 10$: CMP (R1),(R0) ;CHECK PARTITION NAME BNE 20$ CMP 2(R1),2(R0) BEQ 30$ 20$: ADD #T.SZ,R1 ;STEP TO NEXT PARTITION CMP R1,.TPDEA ;END OF TPD? BNE 10$ JMP NOPART ;GO WRITE ERROR MESSAGE 30$: MOV R1,R0 ;PUT TPD POINTER IN R0 RTS PC ; ; ROUTINE TO CHECK IF COMMAND STRING PROCESSING IS DONE. ; CALLED WITH CURRENT COMMAND STRING POINTER IN R0. R0 ; WILL BE CLEARED IF POINTING AT A CR OR ALT. ; CHECK: CMPB (R0),#15 ;CR? BEQ 20$ CMPB (R0),#33 ;ALT? BNE 30$ 20$: CLR R0 30$: RTS PC ; ; ROUTINE TO CHECK PARTITION OF THE TASK IF NO PAR SWITCH ; WAS INPUT(CHECKS WHETHER TASK IS IN DPAR1 OR DPAR2). ; CALLED WITH ATL OR MRL NODE IN R0. ; PARCHK: TST PARADR ;PARTITION INPUT? BNE 30$ ;THEN DON'T CHECK DEFAULTS CMP A.PD(R0),DPAR1 ;IS IT IN DPAR1? BNE 10$ MOV DPAR2,PARADR ;THEN MOVE IT TO DPAR2 BR 30$ 10$: CMP A.PD(R0),DPAR2 ;IS IT IN DPAR2? BNE 20$ MOV DPAR1,PARADR ;THEN MOVE IT TO DPAR1 BR 30$ 20$: SEC BR 40$ 30$: CLC 40$: RTS PC ; TIADR: .WORD 0 ;POINTER TO TI PUD PARADR: .WORD 0 ;POINTER TO PARTITION TPD ENTRY NEWPAR: .WORD 0,0 ;NEW PARTITION NAME TNAME: .WORD 0,0 ;TASK NAME GMCR: GMCR$ ;GET MCR LINE DPB ; ; THE FOLLOWING DIRECTIVE TO EXECUTE THE TASK CLEANX IS A BAND-AID ; FOR THE RSX-11D VERSION 6A BUG THAT FAILS TO EXECUTE THE LAST TASK ; IN THE MEMORY REQUIRED LIST (MRL) OF A PARTITION, EVEN WHEN THERE ; IS MEMORY AVAILABLE FOR IT. CLEANX IS A 300 BYTE LONG, DO NOTHING ; TASK WHOSE EXECUTION CAUSES THE EXECUTIVE TO EXECUTE THE TASK IN ; THE MRL. RQST: RQST$ CLEANX,GEN ;REQUEST DPB FOR CLEANX ; MRKT: MRKT$ 1,5,2 ;MARK TIME DPB (5 SEC ON EF1) QIO: DIR$ #QIOW EXIT$S ; QIOW: QIOW$ IO.WLB,1,2,,,, NOTACT: .BYTE 12 .ASCII /TASK NOT ACTIVE/ .EVEN ; .MACRO ERROR NUM,MSG MOV #.+22,R1 ;MESSAGE ADDRESS IN R1 INC (R1) ;ADD LF TO CHARACTER COUNT MOV (R1)+,QIOW+Q.IOPL+2 ;PUT MESSSAGE IN QIO DPB MOV R1,QIOW+Q.IOPL JMP QIO ;AND GO PRINT IT .WORD NUM .BYTE 12 .ASCII /MSG/ .EVEN .ENDM ; SYNERR: ERROR 12., NOTERM: ERROR 16., NOPART: ERROR 17., NOSPAC: ERROR 19., TIMOUT: ERROR 19., NOTCKP: ERROR 23., ; .END MOVE