COMPILATION LISTING OF SEGMENT load_mpc_fw_info_ Compiled by: Multics PL/I Compiler, Release 28d, of October 4, 1983 Compiled at: Honeywell Multics Op. - System M Compiled on: 12/10/84 1010.7 mst Mon Options: optimize map 1 /* *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Information Systems Inc., 1982 * 4* * * 5* * Copyright (c) 1972 by Massachusetts Institute of * 6* * Technology and Honeywell Information Systems, Inc. * 7* * * 8* *********************************************************** */ 9 10 11 /* LOAD_MPC_FW_INFO_ - Subroutine used by the load_mpc command to locate firmware for an MPC. */ 12 /* Given an MPC type, a model, and an optional firmware revisions, this module will locate the 13* proper firmware in the T & D deckfile. */ 14 /* Written February 1980 by Larry Johnson */ 15 /* Modified October 1982 by C. Hornig for new config tools. 16* /* Modified November 1982 by Rich Coppola to correct disk MPC model recognition 17* which somehow got removed. */ 18 /* Modified June 1984 by Paul Farley to add DAU (MSP800) support. */ 19 /* Modified Nov. 1984 by Paul Farley to allow for a CCU (read/punch), see phx18465. */ 20 21 /* format: style4,indattr,insnl,delnl */ 22 23 load_mpc_fw_info_: 24 proc (arg_mpcp, arg_fw_revision, arg_itr_needed, arg_fw_needed, arg_fwlistp, arg_code); 25 26 /* Parameters */ 27 28 dcl arg_mpcp ptr; 29 dcl arg_fw_revision char (*); 30 dcl arg_code fixed bin (35); 31 dcl arg_fwlistp ptr; 32 dcl arg_itr_needed bit (1); 33 dcl arg_fw_needed bit (1); 34 35 /* Automatic */ 36 37 dcl mpc_type char (3); 38 dcl model fixed bin; 39 dcl fw_mpc_name char (6); 40 dcl cata_key char (32); 41 dcl fw_revision char (2); 42 dcl code fixed bin (35); 43 dcl (i, j, k) fixed bin; 44 dcl temp_string char (64) var; 45 dcl answer char (32) var; 46 dcl rv char (2); 47 dcl module_listp ptr; 48 dcl found_itr bit (1); 49 dcl found_fw bit (1); 50 dcl found_dev bit (1); 51 dcl deck_ptr ptr; 52 dcl fwsegp ptr; 53 dcl fwsegl fixed bin; 54 dcl rw_index fixed bin; 55 dcl deck_iocbp ptr; 56 dcl needed bit (1); 57 dcl chan fixed bin (6); 58 dcl dev_fw_err bit (1); 59 dcl dev_fw_fnd bit (1); 60 61 dcl 1 cata_list aligned, 62 2 n fixed bin, 63 2 keys (10) char (24) unal; 64 65 dcl 1 module_list aligned based (module_listp), 66 2 n fixed bin, 67 2 name (0 refer (module_list.n)) char (24) unal; 68 69 dcl fwseg (fwsegl) bit (36) aligned based (fwsegp); 70 71 /* Constants */ 72 73 dcl name char (8) int static options (constant) init ("load_mpc"); 74 /* I am really part of this guy */ 75 dcl MPCBOT bit (36) int static options (constant) init ("444723224663"b3); 76 /* BCD for "MPCBOT" */ 77 78 /* External */ 79 80 dcl tolts_util_$cata_sel entry (ptr, char (32), ptr, fixed bin (35)); 81 dcl tolts_util_$search entry (ptr, char (32), ptr, fixed bin, fixed bin (35)); 82 dcl command_query_ entry options (variable); 83 dcl com_err_ entry options (variable); 84 dcl get_temp_segment_ entry (char (*), pointer, fixed bin (35)); 85 dcl release_temp_segment_ entry (char (*), pointer, fixed bin (35)); 86 dcl gload_ entry (ptr, ptr, fixed bin (18), ptr, fixed bin (35)); 87 dcl iox_$close entry (ptr, fixed bin (35)); 88 dcl iox_$detach_iocb entry (ptr, fixed bin (35)); 89 dcl find_config_card_$prph_for_channel 90 entry (fixed bin (3), fixed bin (6), ptr); 91 92 dcl error_table_$bad_arg ext fixed bin (35); 93 dcl error_table_$noentry ext fixed bin (35); 94 95 dcl cleanup condition; 96 97 dcl (addr, bin, hbound, null, substr, unspec) 98 builtin; 99 100 mpc_cardp = arg_mpcp; 101 mpc_type = substr (mpc_card.name, 1, 3); 102 model = mpc_card.model; 103 fw_revision = arg_fw_revision; 104 fwlistp = null (); 105 deck_iocbp = null (); 106 107 on cleanup call clean_up; 108 109 /* Tranlate the mpc name and model as Multics knows it to the name T&D knows it by. */ 110 111 if mpc_type = "urp" 112 then fw_mpc_name = "urcmpc"; 113 else if mpc_type = "mtp" then do; 114 if model = 500 | model = 501 | model = 502 | model = 600 115 then fw_mpc_name = "mtc500"; 116 else if model = 601 | model = 602 117 then fw_mpc_name = "mtp601"; 118 else if model = 610 | model = 611 119 then fw_mpc_name = "mtp610"; 120 else go to unknown_model; 121 end; 122 else if mpc_type = "msp" then do; 123 if model = 181 124 then fw_mpc_name = "dsc181"; 125 else if model = 190 126 then fw_mpc_name = "dsc190"; 127 else if model = 191 | model = 400 | model = 450 | model = 451 | model = 601 | model = 603 128 then fw_mpc_name = "dsc191"; 129 else if model = 607 | model = 609 | model = 611 | model = 612 | model = 500 130 then fw_mpc_name = "dsc500"; 131 else if model = 800 132 then fw_mpc_name = "msp800"; /* DAU */ 133 else go to unknown_model; 134 end; 135 else do; 136 unknown_model: 137 call com_err_ (0, name, "Firmware type for ^a model ^d not known.", mpc_type, model); 138 code = error_table_$bad_arg; 139 go to error_return; 140 end; 141 142 /* Locate firmware in the T&D deckfile */ 143 144 cata_key = "cata.itr." || fw_mpc_name; 145 146 call tolts_util_$cata_sel (deck_iocbp, cata_key, addr (cata_list), code); 147 if code ^= 0 then do; 148 call com_err_ (code, name, "Unable to find catalog for ^a firmware for ^a model ^d.", fw_mpc_name, 149 mpc_type, model); 150 go to error_return; 151 end; 152 153 /* Check requested revision against whats in file */ 154 155 temp_string = ""; 156 do i = 1 to cata_list.n; 157 if i > 1 158 then temp_string = temp_string || ", "; 159 rv = extract_rev (cata_list.keys (i)); 160 if fw_revision ^= "" 161 then if fw_revision = rv then do; 162 cata_key = cata_list.keys (i); 163 go to got_key; 164 end; 165 temp_string = temp_string || rv; 166 end; 167 if fw_revision ^= "" then do; 168 call com_err_ (0, name, 169 "^a firmware revison ^a for ^a model ^d not found. Revision^[s^] available ^[is^;are^]: ^a.", 170 fw_mpc_name, fw_revision, mpc_type, model, (cata_list.n ^= 1), (cata_list.n = 1), temp_string); 171 code = error_table_$noentry; 172 go to error_return; 173 end; 174 if cata_list.n = 1 then do; /* If only 1, use it */ 175 cata_key = cata_list.keys (1); 176 fw_revision = extract_rev (cata_list.keys (1)); 177 go to got_key; 178 end; 179 180 /* Multiple revision exists, and user didn't specify. So ask. */ 181 182 temp_string = temp_string || ", or no."; 183 184 repeat: 185 query_info.version = query_info_version_4; 186 call command_query_ (addr (query_info), answer, name, 187 "Multiple revisions of ^a firmware for ^a model ^d. Choose from ^a - ", fw_mpc_name, mpc_type, model, 188 temp_string); 189 if answer = "no" | answer = "quit" | answer = "q" then do; 190 code = error_table_$noentry; 191 go to error_return; 192 end; 193 194 do i = 1 to cata_list.n; 195 if answer = extract_rev (cata_list.keys (i)) then do; 196 cata_key = cata_list.keys (i); 197 fw_revision = answer; 198 go to got_key; 199 end; 200 end; 201 go to repeat; 202 203 /* Now that revision is decided, find catalog entry for it. */ 204 205 got_key: 206 call tolts_util_$search (deck_iocbp, cata_key, module_listp, (0), code); 207 if code ^= 0 then do; 208 call com_err_ (code, name, "Unable to find catalog for ^a. Deckfile may be damaged.", cata_key); 209 go to error_return; 210 end; 211 212 /* Now identify each of the programs */ 213 214 fwlist_n = module_list.n; 215 allocate fwlist; 216 217 found_itr, found_fw, found_dev = "0"b; 218 219 do i = 1 to module_list.n; 220 fwep = addr (fwlist.entry (i)); 221 fwe.name = module_list.name (i); 222 fwe.segp = null (); 223 fwe.device (*) = ""; 224 fwe.cs_ptr, fwe.rw_ptr = null (); 225 fwe.cs_len, fwe.rw_len = 0; 226 fwe.port_mask = "0"b; 227 if substr (fwe.name, 1, 4) = "itr." then do; 228 fwe.type = FWE_TYPE_ITR; 229 found_itr = "1"b; 230 end; 231 else if ^found_fw then do; 232 found_fw = "1"b; 233 fwe.type = FWE_TYPE_FW; 234 end; 235 else if mpc_type = "urp" & found_fw then do; 236 if substr (fwe.name, 1, 7) = "400ovl." then do; 237 fwe.type = FWE_TYPE_DEV; 238 fwe.device (1) = "prt"; 239 found_dev = "1"b; 240 end; 241 else if substr (fwe.name, 1, 7) = "300ovl." then do; 242 fwe.type = FWE_TYPE_DEV; 243 fwe.device (1) = "rdr"; 244 fwe.device (2) = "pun"; 245 fwe.device (3) = "ccu"; 246 end; 247 else go to cant_identify; 248 end; 249 else do; 250 cant_identify: 251 code = error_table_$noentry; 252 call com_err_ (0, name, "Can't identify firmware module ^a for ^a model ^d.", fwe.name, mpc_type, 253 model); 254 go to error_return; 255 end; 256 end; 257 258 /* For unit record device firmware, find out for which ports each module is needed */ 259 260 if mpc_type = "urp" then do; 261 dev_fw_fnd, dev_fw_err = "0"b; 262 do i = 1 to mpc_card.nchan (1); /* Check each channel for device */ 263 chan = mpc_card.chan (1) + i - 1; 264 call find_config_card_$prph_for_channel ((mpc_card.iom (1)), chan, prph_cardp); 265 if prph_cardp = null () 266 then go to next_channel; 267 do j = 1 to fwlist.n; /* Find firmware for this device */ 268 fwep = addr (fwlist.entry (j)); 269 if fwe.type = FWE_TYPE_DEV then do; 270 do k = 1 to hbound (fwe.device, 1); 271 if fwe.device (k) = substr (prph_card.name, 1, 3) then do; 272 /* Got it */ 273 substr (fwe.port_mask, i, 1) = "1"b; 274 dev_fw_fnd = "1"b; 275 go to next_channel; 276 end; 277 end; 278 end; 279 end; 280 call com_err_ (0, name, "No firmware for device ^a on mpc ^a", mpc_card.name, prph_card.name); 281 dev_fw_err = "1"b; 282 next_channel: 283 end; 284 285 if ^dev_fw_fnd then do; 286 call com_err_ (0, name, "No device firmware to load into mpc ^a.", mpc_card.name); 287 dev_fw_err = "1"b; 288 end; 289 if dev_fw_err then do; 290 code = error_table_$noentry; 291 go to error_return; 292 end; 293 end; 294 295 /* Now load each of the modules */ 296 297 if arg_itr_needed & ^found_itr then do; 298 code = error_table_$noentry; 299 call com_err_ (code, name, "No ITR's found for ^a model ^d.", mpc_type, model); 300 go to error_return; 301 end; 302 if arg_fw_needed & ^found_fw then do; 303 code = error_table_$noentry; 304 call com_err_ (code, name, "No firmware found for ^a model ^d.", mpc_type, model); 305 go to error_return; 306 end; 307 308 do i = 1 to fwlist.n; 309 fwep = addr (fwlist.entry (i)); 310 needed = "0"b; 311 if fwe.type = FWE_TYPE_ITR 312 then needed = arg_itr_needed; 313 else if fwe.type = FWE_TYPE_FW 314 then needed = arg_fw_needed; 315 else if fwe.type = FWE_TYPE_DEV 316 then needed = arg_fw_needed & (fwe.port_mask ^= "0"b); 317 if needed then do; 318 call get_temp_segment_ (name, fwe.segp, code); 319 if code ^= 0 then do; 320 call com_err_ (code, name, "Can't get temp segment for ^a.", fwe.name); 321 go to error_return; 322 end; 323 call tolts_util_$search (deck_iocbp, (fwe.name), deck_ptr, (0), code); 324 if code ^= 0 then do; 325 call com_err_ (code, name, "Unable to find ^a in deckfile.", fwe.name); 326 go to error_return; 327 end; 328 call gload_ (deck_ptr, fwe.segp, 0, addr (gload_data), code); 329 if code ^= 0 then do; 330 call com_err_ (code, name, "^a. Loading ^a.", gload_data.diagnostic, fwe.name); 331 go to error_return; 332 end; 333 fwsegp = fwe.segp; 334 fwsegl = bin (gload_data.text_len); 335 if fwsegl <= 10 then do; 336 code = error_table_$noentry; 337 call com_err_ (0, name, "^a too short to be firmware module. length = ^d.", fwe.name, fwsegl); 338 go to error_return; 339 end; 340 if fwseg (fwsegl) ^= MPCBOT then do; 341 code = error_table_$noentry; 342 call com_err_ (0, name, "^a segment does not end with ""MPCBOT"".", fwe.name); 343 go to error_return; 344 end; 345 rw_index = bin (substr (fwseg (fwsegl - 5), 1, 18)); 346 fwe.cs_ptr = fwe.segp; 347 if rw_index = 0 348 then /* No r/w overlay */ 349 fwe.cs_len = fwsegl - 10; 350 else do; 351 fwe.cs_len = rw_index; 352 fwe.rw_ptr = addr (fwseg (rw_index + 1)); 353 fwe.rw_len = fwsegl - rw_index - 10; 354 end; 355 call check_checksum ("control store", control_store_overlay); 356 if fwe.rw_ptr ^= null () 357 then call check_checksum ("read write", read_write_overlay); 358 if fwe.type = FWE_TYPE_FW & fwe.rw_ptr = null () then do; 359 code = error_table_$noentry; 360 call com_err_ (0, name, "^a is missing a read/write overlay.", fwe.name); 361 go to error_return; 362 end; 363 if fwe.type ^= FWE_TYPE_FW & fwe.rw_ptr ^= null () then do; 364 code = error_table_$noentry; 365 call com_err_ (0, name, "^a has an unwanted read/write overlay.", fwe.name); 366 go to error_return; 367 end; 368 end; 369 end; 370 371 call iox_$close (deck_iocbp, code); 372 call iox_$detach_iocb (deck_iocbp, code); 373 arg_fwlistp = fwlistp; 374 if arg_fw_revision = "" 375 then arg_fw_revision = fw_revision; 376 arg_code = 0; 377 return; 378 379 error_return: 380 arg_fwlistp = null (); 381 arg_code = code; 382 call clean_up; 383 return; 384 385 /* Compute a checksum */ 386 387 check_checksum: 388 proc (overlay_name, overlay); 389 390 dcl overlay_name char (*); 391 dcl overlay (*) bit (36) aligned; 392 dcl check_sum fixed bin (35); 393 dcl check_bit bit (36); 394 dcl i fixed bin; 395 dcl answer bit (18); 396 397 check_sum = 0; 398 do i = 1 to (hbound (overlay, 1) - 1); 399 call ch_add (substr (overlay (i), 1, 18)); 400 call ch_add (substr (overlay (i), 19, 18)); 401 end; 402 check_sum = -check_sum; 403 check_bit = unspec (check_sum); 404 answer = "0"b || substr (check_bit, 21, 8) || "0"b || substr (check_bit, 29, 8); 405 if answer ^= substr (overlay (hbound (overlay, 1)), 1, 18) then do; 406 code = error_table_$noentry; 407 call com_err_ (0, name, "Checksum error in ^a overlay of ^a.", overlay_name, fwe.name); 408 go to error_return; 409 end; 410 return; 411 412 /* Do 16 bit addtion with end-around carry */ 413 414 ch_add: 415 proc (word); 416 417 dcl word bit (18); 418 dcl addval fixed bin (16); 419 420 addval = bin (substr (word, 2, 8) || substr (word, 11, 8)); 421 check_sum = check_sum + addval; 422 do while (check_sum > 1111111111111111b); 423 check_sum = check_sum - 10000000000000000b; 424 check_sum = check_sum + 1; 425 end; 426 427 end ch_add; 428 429 end check_checksum; 430 431 extract_rev: 432 proc (c) returns (char (2)); 433 434 dcl c char (*); 435 436 return (substr (c, 17, 2)); 437 438 end extract_rev; 439 440 clean_up: 441 proc; 442 443 if deck_iocbp ^= null () then do; 444 call iox_$close (deck_iocbp, code); 445 call iox_$detach_iocb (deck_iocbp, code); 446 end; 447 if fwlistp ^= null () then do; 448 do i = 1 to fwlist.n; 449 fwep = addr (fwlist.entry (i)); 450 if fwe.segp ^= null () 451 then call release_temp_segment_ (name, fwe.segp, code); 452 end; 453 fwlist_n = fwlist.n; 454 free fwlist; 455 end; 456 return; 457 458 end clean_up; 459 1 1 /* BEGIN INCLUDE FILE query_info.incl.pl1 TAC June 1, 1973 */ 1 2 /* Renamed to query_info.incl.pl1 and cp_escape_control added, 08/10/78 WOS */ 1 3 /* version number changed to 4, 08/10/78 WOS */ 1 4 /* Version 5 adds explanation_(ptr len) 05/08/81 S. Herbst */ 1 5 /* Version 6 adds literal_sw, prompt_after_explanation switch 12/15/82 S. Herbst */ 1 6 1 7 dcl 1 query_info aligned, /* argument structure for command_query_ call */ 1 8 2 version fixed bin, /* version of this structure - must be set, see below */ 1 9 2 switches aligned, /* various bit switch values */ 1 10 3 yes_or_no_sw bit (1) unaligned init ("0"b), /* not a yes-or-no question, by default */ 1 11 3 suppress_name_sw bit (1) unaligned init ("0"b), /* do not suppress command name */ 1 12 3 cp_escape_control bit (2) unaligned init ("00"b), /* obey static default value */ 1 13 /* "01" -> invalid, "10" -> don't allow, "11" -> allow */ 1 14 3 suppress_spacing bit (1) unaligned init ("0"b), /* whether to print extra spacing */ 1 15 3 literal_sw bit (1) unaligned init ("0"b), /* ON => do not strip leading/trailing white space */ 1 16 3 prompt_after_explanation bit (1) unaligned init ("0"b), /* ON => repeat question after explanation */ 1 17 3 padding bit (29) unaligned init (""b), /* pads it out to t word */ 1 18 2 status_code fixed bin (35) init (0), /* query not prompted by any error, by default */ 1 19 2 query_code fixed bin (35) init (0), /* currently has no meaning */ 1 20 1 21 /* Limit of data defined for version 2 */ 1 22 1 23 2 question_iocbp ptr init (null ()), /* IO switch to write question */ 1 24 2 answer_iocbp ptr init (null ()), /* IO switch to read answer */ 1 25 2 repeat_time fixed bin (71) init (0), /* repeat question every N seconds if no answer */ 1 26 /* minimum of 30 seconds required for repeat */ 1 27 /* otherwise, no repeat will occur */ 1 28 /* Limit of data defined for version 4 */ 1 29 1 30 2 explanation_ptr ptr init (null ()), /* explanation of question to be printed if */ 1 31 2 explanation_len fixed bin (21) init (0); /* user answers "?" (disabled if ptr=null or len=0) */ 1 32 1 33 dcl query_info_version_3 fixed bin int static options (constant) init (3); 1 34 dcl query_info_version_4 fixed bin int static options (constant) init (4); 1 35 dcl query_info_version_5 fixed bin int static options (constant) init (5); 1 36 dcl query_info_version_6 fixed bin int static options (constant) init (6); /* the current version number */ 1 37 1 38 /* END INCLUDE FILE query_info.incl.pl1 */ 460 2 1 /* BEGIN INCLUDE FILE ... config_mpc_card.incl.pl1 ... 11/27/80 W. Olin Sibert */ 2 2 2 3 dcl mpc_cardp ptr; /* Pointer to an MPC card. */ 2 4 2 5 dcl 1 mpc_card aligned based (mpc_cardp), 2 6 2 word char (4), /* "mpc" */ 2 7 2 name char (4), /* Name of this MPC - e.g., "mspa" */ 2 8 2 model fixed bin, /* Model of this MPC - e.g., 601. */ 2 9 2 port (4), /* Per port information. 12 fields total */ 2 10 3 iom fixed bin (3), /* IOM number */ 2 11 3 chan fixed bin (8), /* Channel number. */ 2 12 3 nchan fixed bin, /* Number of logical channels on this channel. */ 2 13 2 14 2 type_word aligned, 2 15 3 field_type (14) bit (2) unaligned, /* type of each field; see config_deck.incl.pl1 */ 2 16 3 pad1 bit (4) unaligned, 2 17 3 n_fields fixed bin (4) unsigned unaligned; /* number of fields used on card */ 2 18 2 19 dcl 1 mpc_card_array aligned based (mpc_cardp), /* Overlay for MPC port array */ 2 20 2 pad1 (3) bit (36) aligned, 2 21 2 port (divide (max (0, (mpc_card.n_fields - 2)), 3, 17, 0)), 2 22 3 iom fixed bin (3), /* IOM number */ 2 23 3 chan fixed bin (8), /* Channel number. */ 2 24 3 nchan fixed bin; /* Number of logical channels on this channel. */ 2 25 2 26 dcl MPC_CARD_WORD char (4) aligned internal static options (constant) init ("mpc"); 2 27 2 28 /* END INCLUDE FILE ... config_mpc_card.incl.pl1 */ 461 3 1 /* BEGIN INCLUDE FILE ... config_prph_card.incl.pl1 ... 11/27/80 W. Olin Sibert */ 3 2 3 3 dcl prph_cardp ptr; /* Pointer to a PRPH card. */ 3 4 3 5 dcl 1 prph_card based (prph_cardp) aligned, /* PRPH card declaration */ 3 6 2 word char (4), /* "prph" */ 3 7 2 name char (4), /* subsystem name */ 3 8 2 iom fixed bin (3), /* IOM number */ 3 9 2 chan fixed bin (8), /* channel number */ 3 10 2 model fixed bin, /* model number */ 3 11 2 state char (4), /* ON/OFF state */ 3 12 2 pad (9) bit (36) aligned, /* pad to 15 fields */ 3 13 3 14 2 type_word aligned, 3 15 3 field_type (14) bit (2) unaligned, /* type of each field; see config_deck.incl.pl1 */ 3 16 3 pad1 bit (4) unaligned, 3 17 3 n_fields fixed bin (4) unsigned unaligned; /* number of fields used on card */ 3 18 3 19 dcl PRPH_CARD_WORD char (4) aligned internal static options (constant) init ("prph"); 3 20 3 21 /* END INCLUDE FILE ... config_prph_card.incl.pl1 */ 462 4 1 4 2 /* BEGIN INCLUDE FILE gload_data.incl.pl1 */ 4 3 /* created 9/29/78 by James A. Bush */ 4 4 4 5 dcl 1 gload_data aligned, /* pertinent info generated from gload_ */ 4 6 (2 deck_name char (4), /* name from columns 73-76 of $ object card */ 4 7 2 deck_type bit (1), /* "0"b = absolute, "1"b = relocatable */ 4 8 2 sym_cnt fixed bin (16), /* count of valid symbols */ 4 9 2 text_len bit (18), /* length in words including load offset */ 4 10 2 checksum bit (36), /* checksum of loaded deck */ 4 11 2 diagnostic char (200), /* loader diagnostic */ 4 12 2 definition (128), /* array of definitions */ 4 13 3 symbol char (6), /* symbol name */ 4 14 3 pad1 bit (18), 4 15 3 offset bit (18), /* symbol offset in text */ 4 16 3 pad2 bit (14), 4 17 3 sym_type fixed bin (3)) unaligned; /* type of symbol (0 - 7) */ 4 18 4 19 /* END INCLUDE FILE gload_data.incl.pl1 */ 4 20 463 5 1 /* Begin include file . . . . . load_mpc_info.incl.pl1 */ 5 2 5 3 /* Written February 1979 by Larry Johnson */ 5 4 5 5 /* This include file describes a structure setup by load_mpc_fw_info_ 5 6* with information about the firmware to be run */ 5 7 5 8 dcl fwlistp ptr; 5 9 dcl fwlist_n fixed bin; 5 10 5 11 dcl 1 fwlist aligned based (fwlistp), 5 12 2 n fixed bin, 5 13 2 entry (fwlist_n refer (fwlist.n)) like fwe; 5 14 5 15 5 16 dcl fwep ptr; 5 17 5 18 dcl 1 fwe aligned based (fwep), 5 19 2 name char (32), /* Name of program */ 5 20 2 segp ptr, /* Pointer to segment containing it */ 5 21 2 type fixed bin, /* Type, itr, fw, dev */ 5 22 2 device (4) char (3) unal, /* If device fw, device types it is for */ 5 23 2 port_mask bit (8), /* for device firmware, which ports it is for */ 5 24 2 cs_ptr ptr, /* Pointer to control store overlay */ 5 25 2 rw_ptr ptr, /* Pointer to read/wrote overlay */ 5 26 2 cs_len fixed bin, 5 27 2 rw_len fixed bin; 5 28 5 29 dcl control_store_overlay (fwe.cs_len) bit (36) aligned based (fwe.cs_ptr); 5 30 dcl read_write_overlay (fwe.rw_len) bit (36) aligned based (fwe.rw_ptr); 5 31 5 32 dcl (FWE_TYPE_ITR init (1), /* An itr program */ 5 33 FWE_TYPE_FW init (2), /* Application firmware */ 5 34 FWE_TYPE_DEV init (3)) int static options (constant); /* Device firmware overlays */ 5 35 5 36 /* End include file . . . . . load_mpc_info.incl.pl1 */ 464 465 466 end load_mpc_fw_info_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 12/10/84 1006.2 load_mpc_fw_info_.pl1 >spec>on>7091>load_mpc_fw_info_.pl1 460 1 03/11/83 1204.3 query_info.incl.pl1 >ldd>include>query_info.incl.pl1 461 2 05/08/81 1853.6 config_mpc_card.incl.pl1 >ldd>include>config_mpc_card.incl.pl1 462 3 10/31/84 1315.5 config_prph_card.incl.pl1 >ldd>include>config_prph_card.incl.pl1 463 4 05/23/79 1612.1 gload_data.incl.pl1 >ldd>include>gload_data.incl.pl1 464 5 08/11/80 1844.3 load_mpc_info.incl.pl1 >ldd>include>load_mpc_info.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. FWE_TYPE_DEV constant fixed bin(17,0) initial dcl 5-32 ref 237 242 269 315 FWE_TYPE_FW constant fixed bin(17,0) initial dcl 5-32 ref 233 313 358 363 FWE_TYPE_ITR constant fixed bin(17,0) initial dcl 5-32 ref 228 311 MPCBOT 000000 constant bit(36) initial unaligned dcl 75 ref 340 addr builtin function dcl 97 ref 146 146 186 186 220 268 309 328 328 352 449 addval 001252 automatic fixed bin(16,0) dcl 418 set ref 420* 421 answer 001241 automatic bit(18) unaligned dcl 395 in procedure "check_checksum" set ref 404* 405 answer 000142 automatic varying char(32) dcl 45 in procedure "load_mpc_fw_info_" set ref 186* 189 189 189 195 197 answer_iocbp 6 000302 automatic pointer initial level 2 dcl 1-7 set ref 1-7* arg_code parameter fixed bin(35,0) dcl 30 set ref 23 376* 381* arg_fw_needed parameter bit(1) unaligned dcl 33 ref 23 302 313 315 arg_fw_revision parameter char unaligned dcl 29 set ref 23 103 374 374* arg_fwlistp parameter pointer dcl 31 set ref 23 373* 379* arg_itr_needed parameter bit(1) unaligned dcl 32 ref 23 297 311 arg_mpcp parameter pointer dcl 28 ref 23 100 bin builtin function dcl 97 ref 334 345 420 c parameter char unaligned dcl 434 ref 431 436 cata_key 000104 automatic char(32) unaligned dcl 40 set ref 144* 146* 162* 175* 196* 205* 208* cata_list 000176 automatic structure level 1 dcl 61 set ref 146 146 chan 000173 automatic fixed bin(6,0) dcl 57 in procedure "load_mpc_fw_info_" set ref 263* 264* chan 4 based fixed bin(8,0) array level 3 in structure "mpc_card" dcl 2-5 in procedure "load_mpc_fw_info_" ref 263 check_bit 001237 automatic bit(36) unaligned dcl 393 set ref 403* 404 404 check_sum 001236 automatic fixed bin(35,0) dcl 392 set ref 397* 402* 402 403 421* 421 422 423* 423 424* 424 cleanup 000274 stack reference condition dcl 95 ref 107 code 000115 automatic fixed bin(35,0) dcl 42 set ref 138* 146* 147 148* 171* 190* 205* 207 208* 250* 290* 298* 299* 303* 304* 318* 319 320* 323* 324 325* 328* 329 330* 336* 341* 359* 364* 371* 372* 381 406* 444* 445* 450* com_err_ 000016 constant entry external dcl 83 ref 136 148 168 208 252 280 286 299 304 320 325 330 337 342 360 365 407 command_query_ 000014 constant entry external dcl 82 ref 186 control_store_overlay based bit(36) array dcl 5-29 set ref 355* cp_escape_control 1(02) 000302 automatic bit(2) initial level 3 packed unaligned dcl 1-7 set ref 1-7* cs_len 24 based fixed bin(17,0) level 2 dcl 5-18 set ref 225* 347* 351* 355 cs_ptr 20 based pointer level 2 dcl 5-18 set ref 224* 346* 355 deck_iocbp 000170 automatic pointer dcl 55 set ref 105* 146* 205* 323* 371* 372* 443 444* 445* deck_ptr 000162 automatic pointer dcl 51 set ref 323* 328* dev_fw_err 000174 automatic bit(1) unaligned dcl 58 set ref 261* 281* 287* 289 dev_fw_fnd 000175 automatic bit(1) unaligned dcl 59 set ref 261* 274* 285 device 13 based char(3) array level 2 packed unaligned dcl 5-18 set ref 223* 238* 243* 244* 245* 270 271 diagnostic 3 000324 automatic char(200) level 2 packed unaligned dcl 4-5 set ref 330* entry 2 based structure array level 2 dcl 5-11 set ref 220 268 309 449 error_table_$bad_arg 000034 external static fixed bin(35,0) dcl 92 ref 138 error_table_$noentry 000036 external static fixed bin(35,0) dcl 93 ref 171 190 250 290 298 303 336 341 359 364 406 explanation_len 14 000302 automatic fixed bin(21,0) initial level 2 dcl 1-7 set ref 1-7* explanation_ptr 12 000302 automatic pointer initial level 2 dcl 1-7 set ref 1-7* find_config_card_$prph_for_channel 000032 constant entry external dcl 89 ref 264 found_dev 000160 automatic bit(1) unaligned dcl 50 set ref 217* 239* found_fw 000157 automatic bit(1) unaligned dcl 49 set ref 217* 231 232* 235 302 found_itr 000156 automatic bit(1) unaligned dcl 48 set ref 217* 229* 297 fw_mpc_name 000102 automatic char(6) unaligned dcl 39 set ref 111* 114* 116* 118* 123* 125* 127* 129* 131* 144 148* 168* 186* fw_revision 000114 automatic char(2) unaligned dcl 41 set ref 103* 160 160 167 168* 176* 197* 374 fwe based structure level 1 dcl 5-18 fwep 001216 automatic pointer dcl 5-16 set ref 220* 221 222 223 224 224 225 225 226 227 228 233 236 237 238 241 242 243 244 245 252 268* 269 270 271 273 309* 311 313 315 315 318 320 323 325 328 330 333 337 342 346 346 347 351 352 353 355 355 356 356 356 358 358 360 363 363 365 407 449* 450 450 fwlist based structure level 1 dcl 5-11 set ref 215 454 fwlist_n 001214 automatic fixed bin(17,0) dcl 5-9 set ref 214* 215 215 453* fwlistp 001212 automatic pointer dcl 5-8 set ref 104* 215* 220 267 268 308 309 373 447 448 449 453 454 fwseg based bit(36) array dcl 69 set ref 340 345 352 fwsegl 000166 automatic fixed bin(17,0) dcl 53 set ref 334* 335 337* 340 345 347 353 fwsegp 000164 automatic pointer dcl 52 set ref 333* 340 345 352 get_temp_segment_ 000020 constant entry external dcl 84 ref 318 gload_ 000024 constant entry external dcl 86 ref 328 gload_data 000324 automatic structure level 1 dcl 4-5 set ref 328 328 hbound builtin function dcl 97 ref 270 398 405 i 000116 automatic fixed bin(17,0) dcl 43 in procedure "load_mpc_fw_info_" set ref 156* 157 159 162* 194* 195 196* 219* 220 221* 262* 263 273* 308* 309* 448* 449* i 001240 automatic fixed bin(17,0) dcl 394 in procedure "check_checksum" set ref 398* 399 399 400 400* iom 3 based fixed bin(3,0) array level 3 dcl 2-5 ref 264 iox_$close 000026 constant entry external dcl 87 ref 371 444 iox_$detach_iocb 000030 constant entry external dcl 88 ref 372 445 j 000117 automatic fixed bin(17,0) dcl 43 set ref 267* 268* k 000120 automatic fixed bin(17,0) dcl 43 set ref 270* 271* keys 1 000176 automatic char(24) array level 2 packed unaligned dcl 61 set ref 159* 162 175 176* 195* 196 literal_sw 1(05) 000302 automatic bit(1) initial level 3 packed unaligned dcl 1-7 set ref 1-7* model 2 based fixed bin(17,0) level 2 in structure "mpc_card" dcl 2-5 in procedure "load_mpc_fw_info_" ref 102 model 000101 automatic fixed bin(17,0) dcl 38 in procedure "load_mpc_fw_info_" set ref 102* 114 114 114 114 116 116 118 118 123 125 127 127 127 127 127 127 129 129 129 129 129 131 136* 148* 168* 186* 252* 299* 304* module_list based structure level 1 dcl 65 module_listp 000154 automatic pointer dcl 47 set ref 205* 214 219 221 mpc_card based structure level 1 dcl 2-5 mpc_cardp 000320 automatic pointer dcl 2-3 set ref 100* 101 102 262 263 264 280 286 mpc_type 000100 automatic char(3) unaligned dcl 37 set ref 101* 111 113 122 136* 148* 168* 186* 235 252* 260 299* 304* n 000176 automatic fixed bin(17,0) level 2 in structure "cata_list" dcl 61 in procedure "load_mpc_fw_info_" set ref 156 168 168 174 194 n based fixed bin(17,0) level 2 in structure "module_list" dcl 65 in procedure "load_mpc_fw_info_" ref 214 219 n based fixed bin(17,0) level 2 in structure "fwlist" dcl 5-11 in procedure "load_mpc_fw_info_" set ref 215* 267 308 448 453 454 name based char(32) level 2 in structure "fwe" dcl 5-18 in procedure "load_mpc_fw_info_" set ref 221* 227 236 241 252* 320* 323 325* 330* 337* 342* 360* 365* 407* name 1 based char(24) array level 2 in structure "module_list" packed unaligned dcl 65 in procedure "load_mpc_fw_info_" ref 221 name 1 based char(4) level 2 in structure "mpc_card" dcl 2-5 in procedure "load_mpc_fw_info_" set ref 101 280* 286* name 000002 constant char(8) initial unaligned dcl 73 in procedure "load_mpc_fw_info_" set ref 136* 148* 168* 186* 208* 252* 280* 286* 299* 304* 318* 320* 325* 330* 337* 342* 360* 365* 407* 450* name 1 based char(4) level 2 in structure "prph_card" dcl 3-5 in procedure "load_mpc_fw_info_" set ref 271 280* nchan 5 based fixed bin(17,0) array level 3 dcl 2-5 ref 262 needed 000172 automatic bit(1) unaligned dcl 56 set ref 310* 311* 313* 315* 317 null builtin function dcl 97 ref 104 105 222 224 265 356 358 363 379 1-7 1-7 1-7 443 447 450 overlay parameter bit(36) array dcl 391 ref 387 398 399 399 400 400 405 405 overlay_name parameter char unaligned dcl 390 set ref 387 407* padding 1(07) 000302 automatic bit(29) initial level 3 packed unaligned dcl 1-7 set ref 1-7* port 3 based structure array level 2 dcl 2-5 port_mask 16 based bit(8) level 2 dcl 5-18 set ref 226* 273* 315 prompt_after_explanation 1(06) 000302 automatic bit(1) initial level 3 packed unaligned dcl 1-7 set ref 1-7* prph_card based structure level 1 dcl 3-5 prph_cardp 000322 automatic pointer dcl 3-3 set ref 264* 265 271 280 query_code 3 000302 automatic fixed bin(35,0) initial level 2 dcl 1-7 set ref 1-7* query_info 000302 automatic structure level 1 dcl 1-7 set ref 186 186 query_info_version_4 constant fixed bin(17,0) initial dcl 1-34 ref 184 question_iocbp 4 000302 automatic pointer initial level 2 dcl 1-7 set ref 1-7* read_write_overlay based bit(36) array dcl 5-30 set ref 356* release_temp_segment_ 000022 constant entry external dcl 85 ref 450 repeat_time 10 000302 automatic fixed bin(71,0) initial level 2 dcl 1-7 set ref 1-7* rv 000153 automatic char(2) unaligned dcl 46 set ref 159* 160 165 rw_index 000167 automatic fixed bin(17,0) dcl 54 set ref 345* 347 351 352 353 rw_len 25 based fixed bin(17,0) level 2 dcl 5-18 set ref 225* 353* 356 rw_ptr 22 based pointer level 2 dcl 5-18 set ref 224* 352* 356 356 358 363 segp 10 based pointer level 2 dcl 5-18 set ref 222* 318* 328* 333 346 450 450* status_code 2 000302 automatic fixed bin(35,0) initial level 2 dcl 1-7 set ref 1-7* substr builtin function dcl 97 set ref 101 227 236 241 271 273* 345 399 399 400 400 404 404 405 420 420 436 suppress_name_sw 1(01) 000302 automatic bit(1) initial level 3 packed unaligned dcl 1-7 set ref 1-7* suppress_spacing 1(04) 000302 automatic bit(1) initial level 3 packed unaligned dcl 1-7 set ref 1-7* switches 1 000302 automatic structure level 2 dcl 1-7 temp_string 000121 automatic varying char(64) dcl 44 set ref 155* 157* 157 165* 165 168* 182* 182 186* text_len 1(18) 000324 automatic bit(18) level 2 packed unaligned dcl 4-5 set ref 334 tolts_util_$cata_sel 000010 constant entry external dcl 80 ref 146 tolts_util_$search 000012 constant entry external dcl 81 ref 205 323 type 12 based fixed bin(17,0) level 2 dcl 5-18 set ref 228* 233* 237* 242* 269 311 313 315 358 363 unspec builtin function dcl 97 ref 403 version 000302 automatic fixed bin(17,0) level 2 dcl 1-7 set ref 184* word parameter bit(18) unaligned dcl 417 ref 414 420 420 yes_or_no_sw 1 000302 automatic bit(1) initial level 3 packed unaligned dcl 1-7 set ref 1-7* NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. MPC_CARD_WORD internal static char(4) initial dcl 2-26 PRPH_CARD_WORD internal static char(4) initial dcl 3-19 mpc_card_array based structure level 1 dcl 2-19 query_info_version_3 internal static fixed bin(17,0) initial dcl 1-33 query_info_version_5 internal static fixed bin(17,0) initial dcl 1-35 query_info_version_6 internal static fixed bin(17,0) initial dcl 1-36 NAMES DECLARED BY EXPLICIT CONTEXT. cant_identify 001670 constant label dcl 250 ref 241 ch_add 003352 constant entry internal dcl 414 ref 399 400 check_checksum 003171 constant entry internal dcl 387 ref 355 356 clean_up 003434 constant entry internal dcl 440 ref 107 382 error_return 003157 constant label dcl 379 ref 139 150 172 191 209 254 291 300 305 321 326 331 338 343 361 366 408 extract_rev 003413 constant entry internal dcl 431 ref 159 176 195 got_key 001453 constant label dcl 205 ref 163 177 198 load_mpc_fw_info_ 000451 constant entry external dcl 23 next_channel 002107 constant label dcl 282 ref 265 275 repeat 001304 constant label dcl 184 set ref 201 unknown_model 000711 constant label dcl 136 ref 118 131 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 4022 4062 3627 4032 Length 4374 3627 40 276 173 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME load_mpc_fw_info_ 832 external procedure is an external procedure. on unit on line 107 64 on unit check_checksum internal procedure shares stack frame of external procedure load_mpc_fw_info_. ch_add internal procedure shares stack frame of external procedure load_mpc_fw_info_. extract_rev internal procedure shares stack frame of external procedure load_mpc_fw_info_. clean_up 86 internal procedure is called by several nonquick procedures. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME load_mpc_fw_info_ 000100 mpc_type load_mpc_fw_info_ 000101 model load_mpc_fw_info_ 000102 fw_mpc_name load_mpc_fw_info_ 000104 cata_key load_mpc_fw_info_ 000114 fw_revision load_mpc_fw_info_ 000115 code load_mpc_fw_info_ 000116 i load_mpc_fw_info_ 000117 j load_mpc_fw_info_ 000120 k load_mpc_fw_info_ 000121 temp_string load_mpc_fw_info_ 000142 answer load_mpc_fw_info_ 000153 rv load_mpc_fw_info_ 000154 module_listp load_mpc_fw_info_ 000156 found_itr load_mpc_fw_info_ 000157 found_fw load_mpc_fw_info_ 000160 found_dev load_mpc_fw_info_ 000162 deck_ptr load_mpc_fw_info_ 000164 fwsegp load_mpc_fw_info_ 000166 fwsegl load_mpc_fw_info_ 000167 rw_index load_mpc_fw_info_ 000170 deck_iocbp load_mpc_fw_info_ 000172 needed load_mpc_fw_info_ 000173 chan load_mpc_fw_info_ 000174 dev_fw_err load_mpc_fw_info_ 000175 dev_fw_fnd load_mpc_fw_info_ 000176 cata_list load_mpc_fw_info_ 000302 query_info load_mpc_fw_info_ 000320 mpc_cardp load_mpc_fw_info_ 000322 prph_cardp load_mpc_fw_info_ 000324 gload_data load_mpc_fw_info_ 001212 fwlistp load_mpc_fw_info_ 001214 fwlist_n load_mpc_fw_info_ 001216 fwep load_mpc_fw_info_ 001236 check_sum check_checksum 001237 check_bit check_checksum 001240 i check_checksum 001241 answer check_checksum 001252 addval ch_add THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. r_e_as r_ne_as alloc_cs call_ext_out_desc call_ext_out call_int_this call_int_other return enable shorten_stack ext_entry_desc int_entry alloc_based_storage free_based THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. com_err_ command_query_ find_config_card_$prph_for_channel get_temp_segment_ gload_ iox_$close iox_$detach_iocb release_temp_segment_ tolts_util_$cata_sel tolts_util_$search THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$bad_arg error_table_$noentry LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 23 000443 1 7 000464 100 000514 101 000520 102 000523 103 000525 104 000533 105 000535 107 000536 111 000560 113 000567 114 000571 116 000606 118 000616 121 000625 122 000626 123 000630 125 000637 127 000645 129 000665 131 000703 134 000710 136 000711 138 000746 139 000751 144 000752 146 000765 147 001005 148 001007 150 001047 155 001050 156 001051 157 001061 159 001075 160 001113 162 001132 163 001140 165 001141 166 001153 167 001155 168 001165 171 001254 172 001257 174 001260 175 001263 176 001266 177 001271 182 001272 184 001304 186 001306 189 001360 190 001377 191 001402 194 001403 195 001413 196 001435 197 001443 198 001447 200 001450 201 001452 205 001453 207 001473 208 001475 209 001525 214 001526 215 001530 217 001540 219 001543 220 001553 221 001557 222 001566 223 001570 224 001604 225 001607 226 001611 227 001612 228 001615 229 001617 230 001621 231 001622 232 001624 233 001626 234 001630 235 001631 236 001636 237 001644 238 001646 239 001650 240 001652 241 001653 242 001655 243 001657 244 001661 245 001664 248 001667 250 001670 252 001673 254 001733 256 001734 260 001736 261 001742 262 001744 263 001755 264 001761 265 001776 267 002002 268 002011 269 002015 270 002020 271 002025 273 002034 274 002040 275 002042 277 002043 279 002045 280 002047 281 002105 282 002107 285 002111 286 002113 287 002145 289 002147 290 002151 291 002154 297 002155 298 002165 299 002170 300 002223 302 002224 303 002233 304 002236 305 002271 308 002272 309 002301 310 002305 311 002306 313 002320 315 002331 317 002347 318 002351 319 002372 320 002374 321 002424 323 002425 324 002451 325 002453 326 002503 328 002504 329 002527 330 002531 331 002566 333 002567 334 002572 335 002575 336 002577 337 002602 338 002636 340 002637 341 002643 342 002646 343 002676 345 002677 346 002702 347 002704 351 002712 352 002713 353 002715 355 002721 356 002751 358 003006 359 003016 360 003021 361 003051 363 003052 364 003061 365 003064 366 003114 369 003115 371 003117 372 003130 373 003141 374 003144 376 003155 377 003156 379 003157 381 003162 382 003164 383 003170 387 003171 397 003202 398 003203 399 003215 400 003233 401 003251 402 003253 403 003255 404 003257 405 003274 406 003311 407 003314 408 003350 410 003351 414 003352 420 003354 421 003370 422 003374 423 003377 424 003405 425 003411 427 003412 431 003413 436 003424 440 003433 443 003441 444 003446 445 003456 447 003470 448 003475 449 003506 450 003512 452 003537 453 003542 454 003544 456 003550 ----------------------------------------------------------- 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