EXCP provides a SVC interface to schedule I/O requests. The IOB is the parameter list for the SVC.
000000 6 S000EXCP CSECT ,
000000 18CF 7 LR R12,R15 SET BASE
00000 8 USING S000EXCP,R12 REGISTER
9 *
000002 18A1 10 LR R10,R1 COPY IOB POINTER
00000 11 USING @IOB,R10
12 *
000004 9180 A014 00014 13 TM IOBFLG4,IOBFUCBP NO DCB, IOBDCBPT PTS TO UCB
000008 47E0 C0FC 000FC 14 BNO EXCP990 NO - CAN'T DEAL WITH IT NOW
15 *
00000C 1F44 16 SLR R4,R4
00000E BF47 A015 00015 17 ICM R4,B'0111',IOBDCBPT GET UCB ADDRESS
00000 18 USING @UCB,R4
The IOB address is saved into Register 10. For now since we haven’t defined the Data Control Block (DCB) we only accept requests passing the UCB address instead of the DCB address.
000012 5810 0010 00010 20 L R1,16 CVT
000016 5810 1008 00008 21 L R1,CVTUCB-@CVT(,R1) UCB TABLE
00001A 22 EXCP010 DS 0H
00001A D501 C15C 4004 0015C 00004 23 CLC =X'FFFF',UCBCUA END OF THE LINE
000020 4780 C0DC 000DC 24 BE EXCP900 BAD UCB ADDRESS
25 *
000024 1914 26 CR R1,R4 UCB WE ARE LOOKING FOR
000026 4780 C032 00032 27 BE EXCP020 YES - WE FOUND IT
28 *
00002A 5810 1000 00000 29 L R1,0(,R1) NEXT UCB
00002E 47F0 C01A 0001A 30 B EXCP010 LOOP BACK
The UCB address is validated.
000032 33 EXCP020 DS 0H
000032 9180 4007 00007 34 TM UCBSTAT,UCBSONLN IS UCB ONLINE
000036 47E0 C0E4 000E4 35 BNO EXCP910 NO - CAN'T DO I/O
36 *
00003A 4110 006C 0006C 37 LA R1,IORBLEN LENGTH OF IORB
00003E BF18 C15E 0015E 38 ICM R1,B'1000',=AL1(128) SP ID
39 @CALL GETMAIN
000042 58F0 0014 00014 40+ L R15,20 MVT ADDRESS
000046 58F0 F018 00018 41+ L R15,MVTGMAIN-@MVT(,R15) ROUTINE ADDRESS
00004A 05EF 42+ BALR R14,R15
00004C 12FF 43 LTR R15,R15 CHECK FOR STORAGE RETURNED
00004E 4770 C0EC 000EC 44 BNZ EXCP920
45 *
000052 18B1 46 LR R11,R1 IORB ADDRESS
00000 47 USING @IORB,R11
48 *
000054 4110 0060 00060 49 LA R1,TCBLEN LENGTH OF TCB
000058 BF18 C15E 0015E 50 ICM R1,B'1000',=AL1(128) SP ID
51 @CALL GETMAIN
00005C 58F0 0014 00014 52+ L R15,20 MVT ADDRESS
000060 58F0 F018 00018 53+ L R15,MVTGMAIN-@MVT(,R15) ROUTINE ADDRESS
000064 05EF 54+ BALR R14,R15
000066 12FF 55 LTR R15,R15
000068 4770 C0EC 000EC 56 BNZ EXCP920
57 *
00006C 1891 58 LR R9,R1 TCB ADDRESS
00000 59 USING @TCB,R9
If the UCB is offline the request is rejected. Now we allocate storage for a IORB that will be passed to the Schedule I/O routine. We also allocate storage for a TCB that will be added to the dispatch queue when the I/O request has been completed by the device.
00006E D76B B000 B000 00000 00000 61 XC 0(IORBLEN,R11),0(R11) CLEAR IORB STORAGE 000074 5040 B004 00004 62 ST R4,IORBUCB UCB ADDRESS 000078 50A0 B008 00008 63 ST R10,IORBIOB IOB ADDRESS 00007C 1F11 64 SLR R1,R1 00007E BF17 A011 00011 65 ICM R1,B'0111',IOBSTART GET CCW ADDRESS 000082 5010 B00C 0000C 66 ST R1,IORBCCW CCW ADDRESS 000086 5090 B010 00010 67 ST R9,IORBTCB TCB ADDRESS 00008A 4110 C0CE 000CE 68 LA R1,EXCPDIE DIE ROUTINE 00008E 5010 B014 00014 69 ST R1,IORBDIE DIE ROUTINE ADDRESS
Now we set up the IORB with the necessary pointers. The UCB, CCW and IOB addresses come from the IOB.
000092 D75F 9000 9000 00000 00000 71 XC 0(TCBLEN,R9),0(R9) CLEAR TCB 000098 D207 9018 C158 00018 00158 72 MVC TCBPSW,=X'FF000000' 00009E 4110 C10E 0010E 73 LA R1,BACKEND BACK END EXCP ROUTINE 0000A2 5010 901C 0001C 74 ST R1,TCBPSW+4 0000A6 5010 905C 0005C 75 ST R1,TCBREG15 SET EP IN R15 0000AA 50B0 9024 00024 76 ST R11,TCBREG1 SAVE IORB ADDRESS IN R1 0000AE 4110 C0D0 000D0 77 LA R1,EXCPRET RETURN SVC 0000B2 5010 9058 00058 78 ST R1,TCBREG14 SAVE AS R14
Now we set up the TCB to be ready for dispatch. We build a PSW with interrupts enabled. The instruction address in the PSW points to our EXCP back end processing routine. We also place that address into the Register 15 area and we place the IORB address in the Register 1 area. When the TCB is dispatched execution will begin at our EXCP back end routine, R15 will contain the address of the routine and R1 will contain the address of the IORB. The TCB storage will be freed when the back end routine exits via SVC 3.
0000B6 4110 B000 00000 80 LA R1,@IORB
81 @CALL STARTIO
0000BA 58F0 0014 00014 82+ L R15,20 MVT ADDRESS
0000BE 58F0 F030 00030 83+ L R15,MVTSIO-@MVT(,R15) ROUTINE ADDRESS
0000C2 05EF 84+ BALR R14,R15
85 *
86 @CALL EXIT
0000C4 58F0 0014 00014 87+ L R15,20 MVT ADDRESS
0000C8 58F0 F024 00024 88+ L R15,MVTEXIT-@MVT(,R15) ROUTINE ADDRESS
0000CC 05EF 89+ BALR R14,R15
Now we call the Schedule I/O routine passing it the address of our IORB. Once the I/O is scheduled we can exit the SVC routine.
0000CE 92 EXCPDIE DS 0H 0000CE 07FE 93 BR R14
Our Disabled Interrupt Exit simply returns back to the caller.
0000D0 96 EXCPRET DS 0H
97 @CALL EXIT
0000D0 58F0 0014 00014 98+ L R15,20 MVT ADDRESS
0000D4 58F0 F024 00024 99+ L R15,MVTEXIT-@MVT(,R15) ROUTINE ADDRESS
0000D8 05EF 100+ BALR R14,R15
0000DA 0A03 101 SVC 3
Here we exit via the Exit routine.
0000DC 104 EXCP900 DS 0H
0000DC 4110 0100 00100 105 LA R1,X'100' ABEND CODE
0000E0 47F0 C104 00104 106 B EXCP999
107 *
0000E4 108 EXCP910 DS 0H
0000E4 4110 0200 00200 109 LA R1,X'200'
0000E8 47F0 C104 00104 110 B EXCP999
111 *
0000EC 112 EXCP920 DS 0H
0000EC 4110 0300 00300 113 LA R1,X'300'
0000F0 47F0 C104 00104 114 B EXCP999
115 *
0000F4 116 EXCP930 DS 0H
0000F4 4110 0900 00900 117 LA R1,X'900'
0000F8 47F0 C104 00104 118 B EXCP999
119 *
0000FC 120 EXCP990 DS 0H
0000FC 4110 0F00 00F00 121 LA R1,X'F00'
000100 47F0 C104 00104 122 B EXCP999
123 *
000104 124 EXCP999 DS 0H
125 @CALL ABEND
000104 58F0 0014 00014 126+ L R15,20 MVT ADDRESS
000108 58F0 F020 00020 127+ L R15,MVTABEND-@MVT(,R15) ROUTINE ADDRESS
00010C 05EF 128+ BALR R14,R15
These are the various Abend exit points. An Abend code is placed into Register 1 and the Abend routine is called. The Abend routine does not return back to the caller.
131 DROP R4,R9,R10,R11,R12
133 *
00010E 134 BACKEND DS 0H
00010E 18CF 135 LR R12,R15 ESTABLISH BASE
0010E 136 USING BACKEND,R12 REGISTER
137 *
000110 18B1 138 LR R11,R1 IORB ADDRESS
00000 139 USING @IORB,R11
140 *
000112 58A0 B008 00008 141 L R10,IORBIOB IOB ADDRESS
00000 142 USING @IOB,R10
The EXCP BACKEND routine is executed when the TCB we passed to the Schedule I/O routine is dispatched after the I/O is completed by the device. The I/O Interruption routine places the TCB on the Dispatcher queue.
000116 D200 A002 B022 00002 00022 144 MVC IOBSENS0,IORBSEN0 COPY 00011C D200 A003 B023 00003 00023 145 MVC IOBSENS1,IORBSEN1 SENSE BYTES 000122 D206 A009 B025 00009 00025 146 MVC IOBCSW,IORBCSW+1 COPY CSW 000128 D200 A004 B021 00004 00021 147 MVC IOBECBCC,IORBECBC COPY I/O COMPLETION CODE
We start by copying status information from the IORB into the IOB.
00012E 1F11 149 SLR R1,R1
000130 BF17 A005 00005 150 ICM R1,B'0111',IOBECBPT GET ECB ADDRESS
151 @CALL POST
000134 58F0 0014 00014 152+ L R15,20 MVT ADDRESS
000138 58F0 F028 00028 153+ L R15,MVTPOST-@MVT(,R15) ROUTINE ADDRESS
00013C 05EF 154+ BALR R14,R15
155 *
00013E 4100 B000 00000 156 LA R0,@IORB POINT TO IORB
000142 BF18 C050 0015E 157 ICM R1,B'1000',=AL1(128) SP ID
158 @CALL FREEMAIN
000146 58F0 0014 00014 159+ L R15,20 MVT ADDRESS
00014A 58F0 F01C 0001C 160+ L R15,MVTFMAIN-@MVT(,R15) ROUTINE ADDRESS
00014E 05EF 161+ BALR R14,R15
162 *
000150 0A03 163 SVC 3 EXIT
We Post the ECB pointed to by the IOB before we free the IORB storage and exit via SVC 3.
[Next – ]