COMPILATION LISTING OF SEGMENT set_proc_required Compiled by: Multics PL/I Compiler, Release 33e, of October 6, 1992 Compiled at: CGI Compiled on: 2000-04-17_1927.99_Mon_mdt Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Bull Inc., 1987 * 4* * * 5* * Copyright, (C) Honeywell Information Systems Inc., 1982 * 6* * * 7* * Copyright (c) 1972 by Massachusetts Institute of * 8* * Technology and Honeywell Information Systems, Inc. * 9* * * 10* *********************************************************** */ 11 12 13 /****^ HISTORY COMMENTS: 14* 1) change(81-10-01,Bongiovanni), approve(), audit(), install(): 15* Pre-hcom comments. 16* Written October 1981 by J. Bongiovanni. 17* 2) change(87-01-14,Lippard), approve(87-02-09,MCR7616), 18* audit(87-06-03,Farley), install(87-08-06,MR12.1-1064): 19* Modified to use hcs_$set_procs_required. 20* 3) change(87-08-08,Lippard), approve(87-02-09,PBF7616), 21* audit(87-08-11,Farley), install(87-08-18,MR12.1-1090): 22* Modified to use hcs_$get_procs_required and 23* phcs_$get_system_procs_required. 24* END HISTORY COMMENTS */ 25 26 27 /* format: style3 */ 28 set_proc_required: 29 sprq: 30 proc; 31 32 /* set_proc_required, list_proc_required 33* 34* Program to set and list either the set of CPUs on which this process may 35* run, or the system default set of CPUs. 36* 37* Usage: 38* 39* set_proc_required {tag1} ... {tagN} {-control_args} 40* 41* If no CPU tags are specified, the current system default is used. 42* 43* -priv sets the system default 44* 45* list_proc_required {-control_args} 46* 47* -priv lists the current system default 48* 49* May be invoked as an active function 50**/ 51 52 /* Automatic */ 53 54 dcl af_entry bit (1); /* ON => called as active function */ 55 dcl af_ret_maxl fixed bin (21); /* max length of active function return arg */ 56 dcl af_ret_ptr ptr; /* pointer to active function return arg */ 57 dcl arg_no fixed bin; /* current argument number */ 58 dcl argc fixed bin (21); /* character index into current arg */ 59 dcl argl fixed bin (21); /* current argument length */ 60 dcl argp ptr; /* current argument pointer */ 61 dcl code fixed bin (35); /* standard error code */ 62 dcl gate_entry entry (bit (8) aligned, fixed bin (35)) variable; 63 /* gate to call for set */ 64 dcl my_name char (32); /* name of this command */ 65 dcl n_args fixed bin; /* number of arguments */ 66 dcl new_cpu_string bit (8) aligned; /* bit string for set */ 67 dcl new_is_default bit (1) aligned; /* ON => process CPUs required is system default after set */ 68 dcl old_cpu_string bit (8) aligned; /* former (or current) bit string */ 69 dcl old_is_default bit (1) aligned; /* ON => process CPUs required is system default before set */ 70 dcl priv_sw bit (1); /* ON => -priv given */ 71 dcl set_entry bit (1); /* ON => set_proc_required */ 72 73 /* Static */ 74 75 dcl CPU_TAGS char (16) int static options (constant) init ("ABCDEFGHabcdefgh"); 76 77 /* Based */ 78 79 dcl af_ret char (af_ret_maxl) varying based (af_ret_ptr); 80 dcl arg char (argl) based (argp); 81 82 /* Entry */ 83 84 dcl check_gate_access_ entry (char (*), ptr, fixed bin (35)); 85 dcl com_err_ entry options (variable); 86 dcl cu_$af_return_arg entry (fixed bin, ptr, fixed bin (21), fixed bin (35)); 87 dcl cu_$arg_ptr entry (fixed bin, ptr, fixed bin (21), fixed bin (35)); 88 dcl hcs_$get_procs_required 89 entry (bit (8) aligned, bit (1) aligned, fixed bin (35)); 90 dcl hcs_$set_procs_required 91 entry (bit (8) aligned, fixed bin (35)); 92 dcl hphcs_$set_system_procs_required 93 entry (bit (8) aligned, fixed bin (35)); 94 dcl ioa_ entry options (variable); 95 dcl phcs_$get_system_procs_required 96 entry (bit (8) aligned); 97 98 /* External */ 99 100 dcl error_table_$active_function 101 fixed bin (35) external; 102 dcl error_table_$badopt fixed bin (35) external; 103 dcl error_table_$noarg fixed bin (35) external; 104 105 /* Builtin */ 106 107 dcl char builtin; 108 dcl codeptr builtin; 109 dcl index builtin; 110 dcl length builtin; 111 dcl mod builtin; 112 dcl substr builtin; 113 dcl verify builtin; 114 115 set_entry = "1"b; 116 my_name = "set_proc_required"; 117 goto COMMON; 118 119 list_proc_required: 120 entry; 121 122 set_entry = "0"b; 123 my_name = "list_proc_required"; 124 125 COMMON: 126 af_entry = "0"b; 127 128 call cu_$af_return_arg (n_args, af_ret_ptr, af_ret_maxl, code); 129 /* find out if we're an active function */ 130 if code = 0 131 then /* active function */ 132 if set_entry 133 then do; /* not allowed for set_proc_required */ 134 call com_err_ (error_table_$active_function, my_name); 135 return; 136 end; 137 else af_entry = "1"b; 138 139 new_cpu_string = "0"b; 140 new_is_default = "0"b; 141 old_is_default = "0"b; 142 priv_sw = "0"b; 143 144 do arg_no = 1 to n_args; 145 call cu_$arg_ptr (arg_no, argp, argl, code); 146 if char (arg, 1) = "-" 147 then do; 148 if arg = "-priv" 149 then priv_sw = "1"b; 150 else do; 151 BAD_OPT: 152 call com_err_ (error_table_$badopt, my_name, arg); 153 return; 154 end; 155 end; 156 else do; /* Probably CPU tag */ 157 if ^set_entry 158 then goto BAD_OPT; /* list_proc_required doesn't take CPU tag */ 159 if verify (arg, CPU_TAGS) ^= 0 160 then do; 161 call com_err_ (0, my_name, "Invalid CPU Tag(s) ^a", arg); 162 return; 163 end; 164 do argc = 1 to argl; 165 substr (new_cpu_string, mod (index (CPU_TAGS, substr (arg, argc, 1)) - 1, 8) + 1, 1) = "1"b; 166 end; 167 end; 168 end; 169 170 171 if set_entry & priv_sw & (new_cpu_string = "0"b) 172 then do; /* CPU tags must be supplied with -priv */ 173 call com_err_ (error_table_$noarg, my_name, "CPU tag(s)"); 174 return; 175 end; 176 177 if priv_sw 178 then do; 179 call check_gate_access_ ("phcs_", codeptr (set_proc_required), code); 180 if code ^= 0 181 then do; 182 call com_err_ (code, my_name, "phcs_"); 183 return; 184 end; 185 186 if set_entry 187 then do; 188 call check_gate_access_ ("hphcs_", codeptr (set_proc_required), code); 189 if code ^= 0 190 then do; 191 call com_err_ (code, my_name, "hphcs_"); 192 return; 193 end; 194 end; 195 196 call phcs_$get_system_procs_required (old_cpu_string); 197 end; 198 else do; 199 call hcs_$get_procs_required (old_cpu_string, old_is_default, code); 200 201 if code ^= 0 202 then do; 203 call com_err_ (code, my_name, "set_proc_required.acs"); 204 return; 205 end; 206 end; 207 208 if set_entry 209 then do; /* set_proc_required */ 210 if priv_sw 211 then gate_entry = hphcs_$set_system_procs_required; 212 else gate_entry = hcs_$set_procs_required; 213 214 call gate_entry (new_cpu_string, code); 215 if code ^= 0 216 then do; 217 call com_err_ (code, my_name); 218 return; 219 end; 220 221 if priv_sw 222 then call phcs_$get_system_procs_required (new_cpu_string); 223 else do; 224 call hcs_$get_procs_required (new_cpu_string, new_is_default, code); 225 226 if code ^= 0 227 then do; 228 call com_err_ (code, my_name, "set_proc_required.acs"); 229 return; 230 end; 231 end; 232 233 call ioa_ ("^a: ^[System ^;^]CPUs required changed from ^a^[ (default)^;^] to ^a^[ (default)^;^]", 234 my_name, priv_sw, cpu_tags (old_cpu_string), (old_is_default), cpu_tags (new_cpu_string), 235 (new_is_default)); 236 end; 237 else do; /* list_proc_required */ 238 if af_entry 239 then /* active function */ 240 af_ret = cpu_tags (old_cpu_string); 241 else call ioa_ ("^a: ^[System ^;^]CPUs Required: ^a^[ (default)^;^]", my_name, priv_sw, 242 cpu_tags (old_cpu_string), (old_is_default)); 243 end; 244 245 return; 246 247 /* Internal procedure to convert a bit string to a character string 248* of CPU tags */ 249 250 cpu_tags: 251 proc (cpu_string) returns (char (*)); 252 253 dcl cpu_string bit (8) aligned; /* cpu string */ 254 255 dcl cpu_ix fixed bin; 256 dcl cpu_tag_string char (8) varying; 257 258 cpu_tag_string = ""; 259 do cpu_ix = 1 to length (cpu_string); 260 if substr (cpu_string, cpu_ix, 1) 261 then cpu_tag_string = cpu_tag_string || substr (CPU_TAGS, cpu_ix, 1); 262 end; 263 264 return (cpu_tag_string); 265 266 267 end cpu_tags; 268 1 1 /* BEGIN INCLUDE FILE ... apte.incl.pl1 */ 1 2 1 3 /* Modified 1984-11-11 by E. Swenson for IPC event channel validation. */ 1 4 1 5 dcl aptep pointer; 1 6 1 7 dcl 1 apte based (aptep) aligned, /* APT entry declaration for an active (known) process */ 1 8 2 thread unaligned, /* List thread */ 1 9 3 fp bit (18), /* Forward pointer */ 1 10 3 bp bit (18), /* Backward pointer */ 1 11 2 flags unaligned, /* Flags and miscellaneous */ 1 12 3 mbz bit (1), /* This bit must be zero (sentinel bit) */ 1 13 3 wakeup_waiting bit (1), /* ON if process has received wakeup */ 1 14 3 stop_pending bit (1), /* ON if process has received stop connect */ 1 15 3 pre_empted bit (1), /* ON if process is being pre-empted by get_processor */ 1 16 3 hproc bit (1), /* ON if process is hardcore process */ 1 17 3 loaded bit (1), /* ON if required per-process pages are in memory and wired */ 1 18 3 eligible bit (1), /* ON if process is eligible */ 1 19 3 idle bit (1), /* ON if this is an idle process */ 1 20 3 interaction bit (1), /* ON if process has interacted recently */ 1 21 3 pre_empt_pending bit (1), /* ON if process has received pre-empt connect */ 1 22 3 default_procs_required bit (1), /* ON if apte.procs_required is system default */ 1 23 3 realtime_burst bit (1), /* ON if next eligibility is realtime */ 1 24 3 always_loaded bit (1), /* ON if process is not to be unloaded */ 1 25 3 dbr_loaded bit (1), /* ON if DBR is loaded on some CPU */ 1 26 3 being_loaded bit (1), /* ON if somebody loading this process */ 1 27 3 shared_stack_0 bit (1), /* ON if a shared stack_0 is assigned */ 1 28 3 page_wait_flag bit (1), /* flag ON if waiting for page */ 1 29 3 firstsw bit (1), /* OFF until process is intialized */ 1 30 3 state bit (18), /* execution state */ 1 31 2 page_faults fixed bin (35), /* total page faults for the process */ 1 32 2 processid bit (36), /* bit 0-17: offset of ATPE */ 1 33 /* bit 18-35: sequential number */ 1 34 2 te fixed bin (35), /* virtual time since eligibility award */ 1 35 2 ts fixed bin (35), /* virtual time since scheduling */ 1 36 2 ti fixed bin (35), /* virtual time since interaction */ 1 37 2 timax fixed bin (35), /* maximum value allowed for apte.ti */ 1 38 1 39 /* * * * * * * * */ 1 40 1 41 2 ipc_pointers unaligned, 1 42 3 event_thread bit (18), /* relative pointer to ITT list */ 1 43 3 pad3 bit (18), 1 44 2 ips_message bit (36), /* IPS signals pending */ 1 45 2 asteps unaligned, /* relative ASTE pointers */ 1 46 3 pds bit (18), /* PDS (per-process) */ 1 47 3 dseg bit (18), /* DSEG (per-process) */ 1 48 3 prds bit (18), /* PRDS (per-processor) */ 1 49 2 savex7 bit (18) unaligned, /* x7 at call to getwork (return point in pxss) */ 1 50 2 term_processid bit (36), /* process to send wakeup at temination */ 1 51 2 lock_id bit (36), /* File System unqieu ID associated with process */ 1 52 2 time_used_clock fixed bin (71), /* Total CPU time when process last lost CPU */ 1 53 1 54 /* * * * * * * * */ 1 55 1 56 2 wait_event bit (36) aligned, /* Event ID process awaiting */ 1 57 2 wct_index bit (18) unaligned, /* rel offset of WCTE */ 1 58 2 flags2 unaligned, 1 59 3 priority_scheduling bit (1), /* ON if guaranteed eligibility */ 1 60 3 special_wakeups bit (6), /* Special wakeup channels */ 1 61 3 pad7 bit (7), 1 62 3 batch bit (1), /* ON if absentee */ 1 63 3 pr_tag bit (3), /* CPU tag running or last run */ 1 64 2 state_change_time fixed bin (71), /* Time apte.state last changed */ 1 65 2 alarm_event fixed bin (71), /* wakeup event for alarm clock manager */ 1 66 2 alarm_time_thread bit (18) unaligned, /* thread of processes with pending alarms */ 1 67 2 alarm_time bit (54) unaligned, /* wakeup time for alarm */ 1 68 1 69 /* * * * * * */ 1 70 1 71 2 term_channel fixed bin (71), /* wakeup event for account overflow */ 1 72 2 ws_size fixed bin, /* working set estimate for the process */ 1 73 2 temax fixed bin (35), /* maximum eligibility slice (vcpu) */ 1 74 2 deadline fixed bin (71), /* time of next run */ 1 75 2 lock bit (18) unaligned, /* 0 => APTE locked, unlocked => return point of last unlock */ 1 76 2 unusable bit (18) unaligned, /* locking routines destroy */ 1 77 2 cpu_monitor fixed bin (35), /* if not 0, send wakeup to term_processid when virtual cpu 1 78* /* reaches this (units = 1/1024 sec) */ 1 79 2 paging_measure fixed bin (71), /* cumulative memory units */ 1 80 2 access_authorization bit (72), /* authorization of this process */ 1 81 2 dbr fixed bin (71), /* DBR value (constant since DSEG entry-held) */ 1 82 1 83 2 virtual_cpu_time fixed bin (71), /* cumulative virtual CPU time for the process */ 1 84 2 ittes_sent fixed bin (18), /* Unprocessed ITTs sent by this process */ 1 85 2 ittes_got fixed bin (18), /* Unprocessed ITTs received by this process */ 1 86 1 87 /* Cells used to drive and instrument finite-state model for response time 1 88* measurement. Maintained by meter_response_time */ 1 89 1 90 2 current_response_state fixed bin (17) unaligned, /* Process state in modle */ 1 91 2 pad18 bit (18) unaligned, 1 92 2 number_processing fixed bin (35), /* Number interactions */ 1 93 2 last_response_state_time fixed bin (71), /* Clock time at last response state change */ 1 94 2 total_processing_time fixed bin (71), /* Total interaction processing time */ 1 95 1 96 /* * * * * * */ 1 97 1 98 2 begin_interaction_vcpu fixed bin (71), /* Virtual cpu at beginning of last interaction */ 1 99 1 100 /* End of cells for finite-state model */ 1 101 1 102 2 saved_temax fixed bin (35), /* temax at eligibility award */ 1 103 2 procs_required bit (8) unaligned, /* bit mask of CPUs this process can run */ 1 104 2 pad4 bit (28) unaligned, 1 105 2 ipc_r_offset fixed bin (18) unsigned, 1 106 2 ipc_r_factor fixed bin (35) unsigned, 1 107 2 apad (10) fixed bin (35); 1 108 1 109 /* END INCLUDE FILE ... apte.incl.pl1 */ 269 270 271 end set_proc_required; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 04/17/00 1927.9 set_proc_required.pl1 >udd>sm>ds>w>ml>set_proc_required.pl1 269 1 01/06/85 1522.2 apte.incl.pl1 >ldd>incl>apte.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. CPU_TAGS 000000 constant char(16) initial packed unaligned dcl 75 ref 159 165 260 af_entry 000100 automatic bit(1) packed unaligned dcl 54 set ref 125* 137* 238 af_ret based varying char dcl 79 set ref 238* af_ret_maxl 000101 automatic fixed bin(21,0) dcl 55 set ref 128* 238 af_ret_ptr 000102 automatic pointer dcl 56 set ref 128* 238 arg based char packed unaligned dcl 80 set ref 146 148 151* 159 161* 165 arg_no 000104 automatic fixed bin(17,0) dcl 57 set ref 144* 145* argc 000105 automatic fixed bin(21,0) dcl 58 set ref 164* 165* argl 000106 automatic fixed bin(21,0) dcl 59 set ref 145* 146 148 151 151 159 161 161 164 165 argp 000110 automatic pointer dcl 60 set ref 145* 146 148 151 159 161 165 char builtin function dcl 107 ref 146 check_gate_access_ 000010 constant entry external dcl 84 ref 179 188 code 000112 automatic fixed bin(35,0) dcl 61 set ref 128* 130 145* 179* 180 182* 188* 189 191* 199* 201 203* 214* 215 217* 224* 226 228* codeptr builtin function dcl 108 ref 179 179 188 188 com_err_ 000012 constant entry external dcl 85 ref 134 151 161 173 182 191 203 217 228 cpu_ix 000100 automatic fixed bin(17,0) dcl 255 set ref 259* 260 260* cpu_string parameter bit(8) dcl 253 ref 250 259 260 cpu_tag_string 000101 automatic varying char(8) dcl 256 set ref 258* 260* 260 264 cu_$af_return_arg 000014 constant entry external dcl 86 ref 128 cu_$arg_ptr 000016 constant entry external dcl 87 ref 145 error_table_$active_function 000032 external static fixed bin(35,0) dcl 100 set ref 134* error_table_$badopt 000034 external static fixed bin(35,0) dcl 102 set ref 151* error_table_$noarg 000036 external static fixed bin(35,0) dcl 103 set ref 173* gate_entry 000114 automatic entry variable dcl 62 set ref 210* 212* 214 hcs_$get_procs_required 000020 constant entry external dcl 88 ref 199 224 hcs_$set_procs_required 000022 constant entry external dcl 90 ref 212 hphcs_$set_system_procs_required 000024 constant entry external dcl 92 ref 210 index builtin function dcl 109 ref 165 ioa_ 000026 constant entry external dcl 94 ref 233 241 length builtin function dcl 110 ref 259 mod builtin function dcl 111 ref 165 my_name 000120 automatic char(32) packed unaligned dcl 64 set ref 116* 123* 134* 151* 161* 173* 182* 191* 203* 217* 228* 233* 241* n_args 000130 automatic fixed bin(17,0) dcl 65 set ref 128* 144 new_cpu_string 000131 automatic bit(8) dcl 66 set ref 139* 165* 171 214* 221* 224* 233* new_is_default 000132 automatic bit(1) dcl 67 set ref 140* 224* 233 old_cpu_string 000133 automatic bit(8) dcl 68 set ref 196* 199* 233* 238* 241* old_is_default 000134 automatic bit(1) dcl 69 set ref 141* 199* 233 241 phcs_$get_system_procs_required 000030 constant entry external dcl 95 ref 196 221 priv_sw 000135 automatic bit(1) packed unaligned dcl 70 set ref 142* 148* 171 177 210 221 233* 241* set_entry 000136 automatic bit(1) packed unaligned dcl 71 set ref 115* 122* 130 157 171 186 208 substr builtin function dcl 112 set ref 165* 165 260 260 verify builtin function dcl 113 ref 159 NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. apte based structure level 1 dcl 1-7 aptep automatic pointer dcl 1-5 NAMES DECLARED BY EXPLICIT CONTEXT. BAD_OPT 000275 constant label dcl 151 ref 157 COMMON 000162 constant label dcl 125 ref 117 cpu_tags 001234 constant entry internal dcl 250 ref 233 233 238 241 list_proc_required 000151 constant entry external dcl 119 set_proc_required 000135 constant entry external dcl 28 ref 179 179 188 188 sprq 000126 constant entry external dcl 28 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 1714 1754 1503 1724 Length 2170 1503 40 177 210 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME sprq 198 external procedure is an external procedure. cpu_tags 68 internal procedure uses returns(char(*)) or returns(bit(*)), and is called during a stack extension. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME cpu_tags 000100 cpu_ix cpu_tags 000101 cpu_tag_string cpu_tags sprq 000100 af_entry sprq 000101 af_ret_maxl sprq 000102 af_ret_ptr sprq 000104 arg_no sprq 000105 argc sprq 000106 argl sprq 000110 argp sprq 000112 code sprq 000114 gate_entry sprq 000120 my_name sprq 000130 n_args sprq 000131 new_cpu_string sprq 000132 new_is_default sprq 000133 old_cpu_string sprq 000134 old_is_default sprq 000135 priv_sw sprq 000136 set_entry sprq THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. call_ent_var call_ext_out_desc call_ext_out call_int_this_desc return_mac mdfx1 shorten_stack ext_entry int_entry_desc return_chars_eis THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. check_gate_access_ com_err_ cu_$af_return_arg cu_$arg_ptr hcs_$get_procs_required hcs_$set_procs_required hphcs_$set_system_procs_required ioa_ phcs_$get_system_procs_required THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$active_function error_table_$badopt error_table_$noarg LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 28 000125 115 000142 116 000144 117 000147 119 000150 122 000156 123 000157 125 000162 128 000163 130 000200 134 000204 135 000221 137 000222 139 000224 140 000225 141 000226 142 000227 144 000230 145 000237 146 000254 148 000265 151 000275 153 000321 155 000322 157 000323 159 000325 161 000340 162 000374 164 000375 165 000405 166 000422 168 000424 171 000426 173 000436 174 000463 177 000464 179 000467 180 000514 182 000516 183 000541 186 000542 188 000544 189 000571 191 000573 192 000616 196 000617 197 000626 199 000627 201 000642 203 000644 204 000670 208 000671 210 000673 212 000704 214 000711 215 000721 217 000723 218 000740 221 000741 224 000754 226 000767 228 000771 229 001015 233 001016 236 001117 238 001121 241 001155 243 001231 245 001232 250 001233 258 001241 259 001242 260 001247 262 001265 264 001267 ----------------------------------------------------------- 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