DOQIO=0 .SBTTL INTRODUCTION .TITLE GB ;GARBAGE DEVICE HANDLER ; MODIFIED TO ALLOW OUTPUT QIO TO LUN 2 IF ; SWITCH 14 IS UP (CONDITIONAL ASSEMBLY) ; ; THIS FEATURE IS INTENDED TO PERMIT GB TO BE USED AS A ; PSEUDO-DEVICE PERMITTING OUTPUT TO IT TO BE COPIED TO ; TT0: OR SOME SUCH PLACE BUT SUCH THAT IT CAN BE LEFT "LOGGED IN" ; AND PRIVILEGED (DEFINED AS A TERMINAL IN ITS PUD) AS DESIRED. ; .IDENT 'V002.X' ; ; GARBAGE DEVICE HANDLER TASK FOR RSX11D. ; ; THIS HANDLER IS AN RSX11D PRIVILEGED TASK WHICH CAN ABSORB OUTPUT ; DIRECTED TO IT BY A TASK ("WRITE-ONLY MEMORY"), THUS PROVIDING A ; MEANS BY WHICH OUTPUT GENERATED ON CERTAIN LUNS BY A PARTICULAR TASK ; MAY BE SUPPRESSED IF DESIRED (ANALOGOUS TO OS/360 "// DD DUMMY" ; STATEMENTS). IT ALSO ACCEPTS READ FUNCTIONS, RESPONDING TO THEM BY ; IMMEDIATE GENERATION OF END-OF-FILE STATUS WITHOUT TRANSFERING ANY ; DATA. ; ; THE PUD ENTRY FOR THE GARBAGE DEVICE MUST CONTAIN THE FOLLOWING ; INFORMATION: ; ; DEVICE NAME U.DN "GB" ; UNIT NUMBER U.UN 0 (BYTE) ; CHARACTERISTICS 1 U.C1 UC.REC=1 - RECORD ORIENTED DEVICE ; CHARACTERISTICS 4 U.C4 DEFAULT LINE OR BUFFER SIZE = 210 OCTAL ; ; THE REMAINDER OF THE PUD DATA WORDS ARE IRRELEVANT. ; ; THE FOLLOWING QIO FUNCTIONS ARE SUPPORTED: ; ; KILL I/O (12) CANCELS ALL REQUESTS FOR THE ISSUING TASK ; I/O RUNDOWN (22) LIKE KILL I/O, BUT EXECUTIVE REQUEST ; UNLOAD HANDLER(42) CAUSES HANDLER TO EXIT ; WRITE (400) DATA BUFFER IS UNCHANGED; I/O COMPLETION OCCURS ; WITH LENGTH OF DATA TRANSFERED EQUAL TO BUFFER ; LENGTH ; READ (1000) DATA BUFFER IS UNCHANGED; I/O COMPLETION OCCURS ; WITH END-OF-FILE STATUS AND LENGTH OF DATA ; TRANSFERED EQUAL TO 0. ; ATTACH (1400) ATTACHES THE GARBAGE DEVICE TO THE CALLER ; DETACH (2000) DETACHES THE GARBAGE DEVICE FROM THE CALLER ; ; THE FOLLOWING COMPLETION CODES ARE RETURNED BY THE HANDLER: ; ; IE.IFC -02 INVALID FUNCTION CODE ; IE.SPC -06 IMPROPER USER BUFFER ADDRESS OR LENGTH ; IE.DNA -07 DETACH FAILED -- DEVICE NOT ATTACHED ; IE.DAA -08 ATTACH FAILED -- DEVICE ALREADY ATTACHED ; IE.EOF -10 END OF FILE DETECTED ON READ ; IE.PRI -16 PRIVILEGE VIOLATION ; IS.SUC +01 SUCCESFUL COMPLETION ; ; TASK ATTRIBUTES: /-AB /-CP /DS /-FP /-FX /HD /-MU /-PI /PR /-TA /-TR ; ; TASKNAME: GB.... ; PARTITION: GEN ; POOL LIMIT: 40 ; PRIORITY: 248 ; STACK: 30 ; UIC: [1,1] ; UNITS: 0 ; .SBTTL SYMBOL DEFINITIONS ; ; MACRO CALLS: ; .MCALL EXIT$S,DIR$,WTLO$ ; ; DEFINITIONS: ; GBNAME = "GB ;HANDLER NAME GBUNIT = 0 ;HANDLER UNIT NUMBER ; NREFM1 = 1 ;NORMAL REQUEST EVENT FLAG MASK WORD 1 XREFM1 = 2 ;EXPRESS REQUEST EVENT FLAG MASK WORD 1 ; WRT = 1 ;TRANSFER DIRECTION FOR WRITE ; .PSECT GBGRW,RW ; .SBTTL INITIALIZATION CODE, EXIT CODE, AND IDLE CODE ; GBSTRT: MOV #GBUIT,R0 ;SET ADDRESS OF UIT MOV #GBNAME,R2 ;SET HANDLER NAME MOV #UF.RH,R3 ;HANDLER RESIDENT FLAG JSR PC,@#..DSUT ;DECLARE HANDLER RESIDENT BCS EXIT ;GO AWAY IF IT FAILS CLR EXITFL ;CLEAR EXIT FLAG MOV PC,SP ;INCREASE STACK SIZE ; IDLE: TST EXITFL ;HANDLER WANT TO EXIT? BEQ SLEEP ;NO MOV #GBUIT,R0 ;YES, GET UIT ADDRESS JSR PC,@#..DNRC ;DECLARE NONRESIDENT... EXIT: EXIT$S ;...AND BECOME NONRESIDENT ; SLEEP: DIR$ #IDLDPB ;WAIT FOR NORMAL OR EXPRESS REQUEST ; .SBTTL REQUEST DEQUEING AND DISPATCH ; CHECK: MOV #GBUIT,R0 ;GET UIT ADDRESS MOV @#.CRTSK,R1 ;HANDLER ATL ADDRESS MOV A.EF(R1),R5 ;GET HANDLER EVENT FLAGS 1-16 BIT #XREFM1,R5 ;ANY EXPRESS QUEUE REQUESTS? BEQ 1$ ;NO JSR PC,@#..DQRE ;YES, DEQUEUE ONE BCC 2$ ;GOT IT! 1$: BIT #NREFM1,R5 ;ANY NORMAL QUEUE REQUESTS? BEQ IDLE ;NO JSR PC,@#..DQRN ;YES, GRAB ONE BCS IDLE ;NONE AFTER ALL 2$: MOVB R.FC+1(R1),R3 ;GET I/O FUNCTION CODE CMP R3,#NFUNS ;SEE IF IT'S IN VALID RANGE BLO 112$ JMP UNRFN ;ILLEGAL 112$: ; BHIS UNRFN ;NO, IT'S ILLEGAL JSR PC,@#..VACC ;CHECK FINER DETAILS BCC 111$ JMP NOPRIV 111$: ; BCS NOPRIV ;NO GOOD (DON'T HAVE NEEDED PRIVILEGES) JMP @#..DISP ;ALL OK: DISPATCH VIA FUNCTION TABLE ; .SBTTL SPECIAL FUNCTIONS (CODE 0) ; SPECFN: MOV R.FC(R1),R3 ;GET FUNCTION CODE CMP R3,#IO.KIL ;IS IT I/O KILL? BEQ 1$ ;YES, DO IT TST R.AT(R1) ;DOES REQUEST COME FROM EXEC? BNE UNRFN ;NO, CAN'T ALLOW IT! CMP R3,#IO.RDN ;I/O RUNDOWN? BEQ 2$ ;YES, DO IT CMP R3,#IO.UNL ;UNLOAD HANDLER? BNE UNRFN ;NO, UNRECOGNIZED FUNCTION INC EXITFL ;YES, SET EXIT FLAG BR IOSUCC ;DO I/O COMPLETION 1$: MOV R.AT(R1),R4 ;GET ATL ADDRESS OF REQUESTOR MOV R4,R.PB(R1) ;PUT IT IN IORQ NODE PARAMETER 1 MOV A.TD(R4),R.PB+2(R1);PUT STD ADDRESS INTO PARAMETER 2 MOV (R2),R.PB+4(R1) ;PUT PUD ADDRESS IN PARAMETER 3 2$: JSR PC,@#..FLSH ;FLUSH QUEUES OF ALL RQ'S THIS TASK, UNIT BR IOSUCC ;DONE ; .SBTTL ATTACH & DETACH, WRITE AND READ FUNCTIONS ; ATTACH: JSR PC,@#..ATUN ;ATTACH UNIT BCS ATFAIL ;FAILED BR IOSUCC ;WORKED ; DETACH: JSR PC,@#..DTUN ;DETACH UNIT BCS DTFAIL ;FAILED BR IOSUCC ;DONE ; WRITE: MOV R.PB+2(R1),R3 ;GET NO. OF BYTES TO WRITE MOV R.PB(R1),R2 ;GET VIRTUAL BUFFER ADDRESS MOV #WRT,R5 ;WRITE (TRANSFER DIRECTION) JSR PC,@#..VXFR ;VERIFY TRANSFER BCS ILLMRQ ;SORRY, BAD BUFFER ; .IF DF,DOQIO .MCALL QIOW$S BIT #40000,@#177570 ;SWITCH 14 UP? BEQ 100$ ;IF NOT, FLUSH OUTPUT TO LUN 2 TST R3 ;ANYTHING TO TRANSFER? BLE 100$ ;NO, SKIP IT... COLUN=2 ;LUN FOR OUTPUT COEFN=22 ;EF FOR OUTPUT MOV R5,-(SP) ;SAVE R5 A MOMENT SUB #4,SP ;I/O STATUS ON STACK MOV SP,R5 ;R5 POINTS TO STATUS AREA MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) SUB #100,SP ;SAVE DATA CELL ON STACK CMP R3,#74 ;CHECK # BYTES TO EMIT BLO 102$ ;IF OK, LEAVE ALONE MOV #74,R3 ;ELSE CLAMP # TO WRITE TO 74 OCTAL 102$: MOV SP,R4 ;PUT DATA ON STACK MOV R4,-(SP) MOV R3,-(SP) MOV R5,-(SP) JSR PC,@#..BLXI ;TRANSFER DATA TO TASK SPACE BCC 106$ ;IF OK, GO ON ADD #6,SP ;"RESTORE" R5,R3,R4 BR 101$ ;THEN CLEAN UP, BUG OUT 106$: MOV (SP)+,R5 ;GET BACK CALL R5,4,3 MOV (SP)+,R3 MOV (SP)+,R4 ;THUS, IF ..BLXI HAS ERROR, DO NO QIO. QIOW$S #IO.WVB,#COLUN,#COEFN,,R5,, ; IGNORE ANY ERRORS 101$: ADD #100,SP MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 ADD #4,SP MOV (SP)+,R5 ;RESTORE R5 100$: .ENDC MOV R3,R4 ;NO. OF BYTES "WRITTEN" MOV #IS.SUC,R3 ;SUCCESS COMPLETION CODE BR IOFIN ;DONE ; READ: MOV R.PB+2(R1),R3 ;GET NO. OF BYTES TO READ MOV R.PB(R1),R2 ;GET VIRTUAL BUFFER ADDRESS CLR R5 ;READ (TRANSFER DIRECTION) JSR PC,@#..VXFR ;VERIFY TRANSFER BCS ILLMRQ ;BUFFER IS ILLEGAL MOV #IE.EOF,R3 ;SET END-OF-FILE STATUS BR IOVER ;DONE ; .SBTTL ERROR CODES AND I/O COMPLETION ; UNRFN: MOV #IE.IFC,R3 ;ILLEGAL FUNCTION CODE BR IOVER ; ILLMRQ: MOV #IE.SPC,R3 ;INVALID BUFFER SPECIFICATION BR IOVER ; DTFAIL: MOV #IE.DNA,R3 ;DEVICE NOT ATTACHED BR IOVER ; ATFAIL: MOV #IE.DAA,R3 ;DEVICE ALREADY ATTACHED BR IOVER ; NOPRIV: MOV #IE.PRI,R3 ;PRIVILEDGE VIOLATION BR IOVER ; IOSUCC: MOV #IS.SUC,R3 ;I/O FUNCTION SUCCEEDED IOVER: CLR R4 ;ZERO BYTES TRANSFERED IOFIN: MOV R.FC(R1),R0 ;GET I/O FUCNTION CODE BIC #177400,R3 ;MASK COMPLETION CODE TO 8 BITS CLR R2 ;ADJUSTMENT TO UNITY JSR PC,@#..IODN ;DO I/O COMPLETION PROCESSING BIC #^C,R0 ;ELIMINATE ALL BUT EXPRESS BIT CLR NRNA(R0) ;CLEAR PROPER RNA WORD TO ALLOW DQ-ING JMP CHECK ;LOOK FOR MORE THINGS TO DO ; .SBTTL UNIT ID TABLE (UIT) AND FUNCTION DISPATCH TABLE (FDT) ; GBUIT: .WORD GBFDT ;POINTER TO FUNCTION DISPATCH TABLE .BYTE 1,0 ;ONE UNIT HANDLER .WORD 0,0,0 ;RESERVED PUDPTR: .WORD GBUNIT ;UNIT NO. (BECOMES POINTER TO PUD) NRNA: .WORD 0 ;NORMAL REQUEST NODE ADDRESS .WORD 0 ;EXPRESS REQUEST NODE ADDRESS ; .MACRO FD L,H,ADDR ;FDT TABLE ENTRIES .BYTE L,H .WORD ADDR .ENDM ; GBFDT = .-4 FUN0: FD 000,000,SPECFN ;SPECIAL FUNCTIONS (0) FUNSZ = .-FUN0 ;FDT ENTRY LENGTH FD 010,162,WRITE ;WRITE LOGICAL (1) FD 010,161,READ ;READ LOGICAL (2) FD 020,160,ATTACH ;ATTACH (3) FD 020,160,DETACH ;DETACH (4) FD 010,000,UNRFN ;CONTROL (5) FD 140,160,UNRFN ;(6) FD 140,160,UNRFN ;(7) FD 140,160,UNRFN ;(10) FD 140,160,UNRFN ;FIND FILE (11) FD 140,160,UNRFN ;(12) FD 140,160,UNRFN ;REMOVE FILE (13) FD 140,160,UNRFN ;ENTER FILE (14) FD 140,161,IOSUCC ;ACCESS FOR READ (15) FD 140,163,IOSUCC ;ACCESSS FOR WRITE (16) FD 140,167,IOSUCC ;ACCESS FOR EXTEND (17) FD 100,160,IOSUCC ;DEACCESS (20) FD 100,161,READ ;READ VIRTUAL (21) FD 100,162,WRITE ;WRITE VIRTUAL (22) NFUNS = <.-FUN0>/FUNSZ ;NUMBER OF FUNCTIONS ; IDLDPB: WTLO$ 0,NREFM1!XREFM1 ;WAIT FOR MULTIPLE FLAGS DPB ; EXITFL: .WORD 0 ;HANDLER EXIT FLAG ; .END GBSTRT