COMPILATION LISTING OF SEGMENT ioi_set Compiled by: Multics PL/I Compiler, Release 32f, of October 9, 1989 Compiled at: Bull HN, Phoenix AZ, System-M Compiled on: 11/11/89 1017.1 mst Sat Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Bull Inc., 1987 * 4* * * 5* * Copyright, (C) Honeywell Information Systems Inc., 1983 * 6* * * 7* *********************************************************** */ 8 9 10 /****^ HISTORY COMMENTS: 11* 1) change(86-03-04,CLJones), approve(86-07-30,MCR7461), 12* audit(86-07-31,Coren), install(86-08-19,MR12.0-1120): 13* Allow workspace size to be changed when direct channels aren't active; 14* allow a status queue for devices attached to direct channels. 15* 2) change(86-11-17,Farley), approve(86-11-20,MECR0002), 16* audit(86-11-19,Fawcett), install(86-11-20,MR12.0-1222): 17* Added check for channel being deleted or already deleted to the 18* channel_required entry. It will now return a non-zero error code for these 19* cases. 20* 3) change(86-12-19,Farley), approve(86-12-19,MCR7587), 21* audit(86-12-19,Fawcett), install(87-01-05,MR12.0-1253): 22* Formal installation to close out above MECR0002. 23* END HISTORY COMMENTS */ 24 25 26 /* Entries to set various IOI parameters (timeout, event channel, etc.) */ 27 /* Started by Charlie Hornig, finished by Chris Jones. */ 28 /* Modified 1984-08-09 BIM for direct channel support */ 29 /* Modified March 1985 by Keith Loepere to properly copy arguments. */ 30 31 /* format: style4,delnl,insnl,indattr,ifthen,dclind10 */ 32 ioi_set: 33 procedure; 34 35 dcl p_channel fixed bin (7) parameter; 36 dcl p_code fixed bin (35) parameter; 37 dcl p_devx fixed bin parameter; 38 dcl p_evchn fixed bin (71) parameter; 39 dcl p_iom fixed bin (3) parameter; 40 dcl p_count fixed bin parameter; 41 dcl p_offset fixed bin (18) parameter; 42 dcl p_ring fixed bin (3) parameter; 43 dcl p_time fixed bin (71) parameter; 44 dcl p_workspace_ptr ptr parameter; 45 dcl p_workspace_size fixed bin (19) parameter; 46 47 dcl chanid char (8) aligned; 48 dcl channel fixed bin (7); 49 dcl code fixed bin (35); 50 dcl devx fixed bin; 51 dcl evchn fixed bin (71); 52 dcl iom fixed bin (3); 53 dcl n_entries fixed bin; 54 dcl offset fixed bin (18); 55 dcl ring fixed bin (3); 56 dcl time fixed bin (71); 57 dcl workspace_ptr ptr; 58 dcl workspace_size fixed bin (19); 59 60 dcl error_table_$bad_channel 61 fixed bin (35) ext static; 62 dcl error_table_$bad_ring_brackets 63 fixed bin (35) ext static; 64 dcl error_table_$buffer_big 65 fixed bin (35) ext static; 66 dcl error_table_$chnl_already_deleted 67 fixed bin (35) ext static; 68 dcl error_table_$chnl_being_deleted 69 fixed bin (35) ext static; 70 dcl error_table_$dev_offset_out_of_bounds 71 fixed bin (35) ext static; 72 dcl error_table_$device_active 73 fixed bin (35) ext static; 74 dcl error_table_$no_operation 75 fixed bin (35) ext static; 76 dcl error_table_$time_too_long 77 fixed bin (35) ext static; 78 79 dcl pds$validation_level fixed bin (3) external; 80 dcl sys_info$page_size fixed bin external; 81 dcl sys_info$seg_size_256K fixed bin external; 82 83 dcl ioi_page_table$get entry (fixed bin (19), fixed bin, fixed bin (35)); 84 dcl ioi_page_table$ptx_to_ptp 85 entry (fixed bin) returns (ptr); 86 dcl ioi_page_table$put entry (fixed bin, fixed bin (35)); 87 dcl ioi_device$get_dtep entry (fixed bin, ptr, fixed bin (35)); 88 dcl ioi_device$unlock entry (ptr); 89 dcl ioi_usurp_channels$required 90 entry (ptr, fixed bin (35)); 91 dcl ioi_wire$unwire entry (ptr); 92 dcl ioi_workspace$set_rb entry (ptr, fixed bin (35)); 93 dcl ioi_workspace$set_max_size 94 entry (ptr, fixed bin (35)); 95 96 dcl (divide, null, ptr, rel, size) 97 builtin; 98 99 return; 100 101 /* * * * * * * * * * TIMEOUT * * * * * * * * * */ 102 103 /* Entry to set the time allowed for an I/O operation to complete on this device. If the device runs longer 104* than this, it is stopped and the caller receives a timeout status. */ 105 106 timeout: 107 entry (p_devx, p_time, p_code); 108 109 time = p_time; 110 call check_devx; 111 112 if dte.direct then do; 113 call unlock; 114 p_code = error_table_$no_operation; 115 return; 116 end; 117 118 if (time > dte.max_timeout) & ^dte.priv then do; 119 call unlock; 120 p_code = error_table_$time_too_long; 121 return; 122 end; 123 124 dte.timeout = time; 125 call unlock; 126 p_code = code; 127 return; 128 129 /* * * * * * * * * * MAX_TIMEOUT * * * * ** * * * */ 130 131 /* Privileged entry to set the maximum the timeout value is allowed to be set to. */ 132 133 max_timeout: 134 entry (p_devx, p_time, p_code); 135 136 time = p_time; 137 call check_devx; 138 139 dte.max_timeout = time; 140 call unlock; 141 p_code = code; 142 return; 143 144 /* * * * * * * * * * EVENT * * * * * * * * * */ 145 146 /* Entry to set the event channel over which status events are signalled for a device. */ 147 148 event: 149 entry (p_devx, p_evchn, p_code); 150 151 evchn = p_evchn; 152 call check_devx; 153 154 dte.ev_chn = evchn; 155 call unlock; 156 p_code = code; 157 return; 158 159 /* * * * * * * * * WORKSPACE * * * * * * * * * */ 160 161 /* Entry to set the current size of the workspace. */ 162 163 workspace: 164 entry (p_devx, p_workspace_ptr, p_workspace_size, p_code); 165 166 workspace_size = 167 divide (p_workspace_size + sys_info$page_size - 1, sys_info$page_size, 17) * sys_info$page_size; 168 p_workspace_ptr, workspace_ptr = null (); 169 call check_devx; 170 171 if dte.active then do; 172 call unlock; 173 p_code = error_table_$device_active; 174 return; 175 end; 176 177 if (workspace_size <= 0) | (workspace_size > dte.max_bound) then do; 178 call unlock; 179 p_code = error_table_$buffer_big; 180 return; 181 end; 182 183 if workspace_size < dte.status_offset + dte.status_entries * size (istat) then do; 184 call unlock; 185 p_code = error_table_$dev_offset_out_of_bounds; 186 return; 187 end; 188 189 190 if dte.workspace_wired then 191 call ioi_wire$unwire (dtep); /* can't be wired */ 192 193 dte.bound = workspace_size; 194 if dte.ptx ^= 0 then do; 195 call ioi_page_table$put (dte.ptx, code); 196 dte.ptx = 0; /* so we won't try again */ 197 call quit_if_error; 198 end; 199 200 if dte.direct then 201 call ioi_page_table$get ((sys_info$seg_size_256K), dte.ptx, code); 202 else call ioi_page_table$get (dte.bound, dte.ptx, code); 203 call quit_if_error; 204 dte.ptp = ioi_page_table$ptx_to_ptp (dte.ptx); 205 workspace_ptr = dte.workspace_ptr; 206 call unlock; 207 208 p_workspace_ptr = workspace_ptr; 209 p_code = code; 210 return; 211 212 /* * * * * * * * * * MAX_WORKSPACE * * * * * * * * * */ 213 214 /* Privileged entry to set the maximum workspace size allowed for a device. */ 215 216 max_workspace: 217 entry (p_devx, p_workspace_size, p_code); 218 219 workspace_size = 220 divide (p_workspace_size + sys_info$page_size - 1, sys_info$page_size, 17) * sys_info$page_size; 221 call check_devx; 222 223 dte.max_bound = workspace_size; 224 call ioi_workspace$set_max_size (dtep, code); 225 call quit_if_error; 226 call unlock; 227 p_code = code; 228 return; 229 230 /* * * * * * * * * * * LEVEL * * * * * * * * * */ 231 232 /* Privileged entry to set the highest ring allowed to make IOI calls for a device. */ 233 234 level: 235 entry (p_devx, p_ring, p_code); 236 237 ring = p_ring; 238 call check_devx; 239 240 if ring < pds$validation_level then do; 241 call unlock; 242 p_code = error_table_$bad_ring_brackets; 243 return; 244 end; 245 246 dte.ring = ring; 247 call ioi_workspace$set_rb (dtep, code); 248 call quit_if_error; 249 call unlock; 250 p_code = code; 251 return; 252 253 /* * * * * * * * * * CHANNEL_REQUIRED * * * * * * * * * */ 254 255 /* Privileged entry called to set a required channel for a device. This will restrict the device 256* to running on that channel. */ 257 258 channel_required: 259 entry (p_devx, p_iom, p_channel, p_code); 260 261 iom = p_iom; 262 channel = p_channel; 263 call check_devx; 264 265 if ^dte.priv then do; /* must have a privileged assignment */ 266 call unlock; 267 p_code = error_table_$no_operation; 268 return; 269 end; 270 271 if (iom = 0) & (channel = 0) then do; /* special case, clear requirement */ 272 dte.channel_required = ""; 273 call unlock; 274 p_code = code; 275 return; 276 end; 277 278 call io_chnl_util$iom_to_name (iom, channel, chanid, code); 279 if code ^= 0 then do; /* bogus channel */ 280 call unlock; 281 p_code = error_table_$bad_channel; 282 return; 283 end; 284 285 if dte.active then do; /* device must not be running now */ 286 call unlock; 287 p_code = error_table_$device_active; 288 return; 289 end; 290 291 gtep = ptr (dtep, dte.gtep); 292 do ctep = ptr (gtep, gte.ctep) repeat ptr (ctep, cte.next_ctep) while (rel (ctep) ^= ""b); 293 if cte.chanid = chanid then do; /* found it */ 294 295 if cte.deleted then do; /* can't have a deleted channel */ 296 call unlock; 297 p_code = error_table_$chnl_already_deleted; 298 return; 299 end; 300 301 if cte.deleting then do; /* can't have this either */ 302 call unlock; 303 p_code = error_table_$chnl_being_deleted; 304 return; 305 end; 306 307 if (gte.disk_data_subsystem_idx ^= 0) & ^cte.ioi_use then 308 /* must grab channel from disk_control */ 309 if ^gte.suspend_devices then do; /* can't usurp if we're suspended */ 310 call ioi_usurp_channels$required (ctep, code); 311 if code ^= 0 then do; 312 call unlock; 313 p_code = code; 314 return; 315 end; 316 end; 317 else do; 318 call unlock; 319 p_code = error_table_$no_operation; 320 return; 321 end; 322 323 dte.channel_required = chanid; 324 call unlock; 325 p_code = code; 326 return; 327 end; 328 end; 329 330 call unlock; 331 p_code = error_table_$bad_channel; 332 return; 333 334 /* * * * * * * * * * STATUS * * * * * * * * * */ 335 336 /* Entry to set the offset (in the workspace) and number of entries in the circular status queue */ 337 338 status: 339 entry (p_devx, p_offset, p_count, p_code); 340 341 offset = p_offset; 342 n_entries = p_count; 343 call check_devx; 344 345 if (offset < 0) | (n_entries < 0) | (offset + (n_entries * size (istat)) > dte.bound) then do; 346 call unlock; 347 p_code = error_table_$dev_offset_out_of_bounds; 348 return; 349 end; 350 351 dte.status_control.status_offset = offset; 352 dte.status_control.status_entries = n_entries; 353 dte.status_control.status_entry_idx = 0; 354 call unlock; 355 p_code = code; 356 return; 357 358 /* Routine to get the dtep given the devx. It returns with dtep set and the dte locked. If it cannot do both, 359* it does not return, but passes the error code back to this program's caller. */ 360 361 check_devx: 362 procedure; 363 364 p_code, code = 0; 365 devx = p_devx; 366 call ioi_device$get_dtep (devx, dtep, code); /* cleverly setting p_code to 0 if all is cool. */ 367 if code ^= 0 then 368 goto QUIT; 369 370 end check_devx; 371 372 /* Routine to unlock the dte */ 373 374 unlock: 375 procedure; 376 377 call ioi_device$unlock (dtep); 378 379 end unlock; 380 381 quit_if_error: 382 proc; 383 384 if code ^= 0 then do; 385 call unlock; 386 goto QUIT; 387 end; 388 389 end quit_if_error; 390 391 QUIT: 392 p_code = code; 393 return; 394 1 1 /* Begin include file ...... ioi_data.incl.pl1 */ 1 2 1 3 1 4 /****^ HISTORY COMMENTS: 1 5* 1) change(85-09-09,Farley), approve(85-09-09,MCR6979), 1 6* audit(85-12-09,CLJones), install(86-03-21,MR12.0-1033): 1 7* Support for FIPS and 1 8* IMU. 1 9* 2) change(86-05-16,Kissel), approve(86-07-30,MCR7461), audit(86-07-31,Coren), 1 10* install(86-08-19,MR12.0-1120): 1 11* Changed the value of IOI_DEFAULT_MAX_BOUND from 4096 to 1024. This 1 12* corrects a problem when RCP tries to set the maximum workspace size if it 1 13* is less than 4096. Since ioi_ (actually grab_aste) touched all the pages 1 14* at assignment time, the current length is 4, and trying to set the max 1 15* length to less than 4 (e.g. because the max unprivileged workspace size in 1 16* RCP for a special device is 1) returns an error. 1 17* END HISTORY COMMENTS */ 1 18 1 19 /* Rewritten May 1982 by C. Hornig for new ioi_ */ 1 20 /* Rewrite finished March 1983 by Chris Jones */ 1 21 /* Extended for reconfiguration April 1983 by Chris Jones. */ 1 22 /* Modified November 1983 by Chris Jones to separate items in the dte protected by different locks. */ 1 23 /* Modified January 1984 by Chris Jones to add ite's. */ 1 24 /* Modified Feb 1984 by Rich Fawcett to add ipc and fips */ 1 25 /* Modified Sept 1985 by Paul Farley to add controller flag to dte. */ 1 26 1 27 /* format: style4,delnl,insnl,indattr,ifthen,dclind10 */ 1 28 1 29 dcl idp ptr; /* pointer to IOI data structure */ 1 30 dcl gtep ptr; /* pointer to channel/device group entry */ 1 31 dcl ctep ptr; /* pointer to channel table entry */ 1 32 dcl dtep ptr; /* pointer to wired device table entry */ 1 33 dcl itep ptr; /* pointer to I/O multiplexer entry */ 1 34 1 35 dcl (ioi_subsystems, ioi_devices, ioi_channels, ioi_multiplexers) 1 36 fixed bin; 1 37 dcl ioi_data$ external; /* IOI data segment */ 1 38 1 39 1 40 dcl 1 ioi_data based (idp) aligned, /* I/O Interfacer data structure */ 1 41 2 ngt fixed bin, /* number of groups */ 1 42 2 nct fixed bin, /* number of channels */ 1 43 2 ndt fixed bin, /* number of devices */ 1 44 2 nit fixed bin, /* number of IOMs */ 1 45 2 spurious_interrupts 1 46 fixed bin (35), /* interrupts with no status */ 1 47 2 reconfig_lock like lock, /* lock for reconfiguring devices, channels, etc. */ 1 48 2 flags, 1 49 3 setup bit (1) unal, /* "1"b => ioi_init has run */ 1 50 3 pad1 bit (35) unal, 1 51 2 rss_idcw bit (36), /* reset status IDCW */ 1 52 2 pad2 (6) fixed bin (35), /* pad to 16 words */ 1 53 2 dt (ioi_devices refer (ioi_data.ndt)) like dte aligned, 1 54 /* device table */ 1 55 2 gt (ioi_subsystems refer (ioi_data.ngt)) like gte aligned, 1 56 /* channel/device group table */ 1 57 2 ct (ioi_channels refer (ioi_data.nct)) like cte aligned, 1 58 /* channel table */ 1 59 2 it (ioi_multiplexers refer (ioi_data.nit)) like ite aligned; 1 60 /* multiplexer table */ 2 1 /* Begin include file hc_lock.incl.pl1 BIM 2/82 */ 2 2 /* Replaced by hc_fast_lock.incl.pl1 RSC 11/84 because name of structure 2 3* encourages name conflicts. 2 4* USE HC_FAST_LOCK INSTEAD! 2 5**/ 2 6 2 7 /* Lock format suitable for use with lock$lock_fast, unlock_fast */ 2 8 2 9 /* format: style3 */ 2 10 2 11 declare lock_ptr pointer; 2 12 declare 1 lock aligned based (lock_ptr), 2 13 2 pid bit (36) aligned, /* holder of lock */ 2 14 2 event bit (36) aligned, /* event associated with lock */ 2 15 2 flags aligned, 2 16 3 notify_sw bit (1) unaligned, 2 17 3 pad bit (35) unaligned; /* certain locks use this pad, like dirs */ 2 18 2 19 /* End include file hc_lock.incl.pl1 */ 1 61 1 62 1 63 dcl 1 ite based (itep) aligned, /* I/O multiplexer table entry */ 1 64 2 model char (4), /* which flavor we are */ 1 65 2 flags, 1 66 ( 3 deleting bit (1), 1 67 3 deleted bit (1) 1 68 ) unaligned, 1 69 2 pad1 bit (16) unaligned, 1 70 2 iom_table_idx fixed bin (17) unaligned, 1 71 2 tag fixed bin (3), 1 72 2 pad2 (5) bit (36); 1 73 1 74 dcl 1 gte based (gtep) aligned, /* channel/device group table entry */ 1 75 2 lock bit (36), /* (0) loop lock */ 1 76 2 name char (4), /* (1) subsystem name */ 1 77 2 dtep bit (18) unaligned, /* (2) rel ptr to device just serviced */ 1 78 2 ctep bit (18) unaligned, /* (2) rel ptr to thread of channel table entries */ 1 79 2 detailed_status_cmd 1 80 bit (6) unal, /* (3) idcw command to read detailed status */ 1 81 2 flags unaligned, /* (3) */ 1 82 3 psia bit (1), /* "1"b if channel is PSIA */ 1 83 3 suspend_devices bit (1), /* "1"b if device I/O suspended */ 1 84 3 dual_controller bit (1), /* "1"b if dual controller subsystem (disk only) */ 1 85 3 ascii_dtst bit (1), /* "1"b if detailed status sent in ASCII mode */ 1 86 3 mplex bit (1), /* "1"b if channels are multiplexed among devices */ 1 87 3 ipc bit (1), /* "1"b if devices are on an IMU */ 1 88 3 fips bit (1), /* "1"b if devices start at zero */ 1 89 3 pad bit (23), 1 90 2 n_devices fixed bin, /* (4) number of devices in device table thread */ 1 91 2 pending_connects fixed bin, /* (5) count of pending connect requests */ 1 92 2 io_log_info_index fixed bin, /* (6) index into io_log_status_info table */ 1 93 2 disk_data_subsystem_idx 1 94 fixed bin; /* (7) index into disk_data.array for disks */ 1 95 1 96 dcl 1 cte based (ctep) aligned, /* channel table entry */ 1 97 2 next_ctep bit (18) unaligned, /* (0) rel ptr to next channel table entry */ 1 98 2 gtep bit (18) unaligned, /* (0) rel ptr to channel/device group table entry */ 1 99 2 flags1 unaligned, /* (1) */ 1 100 3 ioi_use bit (1), /* "1"b if channel currently being used */ 1 101 3 connected bit (1), /* "1"b if channel is connected */ 1 102 3 toss_status bit (1), /* "1"b if status is to be ignored */ 1 103 3 quiescing bit (1), /* "1"b if the channel is just finishing what it's doing */ 1 104 3 direct bit (1), /* "1"b if this is a direct channel */ 1 105 3 pad1 bit (4), 1 106 2 disktab_ctx fixed bin (9) uns unal, /* (1) index into disktab.chantab for this channel */ 1 107 2 cur_dtep bit (18) unaligned, /* (1) current device table entry */ 1 108 2 chanid char (8), /* (2) io_manager's name for channel */ 1 109 2 statusp ptr unal, /* (4) pointer to first word of status */ 1 110 2 chx fixed bin (35), /* (5) channel index for io_manager */ 1 111 2 time_limit fixed bin (71), /* (6) connect time limit */ 1 112 2 saved_status unaligned, /* (8) status repository while reading detailed status */ 1 113 3 word1 bit (36), 1 114 3 word2 bit (36), 1 115 3 word4 bit (36), 1 116 3 next_lpw_offset bit (18), 1 117 3 command bit (6), 1 118 2 pad3 bit (12) unaligned, /* (11) */ 1 119 2 base_ctep bit (18) unaligned, /* (12) rel ptr to base logical chan. of physical chan. */ 1 120 2 itep bit (18) unaligned, /* (12) rel ptr to itep */ 1 121 2 flags2 unaligned, /* (13) */ 1 122 3 deleting bit (1), /* "1"b if attempting to delete this channel */ 1 123 3 deleted bit (1), /* "1"b if channel deleted */ 1 124 2 pad4 bit (16) unaligned, /* (13) */ 1 125 2 channel_table_idx fixed bin (17) unaligned, 1 126 2 pad5 (2) bit (36); /* (14) pad to 8 word boundary */ 1 127 1 128 dcl 1 dte based (dtep) aligned, /* wired device table entry */ 1 129 2 next_dtep bit (18) unaligned, /* (0) rel ptr to next entry in thread */ 1 130 2 gtep bit (18) unaligned, /* (0) rel ptr to channel/device group table entry */ 1 131 2 cur_ctep bit (18) unaligned, /* (1) rel ptr to channel in use */ 1 132 2 flags1 unaligned, /* (1) flags protected by gte lock */ 1 133 3 connected bit (1), /* "1"b if device has a channel */ 1 134 3 log_status_cnt bit (1), /* "1"b if count in log_status is valid */ 1 135 3 reading_detailed_status 1 136 bit (1), /* "1"b if read of detailed device status in progress */ 1 137 3 pad1 bit (15), 1 138 2 channel_required char (8), /* (2) channel name of required channel */ 1 139 2 ev_chn fixed bin (71), /* (4) event ID for status wakeups */ 1 140 2 workspace_ptr ptr, /* (6) workspace pointer */ 1 141 2 workspace_astep ptr, /* (8) workspace ASTE ptr */ 1 142 2 workspace_sdw fixed bin (71), /* (10) SDW of workspace segment */ 1 143 2 ptp ptr, /* (12) device page table */ 1 144 2 max_bound fixed bin (19), /* (14) largest allowable bound of workspace segment */ 1 145 2 bound fixed bin (19), /* (15) bound of workspace */ 1 146 2 process_id bit (36), /* (16) ID of process owning device */ 1 147 2 ring fixed bin (3), /* (17) highest ring allowed to access device */ 1 148 2 device bit (6) unal, /* (18) device code */ 1 149 2 flags2 unal, /* (18) constant or protected by dte lock */ 1 150 3 priv bit (1), /* "1"b if privileged user */ 1 151 3 in_use bit (1), /* "1"b if device is to be used */ 1 152 3 deleting bit (1), /* "1"b if trying to delete this device */ 1 153 3 deleted bit (1), /* "1"b if this device is deleted */ 1 154 3 suspended bit (1), /* "1"b if device isn't to be used temporarily */ 1 155 3 workspace_wired bit (1), /* "1"b if workspace is wired */ 1 156 3 direct bit (1), /* "1"b if device is connected to a direct channel */ 1 157 3 controller bit (1), /* "1"b if dte for the devices controller */ 1 158 3 pad2 bit (4), 1 159 2 device_table_idx fixed bin (17) unaligned, 1 160 2 listx uns fixed bin (18) unal, /* (19) DCW list index for connect */ 1 161 2 idcw_listx uns fixed bin (18) unal, /* (19) DCW list index of IDCW */ 1 162 2 timeout fixed bin (35), /* (20) time limit for I/O completion (usec) */ 1 163 2 max_timeout fixed bin (35), /* (21) maximum allowable timeout grace time (usec) */ 1 164 2 unwire_time fixed bin (71), /* (22) when to unwire the workspace */ 1 165 2 pcw bit (36), /* (24) peripheral control word (PCW) */ 1 166 2 status_control, /* (25) */ 1 167 3 status_offset fixed bin (18) unsigned unaligned, 1 168 /* offset of status queue in user workspace */ 1 169 3 status_entries fixed bin (9) unsigned unaligned, 1 170 /* number of entries in status queue */ 1 171 3 status_entry_idx fixed bin (9) unsigned unaligned, 1 172 /* next entry to be used */ 1 173 2 idcw bit (36), /* (26) instruction DCW (KEEP ON EVEN WORD BOUNDARY) */ 1 174 2 tdcw bit (36), /* (27) transfer DCW to remainder of list */ 1 175 2 special_status bit (36), /* (28) special interrupt status */ 1 176 2 lock like lock, /* (29) wait lock */ 1 177 2 log_status, /* (32) */ 1 178 ( 3 level fixed bin (3) unsigned, 1 179 3 time_out bit (1), 1 180 3 type bit (2), 1 181 3 command bit (6), 1 182 3 count fixed bin (6) unsigned, 1 183 3 channel bit (18), 1 184 3 status bit (36) 1 185 ) unaligned, 1 186 2 ptx fixed bin, /* (34) index of page table */ 1 187 2 active bit (1), /* (35) "1"b if device running or to run */ 1 188 2 special_interrupt bit (1), /* (36) "1"b if special interrupt received */ 1 189 2 detailed_status_valid 1 190 bit (1), /* (37) "1"b if detailed status read sucessfully */ 1 191 2 last_log_time fixed bin (71), /* (38) when status was last logged */ 1 192 2 detailed_status (8) bit (36), /* (40) (buffer for reading most recent detailed status */ 1 193 2 log_detailed_status 1 194 (8) bit (36); /* (48) copy of last detailed status logged */ 1 195 1 196 /**** Defaults for various I/O parameters */ 1 197 1 198 dcl IOI_DEFAULT_MAX_BOUND fixed bin (19) static options (constant) init (1024); 1 199 dcl IOI_DEFAULT_MAX_TIMEOUT 1 200 fixed bin (35) static options (constant) init (30000000); 1 201 dcl IOI_DEFAULT_TIMEOUT fixed bin (35) static options (constant) init (30000000); 1 202 1 203 dcl IO_STATUS_ERROR_MASK bit (36) static options (constant) init ("370000770000"b3); 1 204 1 205 dcl IO_CHANNEL_LOCK_TEMPLATE 1 206 char (2) int static options (constant) init ("ch"); 1 207 dcl IOI_DEVICE_LOCK_EVENT_TEMPLATE 1 208 char (2) static options (constant) init ("dv"); 1 209 1 210 /* End of include file ...... ioi_data.incl.pl1 */ 395 396 3 1 3 2 /* Begin include file ...... ioi_stat.incl.pl1 */ 3 3 /* Last modified 3/24/75 by Noel I. Morris */ 3 4 3 5 dcl isp ptr; /* pointer to status structure */ 3 6 3 7 dcl 1 istat based (isp) aligned, /* I/O Interfacer status structure */ 3 8 2 completion, /* completion flags */ 3 9 (3 st bit (1), /* "1"b if status returned */ 3 10 3 er bit (1), /* "1"b if status indicates error condition */ 3 11 3 run bit (1), /* "1"b if channel still running */ 3 12 3 time_out bit (1)) unal, /* "1"b if time-out occurred */ 3 13 2 level fixed bin (3), /* IOM interrupt level */ 3 14 2 offset fixed bin (18), /* DCW list offset */ 3 15 2 absaddr fixed bin (24), /* absolute address of workspace */ 3 16 2 iom_stat bit (72), /* IOM status */ 3 17 2 lpw bit (72); /* LPW residue */ 3 18 3 19 dcl imp ptr; /* pointer to message structure */ 3 20 3 21 dcl 1 imess based (imp) aligned, /* I/O Interfacer event message structure */ 3 22 (2 completion like istat.completion, /* completion flags */ 3 23 2 pad bit (11), 3 24 2 level bit (3), /* interrupt level */ 3 25 2 offset bit (18), /* DCW list offset */ 3 26 2 status bit (36)) unal; /* first 36 bits of status */ 3 27 3 28 /* End of include file ...... ioi_stat.incl.pl1 */ 3 29 397 398 4 1 /* START OF: io_chnl_util_dcls.incl.pl1 * * * * * * * * * * * * * * * * */ 4 2 4 3 /* Written by Charles Hornig, 1st quarter 1981 */ 4 4 /* Canonicalization entry added by Chris Jones, January 1984 */ 4 5 4 6 /* chanid = canonicalize_chanid (chanid); */ 4 7 /* format: style4,delnl,insnl,indattr,ifthen,dclind10 */ 4 8 dcl io_chnl_util$canonicalize_chanid 4 9 entry (char (8) aligned) returns (char (8) aligned); 4 10 4 11 /* call iom_to_name (iomno, channo, name, code); */ 4 12 dcl io_chnl_util$iom_to_name 4 13 entry (fixed bin (3), fixed bin (7), char (8) aligned, fixed bin (35)); 4 14 4 15 /* call name_to_iom (name, iomno, channo, code); */ 4 16 dcl io_chnl_util$name_to_iom 4 17 entry (char (8) aligned, fixed bin (3), fixed bin (7), fixed bin (35)); 4 18 4 19 /* END OF: io_chnl_util_dcls.incl.pl1 * * * * * * * * * * * * * * * * */ 399 400 401 end ioi_set; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 11/11/89 0801.3 ioi_set.pl1 >spec>install>1110>ioi_set.pl1 395 1 09/02/86 1552.9 ioi_data.incl.pl1 >ldd>include>ioi_data.incl.pl1 1-61 2 01/06/85 1422.1 hc_lock.incl.pl1 >ldd>include>hc_lock.incl.pl1 397 3 08/17/79 2215.0 ioi_stat.incl.pl1 >ldd>include>ioi_stat.incl.pl1 399 4 07/11/84 0937.3 io_chnl_util_dcls.incl.pl1 >ldd>include>io_chnl_util_dcls.incl.pl1 NAMES DECLARED IN THIS COMPILATION. IDENTIFIER OFFSET LOC STORAGE CLASS DATA TYPE ATTRIBUTES AND REFERENCES (* indicates a set context) NAMES DECLARED BY DECLARE STATEMENT. active 43 based bit(1) level 2 dcl 1-128 ref 171 285 bound 17 based fixed bin(19,0) level 2 dcl 1-128 set ref 193* 202* 345 chanid 000100 automatic char(8) dcl 47 in procedure "ioi_set" set ref 278* 293 323 chanid 2 based char(8) level 2 in structure "cte" dcl 1-96 in procedure "ioi_set" ref 293 channel 000102 automatic fixed bin(7,0) dcl 48 set ref 262* 271 278* channel_required 2 based char(8) level 2 dcl 1-128 set ref 272* 323* code 000103 automatic fixed bin(35,0) dcl 49 set ref 126 141 156 195* 200* 202* 209 224* 227 247* 250 274 278* 279 310* 311 313 325 355 364* 366* 367 384 391 completion based structure level 2 dcl 3-7 cte based structure level 1 dcl 1-96 ctep 2(18) based bit(18) level 2 in structure "gte" packed packed unaligned dcl 1-74 in procedure "ioi_set" ref 292 ctep 000124 automatic pointer dcl 1-31 in procedure "ioi_set" set ref 292* 292* 293 295 301 307 310* 328 328 deleted 15(01) based bit(1) level 3 packed packed unaligned dcl 1-96 ref 295 deleting 15 based bit(1) level 3 packed packed unaligned dcl 1-96 ref 301 devx 000104 automatic fixed bin(17,0) dcl 50 set ref 365* 366* direct 22(12) based bit(1) level 3 packed packed unaligned dcl 1-128 ref 112 200 disk_data_subsystem_idx 7 based fixed bin(17,0) level 2 dcl 1-74 ref 307 divide builtin function dcl 96 ref 166 219 dte based structure level 1 dcl 1-128 dtep 000126 automatic pointer dcl 1-32 set ref 112 118 118 124 139 154 171 177 183 183 190 190* 193 194 195 196 200 200 202 202 204 204 205 223 224* 246 247* 265 272 285 291 291 323 345 351 352 353 366* 377* error_table_$bad_channel 000010 external static fixed bin(35,0) dcl 60 ref 281 331 error_table_$bad_ring_brackets 000012 external static fixed bin(35,0) dcl 62 ref 242 error_table_$buffer_big 000014 external static fixed bin(35,0) dcl 64 ref 179 error_table_$chnl_already_deleted 000016 external static fixed bin(35,0) dcl 66 ref 297 error_table_$chnl_being_deleted 000020 external static fixed bin(35,0) dcl 68 ref 303 error_table_$dev_offset_out_of_bounds 000022 external static fixed bin(35,0) dcl 70 ref 185 347 error_table_$device_active 000024 external static fixed bin(35,0) dcl 72 ref 173 287 error_table_$no_operation 000026 external static fixed bin(35,0) dcl 74 ref 114 267 319 error_table_$time_too_long 000030 external static fixed bin(35,0) dcl 76 ref 120 ev_chn 4 based fixed bin(71,0) level 2 dcl 1-128 set ref 154* evchn 000106 automatic fixed bin(71,0) dcl 51 set ref 151* 154 flags 3(06) based structure level 2 packed packed unaligned dcl 1-74 flags1 1 based structure level 2 packed packed unaligned dcl 1-96 flags2 22(06) based structure level 2 in structure "dte" packed packed unaligned dcl 1-128 in procedure "ioi_set" flags2 15 based structure level 2 in structure "cte" packed packed unaligned dcl 1-96 in procedure "ioi_set" gte based structure level 1 dcl 1-74 gtep 0(18) based bit(18) level 2 in structure "dte" packed packed unaligned dcl 1-128 in procedure "ioi_set" ref 291 gtep 000122 automatic pointer dcl 1-30 in procedure "ioi_set" set ref 291* 292 292 307 307 io_chnl_util$iom_to_name 000062 constant entry external dcl 4-12 ref 278 ioi_device$get_dtep 000046 constant entry external dcl 87 ref 366 ioi_device$unlock 000050 constant entry external dcl 88 ref 377 ioi_page_table$get 000040 constant entry external dcl 83 ref 200 202 ioi_page_table$ptx_to_ptp 000042 constant entry external dcl 84 ref 204 ioi_page_table$put 000044 constant entry external dcl 86 ref 195 ioi_use 1 based bit(1) level 3 packed packed unaligned dcl 1-96 ref 307 ioi_usurp_channels$required 000052 constant entry external dcl 89 ref 310 ioi_wire$unwire 000054 constant entry external dcl 91 ref 190 ioi_workspace$set_max_size 000060 constant entry external dcl 93 ref 224 ioi_workspace$set_rb 000056 constant entry external dcl 92 ref 247 iom 000110 automatic fixed bin(3,0) dcl 52 set ref 261* 271 278* isp automatic pointer dcl 3-5 ref 183 345 istat based structure level 1 dcl 3-7 ref 183 345 ite based structure level 1 dcl 1-63 lock based structure level 1 dcl 2-12 max_bound 16 based fixed bin(19,0) level 2 dcl 1-128 set ref 177 223* max_timeout 25 based fixed bin(35,0) level 2 dcl 1-128 set ref 118 139* n_entries 000111 automatic fixed bin(17,0) dcl 53 set ref 342* 345 345 352 next_ctep based bit(18) level 2 packed packed unaligned dcl 1-96 ref 328 null builtin function dcl 96 ref 168 offset 000112 automatic fixed bin(18,0) dcl 54 set ref 341* 345 345 351 p_channel parameter fixed bin(7,0) dcl 35 ref 258 262 p_code parameter fixed bin(35,0) dcl 36 set ref 106 114* 120* 126* 133 141* 148 156* 163 173* 179* 185* 209* 216 227* 234 242* 250* 258 267* 274* 281* 287* 297* 303* 313* 319* 325* 331* 338 347* 355* 364* 391* p_count parameter fixed bin(17,0) dcl 40 ref 338 342 p_devx parameter fixed bin(17,0) dcl 37 ref 106 133 148 163 216 234 258 338 365 p_evchn parameter fixed bin(71,0) dcl 38 ref 148 151 p_iom parameter fixed bin(3,0) dcl 39 ref 258 261 p_offset parameter fixed bin(18,0) dcl 41 ref 338 341 p_ring parameter fixed bin(3,0) dcl 42 ref 234 237 p_time parameter fixed bin(71,0) dcl 43 ref 106 109 133 136 p_workspace_ptr parameter pointer dcl 44 set ref 163 168* 208* p_workspace_size parameter fixed bin(19,0) dcl 45 ref 163 166 216 219 pds$validation_level 000032 external static fixed bin(3,0) dcl 79 ref 240 priv 22(06) based bit(1) level 3 packed packed unaligned dcl 1-128 ref 118 265 ptp 14 based pointer level 2 dcl 1-128 set ref 204* ptr builtin function dcl 96 ref 291 292 328 ptx 42 based fixed bin(17,0) level 2 dcl 1-128 set ref 194 195* 196* 200* 202* 204* rel builtin function dcl 96 ref 292 ring 21 based fixed bin(3,0) level 2 in structure "dte" dcl 1-128 in procedure "ioi_set" set ref 246* ring 000113 automatic fixed bin(3,0) dcl 55 in procedure "ioi_set" set ref 237* 240 246 size builtin function dcl 96 ref 183 345 status_control 31 based structure level 2 dcl 1-128 status_entries 31(18) based fixed bin(9,0) level 3 packed packed unsigned unaligned dcl 1-128 set ref 183 352* status_entry_idx 31(27) based fixed bin(9,0) level 3 packed packed unsigned unaligned dcl 1-128 set ref 353* status_offset 31 based fixed bin(18,0) level 3 packed packed unsigned unaligned dcl 1-128 set ref 183 351* suspend_devices 3(07) based bit(1) level 3 packed packed unaligned dcl 1-74 ref 307 sys_info$page_size 000034 external static fixed bin(17,0) dcl 80 ref 166 166 166 219 219 219 sys_info$seg_size_256K 000036 external static fixed bin(17,0) dcl 81 ref 200 time 000114 automatic fixed bin(71,0) dcl 56 set ref 109* 118 124 136* 139 timeout 24 based fixed bin(35,0) level 2 dcl 1-128 set ref 124* workspace_ptr 6 based pointer level 2 in structure "dte" dcl 1-128 in procedure "ioi_set" ref 205 workspace_ptr 000116 automatic pointer dcl 57 in procedure "ioi_set" set ref 168* 205* 208 workspace_size 000120 automatic fixed bin(19,0) dcl 58 set ref 166* 177 177 183 193 219* 223 workspace_wired 22(11) based bit(1) level 3 packed packed unaligned dcl 1-128 ref 190 NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. IOI_DEFAULT_MAX_BOUND internal static fixed bin(19,0) initial dcl 1-198 IOI_DEFAULT_MAX_TIMEOUT internal static fixed bin(35,0) initial dcl 1-199 IOI_DEFAULT_TIMEOUT internal static fixed bin(35,0) initial dcl 1-201 IOI_DEVICE_LOCK_EVENT_TEMPLATE internal static char(2) initial packed unaligned dcl 1-207 IO_CHANNEL_LOCK_TEMPLATE internal static char(2) initial packed unaligned dcl 1-205 IO_STATUS_ERROR_MASK internal static bit(36) initial packed unaligned dcl 1-203 idp automatic pointer dcl 1-29 imess based structure level 1 dcl 3-21 imp automatic pointer dcl 3-19 io_chnl_util$canonicalize_chanid 000000 constant entry external dcl 4-8 io_chnl_util$name_to_iom 000000 constant entry external dcl 4-16 ioi_channels automatic fixed bin(17,0) dcl 1-35 ioi_data based structure level 1 dcl 1-40 ioi_data$ external static fixed bin(17,0) dcl 1-37 ioi_devices automatic fixed bin(17,0) dcl 1-35 ioi_multiplexers automatic fixed bin(17,0) dcl 1-35 ioi_subsystems automatic fixed bin(17,0) dcl 1-35 itep automatic pointer dcl 1-33 lock_ptr automatic pointer dcl 2-11 NAMES DECLARED BY EXPLICIT CONTEXT. QUIT 001005 constant label dcl 391 set ref 367 386 channel_required 000506 constant entry external dcl 258 check_devx 001010 constant entry internal dcl 361 ref 110 137 152 169 221 238 263 343 event 000127 constant entry external dcl 148 ioi_set 000017 constant entry external dcl 32 level 000435 constant entry external dcl 234 max_timeout 000102 constant entry external dcl 133 max_workspace 000366 constant entry external dcl 216 quit_if_error 001045 constant entry internal dcl 381 ref 197 203 225 248 status 000732 constant entry external dcl 338 timeout 000031 constant entry external dcl 106 unlock 001034 constant entry internal dcl 374 ref 113 119 125 140 155 172 178 184 206 226 241 249 266 273 280 286 296 302 312 318 324 330 346 354 385 workspace 000157 constant entry external dcl 163 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 1434 1520 1053 1444 Length 2026 1053 64 272 360 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME ioi_set 154 external procedure is an external procedure. check_devx internal procedure shares stack frame of external procedure ioi_set. unlock internal procedure shares stack frame of external procedure ioi_set. quit_if_error internal procedure shares stack frame of external procedure ioi_set. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME ioi_set 000100 chanid ioi_set 000102 channel ioi_set 000103 code ioi_set 000104 devx ioi_set 000106 evchn ioi_set 000110 iom ioi_set 000111 n_entries ioi_set 000112 offset ioi_set 000113 ring ioi_set 000114 time ioi_set 000116 workspace_ptr ioi_set 000120 workspace_size ioi_set 000122 gtep ioi_set 000124 ctep ioi_set 000126 dtep ioi_set THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. call_ext_out return_mac ext_entry THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. io_chnl_util$iom_to_name ioi_device$get_dtep ioi_device$unlock ioi_page_table$get ioi_page_table$ptx_to_ptp ioi_page_table$put ioi_usurp_channels$required ioi_wire$unwire ioi_workspace$set_max_size ioi_workspace$set_rb THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$bad_channel error_table_$bad_ring_brackets error_table_$buffer_big error_table_$chnl_already_deleted error_table_$chnl_being_deleted error_table_$dev_offset_out_of_bounds error_table_$device_active error_table_$no_operation error_table_$time_too_long pds$validation_level sys_info$page_size sys_info$seg_size_256K LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 32 000016 99 000024 106 000025 109 000041 110 000044 112 000045 113 000051 114 000052 115 000055 118 000056 119 000065 120 000066 121 000071 124 000072 125 000074 126 000075 127 000077 133 000100 136 000112 137 000115 139 000116 140 000121 141 000122 142 000124 148 000125 151 000137 152 000142 154 000143 155 000146 156 000147 157 000151 163 000152 166 000171 168 000200 169 000204 171 000205 172 000210 173 000211 174 000214 177 000215 178 000221 179 000222 180 000225 183 000226 184 000240 185 000241 186 000244 190 000245 193 000257 194 000262 195 000264 196 000275 197 000277 200 000300 202 000322 203 000335 204 000336 205 000350 206 000353 208 000354 209 000357 210 000361 216 000362 219 000400 221 000407 223 000410 224 000413 225 000424 226 000425 227 000426 228 000430 234 000431 237 000445 238 000450 240 000451 241 000455 242 000456 243 000461 246 000462 247 000464 248 000474 249 000475 250 000476 251 000500 258 000501 261 000516 262 000521 263 000523 265 000524 266 000530 267 000531 268 000534 271 000535 272 000541 273 000544 274 000545 275 000547 278 000550 279 000565 280 000567 281 000570 282 000573 285 000574 286 000577 287 000600 288 000603 291 000604 292 000611 293 000620 295 000625 296 000630 297 000631 298 000634 301 000635 302 000640 303 000641 304 000644 307 000645 310 000656 311 000667 312 000671 313 000672 314 000674 316 000675 318 000676 319 000677 320 000702 323 000703 324 000707 325 000710 326 000712 328 000713 330 000720 331 000721 332 000724 338 000725 341 000742 342 000745 343 000747 345 000750 346 000764 347 000765 348 000770 351 000771 352 000774 353 000777 354 001001 355 001002 356 001004 391 001005 393 001007 361 001010 364 001011 365 001013 366 001016 367 001031 370 001033 374 001034 377 001035 379 001044 381 001045 384 001046 385 001050 386 001051 389 001052 ----------------------------------------------------------- Historical Background This edition of the Multics software materials and documentation is provided and donated to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. as a contribution to computer science knowledge. This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL and BULL HN Information Systems Inc. to the development of this operating system. Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture for managing computer hardware properly and for executing programs. Many subsequent operating systems incorporated Multics principles. Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . ----------------------------------------------------------- Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without fee is hereby granted,provided that the below copyright notice and historical background appear in all copies and that both the copyright notice and historical background and this permission notice appear in supporting documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining to distribution of the programs without specific prior written permission. Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. Copyright 2006 by BULL HN Information Systems Inc. Copyright 2006 by Bull SAS All Rights Reserved