.TITLE EDDRV .IDENT /V02/ ; ;**************************************************************** ; ; [03-FEB-78] D.DANIELS [V3.1] ; ; EXECUTIVE DRIVER ; ; **LOADABLE DRIVER SUPPORT AND MULITUSER PROTECTION** ; ;**************************************************************** ; SUPPORTED FUNCTIONS ;**************************************************************** ; ; NAME BIT SYMBOLIC DISCRIPTION ; VALUE ; IO.KIL 0 12 CANCEL I/O ; IO.WLB 1 400 WRITE LOGICAL BLOCK ; IO.RLB 2 1000 READ LOGICAL BLOCK ; IO.ATT 3 1400 ATTACH DEVICE ; IO.DET 4 2000 DETTACH DEVICE ; ;**************************************************************** ; ERROR RETURNS FROM DRIVER ;**************************************************************** ; ; NAME DECIMAL OCTAL DISCRIPTION ; ; IE.IFC -2 376 ILLEGAL FUNCTION ; IE.PRI -16 360 PRIVILEGE VIOLATION ; IE.RBG -40 330 ILLEGAL RECORD SIZE ; IE.BDV -55 311 BAD DEVICE NAME ; IE.NDR -72 270 NO DYNAMC SPACE AVAILIBLE ; ; ;**************************************************************** ; MACRO LIBRARY CALLS ;**************************************************************** ; .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$,SCBDF$ ; ABODF$ ; TASK ABORT CODES HWDDF$ ; HARDWARE REGISTER SYMBOLS PKTDF$ ; I/O PACKET OFFSETS TCBDF$ ; TASK CONTROL BLOCK OFFSETS SCBDF$ ; CONTROL BLOCK OFFSETS ; ;**************************************************************** ; LOCAL DATA AND DEFINITIONS ;**************************************************************** ; LD$ED= 000000 ; LD$'DEV' FOR ACCESS TO INTSV$ TEMP: .BLKW 1 ; STORAGE FOR UCB FROM INTSV$ CNTBL: .BLKW 1 ; STORAGE FOR CONTRLR FROM INTSV$ ; ;**************************************************************** ; DRIVER DISPATCH TABLE ;**************************************************************** ; $EDTBL::.WORD EDINI ; DEVICE INITIATOR ENTRY POINT .WORD EDCAN ; CANCEL I/O OPERATION ENTRY POINT .WORD EDOUT ; DEVICE TIMEOUT ENTRY POINT .WORD EDPWF ; POWERFAIL ENTRY POINT ; ;**************************************************************** ; EXECUTIVE DRIVER INITIATOR ENTRY POINT ;**************************************************************** ; ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE ; IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPT ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO ; THE CALLER IS EXECUTED. ; ; INPUTS: ; ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; OUTPUTS: ; ; IF THE SPECIFIED CONTROLLER IS NOT BUSY, ; THEN THE REQUEST IS DEQUEUED AND THE I/O ; OPERATION IS INITIATED. ; $EDINP:: ; INPUT ENTRY POINT EDINI: CALL $GTPKT ; GET AN I/O PACKET BCC 1$ ; GO ON IF CARRY CLR RETURN ; CONTROLLER BUSY OR NO REQUEST ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ; R1=ADDRESS OF THE I/O REQUEST PACKET. ; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3=CONTROLLER INDEX. ; R4=ADDRESS OF THE STATUS CONTROL BLOCK. ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; EXECUTIVE DRIVER I/O REQUEST PACKET FORMAT: ; ; WD. 00 -- I/O QUEUE THREAD WORD. ; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER. ; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTER TASK. ; WD. 03 -- POINTER TO SECOND LUN WORD. ; WD. 04 -- CONTENTS OF THE FIRST LUN WORD (UCB). ; WD. 05 -- I/O FUNCTION CODE ; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK. ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK. ; WD. 10 -- I/O STATUS BLOCK ADDRESS. ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ; WD. 12 -- RELOCATION BIAS OF I/O BUFFER. ; WD. 13 -- BUFFER ADDR OF I/O TRANSFER. ; WD. 14 -- BUFFER SIZE. ; WD. 15 -- TTY NUMBER. ; WD. 16 -- UNUSED. ; WD. 17 -- UNUSED. ; WD. 20 -- UNUSED. ; ;**************************************************************** ; XEQ INDICATED I/O PROCESS ;**************************************************************** ; 1$: MOV I.TCB(R1),R3 ; LOAD TCB ADDR. MOV T.UCB(R3),R4 ; LOAD TI: UCB ADDR. CMPB I.FCN+1(R1),#IO.WLB/256.; WRITE LOGICAL BLOCK? BEQ WLB ; YES=WRITE CMPB I.FCN+1(R1),#IO.RLB/256.; READ LOGICAL BLOCK? BNE ERRIFC ; NO=ILLEGAL FUNCTION ; ;**************************************************************** ; READ LOGICAL BLOCK ;**************************************************************** ; MOV I.PRM+6(R1),R3 ; LOAD TTN: UNIT # BMI 2$ ; TI:=TTN: CMP #MAXTTY,R3 ; CHECK UNIT # BLE ERRBDV ; UNDEFINED DEVICE ASL R3 ; WORD OFF-SET MOV TTY(R3),R4 ; LOAD TTN: UCB ADDR. 2$: MOV U.LUIC(R4),-(SP) ; PUSH TTN: LOGIN UIC CALL $PTWRD ; STORE IN USERS BUFFER BR BYE ; DONE. ; ;**************************************************************** ; WRITE LOGICAL BLOCK ;**************************************************************** ; WLB: BIT #U2.PRV,U.CW2(R4) ; TEST FOR PRIVILIGE BNE 1$ ; YES? CMP #144310,U.LUIC(R4) ; LOGON UIC=[310,310]? BNE ERRPRI ; PRIVILEGE VIOLATION 1$: CMP #80.,I.PRM+4(R1) ; BYTE COUNT > 80.? BLE ERRRBG ; TOO LONG? MOV I.PRM+6(R1),R3 ; LOAD TTN: UNIT # BMI 2$ ; TI:=TTN: CMP #MAXTTY,R3 ; CHECK UNIT # BLE ERRBDV ; UNDEFINED DEVICE ASL R3 ; WORD OFF-SET MOV TTY(R3),R4 ; LOAD TTN: UCB ADDR. 2$: MOV R1,R3 ; SAVE I/O NODE ADDR. MOV #84.,R1 ; ALLOCATE 84. BYTES CALL $ALOCB ; GET CORE BLOCK BCS ERRNDR ; NO DYNAMIC POOL SPACE MOV R0,-(SP) ; SAVE ADDR OF BLOCK TST (R0)+ ; POINT TO SECOND WORD MOV R4,(R0)+ ; SAVE TTY UCB MOV I.PRM+4(R3),R1 ; BYTE COUNT 3$: CALL $GTBYTE ; PUT A BYTE ON STACK MOVB (SP)+,(R0)+ ; POP BYTE TO MCR BUFFER SOB R1,3$ ; LOOP BACK MOVB #33,(R0) ; TERMINATE WITH ALTMODE MOV (SP)+,R1 ; RESET BLOCK ADDR. CALL $QMCRL ; QUEUE TO MCR BYE: MOV #IS.SUC,R0 ; SUCCESS CODE. EXIT: CLR R1 CALL $IODON BR EDINI ERRIFC: MOV #IE.IFC,R0 ; ILLEGAL FUNCTION BR EXIT ERRPRI: MOV #IE.PRI,R0 ; PRIVILEGE VIOLATION BR EXIT ERRRBG: MOV #IE.RBG,R0 ; ILLEGAL RECORD SIZE BR EXIT ERRBDV: MOV #IE.BDV,R0 ; BAD DEVICE NAME BR EXIT ERRNDR: MOV #IE.NDR,R0 ; NO DYNAMIC POOL SPACE BR EXIT TTY: .WORD .TT0 .WORD .TT1 .WORD .TT2 .WORD .TT3 .WORD .TT4 .WORD .TT5 .WORD .TT6 MAXTTY= <.-TTY>/2 ; ; ;**************************************************************** ; CANCEL I/O ENTRY POINT ;**************************************************************** ; EDCAN: RETURN ; NOT USED ; ;**************************************************************** ; POWERFAIL ENTRY POINT ;**************************************************************** ; EDPWF: RETURN ;;; NOT USED. ; ;**************************************************************** ; EXECUTIVE DRIVER INTERRUPT ENTRY ;**************************************************************** ; ; A DIRECT CALL TO $INTSV IN NOT LEGAL FOR LOADABLE DRIVERS ; $EDINT:: ;;; REF LABEL INTSV$ ED,EDPRL,1 ;;; SAVE REG, SET PRIORTY JMP $INTXT ;;; IGNORE THIS INTERRUPT ; ;**************************************************************** ; DEVICE TIMOUT ENTRY POINT ;**************************************************************** ; EDOUT: RETURN ;;; NOT USED ; ;**************************************************************** ; .END