; RSXSUB - RSX11M PRIVILIGED ROUTINES FOR CLONE ; LAST EDIT: 29-SEP-81 ; .NLIST .LIST TTM .NLIST BEX .TITLE RSXSUB .LIST ; ; ; ; AS THE EXEC APRS MAY BE USED FOR OTHER MAPPINGS ; WE MUST CALL MAPRSX BEFORE ANY EXEC REFERANCES IN ; ORDER TO RESTORE EXEC MAPPING. ON RETURN WE MUST CALL ; MAPCL1 TO RESTORE THE MAPPING USED BY CLONE. ; ; AS MAPRSX WILL UNMAP FROM THE CLONE DYNAMIC STORAGE AREA ; NO REFERANCES MAY BE MADE TO THIS REGION AFTER MAPRSX ; HAS BEEN CALLED. ALL DATA NOT PASSED IN REGISTERS MUST ; THUS BE COPIED TO LOCAL STORAGE BEFORE THE MAPRSX CALL. ; ASTS MUST BE DISABLED WHILE THE CLONE DYNAMIC AREA IS ; UNMAPPED, AS THE RSX ROUTINES ARE GENERALY CALLED FROM ; CLONE SYSTEM LEVEL CODE, AST DISABLE IS ASSUMED AND NOT ; SET IN THESE ROUTINES. ; ; IN ADDITION AS THESE ROUTINES MAY CALL $SWSTK TO EXECUTE ON THE ; EXECUTIVE STACK (AND THUS INHIBIT TASK SWITCHING) THIS CODE ; MUST FALL IN THE ADDRESS RANGE 120000-147777 IE APR 5,6. ; ; AS EXIT STATUS BLOCKS MAY BE UPDATED ASYNCRONOUSLY ALL CODE ; WITH RSX MAPPING IS EXECUTED AT PRIORITY 248. TO AVOID ; INTERFERANCE FROM OTHER PROCESSES. ; ; .MCALL UCBDF$,DCBDF$,TCBDF$ UCBDF$ DCBDF$ TCBDF$ ; ; .PSECT RSXSUB ; ; ; THIS IS THE ONLY MODULE WHICH KNOWS THE RSX SYSTEM CONFIGURATION ; HERE WE DEFINE SOME GLOBAL PARAMETERS TO BE USED BY OTHER MODULES ; AND CHECK THAT EVERYTHING WE REQUIRE IS PRESENT IN THE SYSTEM. ; .IF LT V$$RSN-32 ;CHECK >=3.2 SYSTEM .ERROR ;CLONE IS NOT SUPPORTED BELOW RSX11M V3.2 .ENDC ; .IF NDF M$$MGE ;MEMORY MANAGEMENT .ERROR ;CLONE REQUIRES A MAPPED SYSTEM .ENDC ; .IF NDF P$$LAS ;DYNAMIC MEMORY ALLOCATION .ERROR ;SYSTEM MUST SUPPORT MEMORY MANAGEMENT DIRECTIVES .ENDC ; .IF NDF S$$TOP ;STOP BIT DIRECTIVES .ERROR ;SYSTEM MUST SUPPORT STOP BIT DIRECTIVES .ENDC ; ; .IF DF M$$CRX ;MULTI-USER MCR MCRNAM::.RAD50 /MCR.../ .IFF ;SINGE USER MCR MCRNAM::.RAD50 /...MCR/ .ENDC ; ; ; SETFLG - SET AN EVENT FLAG IN SPECIFIED TASK ; ; INPUT: R2=EVENT FLAG NUMBER ; R3=TASK NAME ADDRESS ; ; ; LOCAL DATA EFN: .WORD 0 TASK: .WORD 0,0 ; SETFLG::MOV (R3),TASK ;COPY TASK NAME MOV 2(R3),TASK+2 CALL MAPRSX ;SWITCH TO PRIVILIGED MAPPING MOV #TASK,R3 MOV R2,EFN ;SAVE FLAG NUMBER CALL $SWSTK,10$ ;SWITCH TO SYSTEM STACK CALL $SRSTD ;LOOK UP TASK NAME BCS 5$ ;IGNORE IF NOT THERE MOV R0,R5 ;COPY TCB ADDRESS MOV EFN,R0 ;SET FLAG NUMBER CALL $SETF 5$: RETURN ;BACK TO USER STACK ; 10$: CALLR MAPCL1 ;RESTORE CLONE MAPPINGS AND RETURN ; ; TIINFO - SET PROCESS UIC AND TI: UCB ADDRESS IN PROCESS LIST ITEM ; ; INPUT: R0=PROCESS LIST ITEM POINTER ; PL.TI(R0) - TI DEVICE NAME ; PL.TI+2(R0) - BINARY UNIT NUMBER ; ; OUTPUT: PL.UIC(R0) - CURRENT TI: UIC ; PL.UCB(R0) - TI: UCB ADDRESS ; ; REGISTERS MODIFIED: NONE ; ; LOCAL DATA DEV: .WORD 0,0 ; TIINFO::MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV PL.TI(R0),DEV ;SAVE DEVICE LOCALY MOV PL.TI+2(R0),DEV+2 ; CALL MAPRSX ;SWITCH TO RSX MAPPING MOV #DEV,R3 CALL FNDUCB ;LOOKUP UCB ADDRESS BCC 1$ MOV #TIERR,R2 ;FAILED TO LOOKUP TI: CALL OUT JMP ABORT ; 1$: CMP U.RED(R1),R1 ;FOLLOW REDIRECT CHAIN BEQ 2$ MOV U.RED(R1),R1 BR 1$ 2$: MOV U.UIC(R1),R2 ;RETURN UIC CALL MAPCL1 ;RESTORE CLONE MAPPING ; MOV R2,PL.UIC(R0) ;RETURN TI: UIC MOV R1,PL.UCB(R0) ;RETURN TI: UCB ADDRESS MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 RETURN ; TIERR: .ASCIZ /FAILED TO LOOKUP TI:/ .EVEN ; ; ; SETTI - ASSIGN PROCESS TI: TO CLONE ; INPUT: PL.UCB(R0) - NEW TI: UCB ADDRESS ; OUTPUT; INPUT BECOMES CURRENT TI: ; PL.UIC(R0) IS SET TO CURRENT UIC FOR TI: ; ; REGISTERS MODIFIED: NONE ; UIC: .WORD 0 ; SETTI:: MOV R0,-(SP) MOV R1,-(SP) MOV PL.UCB(R0),R0 ;GET UCB ADDRESS FOR TI: ; CALL MAPRSX ;SWITCH TO RSX MAPING MOV $TKTCB,R1 ;GET OUR TCB ADDRESS MOV R0,T.UCB(R1) ;SET NEW TI: MOV U.UIC(R0),UIC CALL MAPCL1 ;RETURN TO CLONE MAPPING MOV (SP)+,R1 MOV (SP)+,R0 MOV UIC,PL.UIC(R0) ;SET CURRENT UIC RETURN ; ; ; ; LOCAL ROUTINES ; ; FNDUCB - SEARCH DEVICE TABLES FOR A PHYSICAL DEVICE ; INPUT: (R3) - DEVICE NAME ; 2(R3)- BINARY UNIT NUMBER ; ; OUTPUT: C CLEAR ; R1=UCB ADDRESS ; R2=DCB ADDRESS ; C SET ; DEVICE NOT FOUND. ; ; REGISTERS MODIFIED: R1,R2,R3 ; ; FNDUCB: CLC ;ASSUME SUCCESS CALL $SWSTK,60$ ; SWITCH TO SYSTEM STATE 10$: MOV $DEVHD,R2 ; GET ADDRESS OF DEVICE TABLE 12$: CMP (R3),D.NAM(R2) ; IS THIS THE DEVICE ? BEQ 20$ ; YES 15$: MOV D.LNK(R2),R2 ; NO, POINT TO NEXT DCB BNE 12$ ; GOT ONE BEQ 50$ ; END OF DEVICES, ERROR 20$: MOV 2(R3),R5 ; GET UNIT NUMBER CMPB R5,D.UNIT(R2) ; IS UNIT ON THIS DCB? BLO 15$ ; NO CMPB R5,D.UNIT+1(R2) ; MAYBE BHI 15$ ; NO! CLR R4 ; GET FIRST UNIT NUMBER BISB D.UNIT(R2),R4 MOV D.UCB(R2),R1 ; GET FIRST UCB ADDRESS SUB R4,R5 ; COMPUTE RELATIVE UNIT NUMBER BEQ 45$ ; FOUND IT 30$: ADD D.UCBL(R2),R1 ; NO, POINT TO NEXT UCB DEC R5 ; FOUND IT YET? BNE 30$ ; NO, LOOP 45$: MOV R1,4(SP) ; SET USER R1 TO UCB ADDRESS MOV R2,6(SP) ; SET USER R2 TO DCB ADDRESS RETURN ; RETURN TO USER STATE 50$: MOV @$HEADR,R3 ; GET USER SP INCB 6(R3) ; SET CARRY BIT IN USER PS 55$: SEC ; SET CARRY 60$: RETURN ; ; ; ; MAPRSX - UNMAP THOSE WINDOWS WHICH USE RSX ADDRESS SPACE ; ; UNMAPPING A WINDOW IN THE EXECUTIVE ADDRESS SPACE OF A ; PRIVILIGED TASK, AUTOMATICALY RESETS THE EXECUTIVE MAPPING. ; .MCALL DSAR$S,ALTP$S ; MAPRSX: DSAR$S ;CHECK ASTS ARE DISABLED BCS 1$ ;C SET IF THEY ARE TRAP ;ELSE FATAL ERROR 1$: ALTP$S ,#248. ;DOMINATE THE WORLD CALL UNMAP ;UNMAP ANY TASK STREAM REGION CALL UNMAPD ;UNMAP DYNAMIC STORAGE AREA ; (EXTENDED TASK REGION) RETURN ; ; ; MAPCL1 - MAP BACK TO THE DYNAMIC STORAGE AREA ; MAPCL1: CALL MAPD ALTP$S RETURN ; .END