﻿__group__	ticket	summary	component	version	type	owner	status	created	_changetime	_description	_reporter
	8	ISOLTS executes pas2 test harness incorrectly.	General		defect	Eric Swenson	new	2017-01-12T17:07:11Z	2017-01-12T17:07:11Z	"Running the pas2 exec command 'hdump' produces an infinite listing of history resister values.

"	charles.unix.pro@…
	26	Update clok card to support contemporary time zones	Hardcore		defect	Eric Swenson	new	2017-02-11T06:50:07Z	2017-02-11T06:50:15Z	Bring the configuration deck 'clok' card time zone list up to contemporary usage. -- Charles	Eric Swenson
	36	pcref does not ken .cds segments	Tools		defect	Eric Swenson	new	2017-02-11T07:23:39Z	2019-05-22T03:15:41Z	"As part of the Y2K and time-zone issues, the pcref tool was used to locate references to
decode_clock_value_$date_time. prcef relies on data gathered by crossref, which analyzes
compiled/assembled segments to locate references to entry points.

However, .cds segments are not known to crorssref, has the compiled cds segments are not part of the built
code; only their output is.

The entry decode_clock_value_$date_time parameter zone was changed from char (3) to char (4); due to 
pcref not searching the CDS segments, the change was not propagated to those segments.

Searching the Multics source reveals:

bound_pl1_.1.s.archive/pl1_version.cds

dcl decode_clock_value_$date_time
entry (fixed bin (71), fixed bin, fixed bin, fixed bin, fixed bin, fixed bin, fixed bin,
fixed bin (71), fixed bin, char (3), fixed bin (35));

This is the only date_time reference that I can locate in the .cds segments."	canthony
	11	ISOLTS misses test opportunity	Documentation		enhancement	Eric Swenson	new	2017-02-05T18:38:17Z	2020-04-03T22:56:11Z	"The ISOLTS process includes instructing the operator to ""depress the initialize and clear push button"", but fails to verify that memory was actually cleared.

Failure of the operator is clear memory will result in incorrect test behavior, so it is reasonable for ISOLTS to verify that memory was cleared.

Failure of memory being cleared if the button was pressed would be indicative of a configuration or hardware failure, so it is reasonable that ISOLTS verify that was memory was cleared when the opportunity presents itself.

Before loading the PFT tests into the test segment, ISOLTS should check that the test segment is indeed set to all zeros, and if not, report that memory was not zero, indicating operator error, CPU malfunction or SCU malfunction.

Additionally, it should zero the memory before proceeding with the tests.

"	anonymous
	72	Self-destructive Salvage Behavior	General		defect	Eric Swenson	new	2017-04-05T21:18:06Z	2017-12-23T00:21:54Z	"I once did a crash dump but did not do an esd afterwards.

The volume was rebooted with rpvs, but the volume was badly damaged.

I observed that the 'copy dump' step ran before the salvage completed and I hypothesis that this contributed to the poor state of the volume after salvaging.

I see no reason why the 'copy dump' step should not wait for the salvage to complete. The data being copied is in the dump partition and should be completely untouched by the salvager; the copy operation will be adding segments to volume, and that should wait until salvaging is complete to avoid further damage to the volume.

"	charles.unix.pro@…
	104	The behavior of the backup_dump does not match documentation w.r.t. '-nohold'	Hardcore		defect	Eric Swenson	new	2018-02-04T23:06:54Z	2018-02-04T23:06:54Z	"The backup utilities are documented as unloading tapes by default, but do not.

complete_dump.info, backup_dump.info, catchup_dump.info:

{{{
-nohold
   rewinds and unloads the hierarchy dump tape or tapes at the end of
   the current dump pass.  This is the default.

}}}

start_dump.info:

{{{
-nohold
   rewinds and unloads the hierarchy dump tape or tapes at the end of
   the current dump pass.  This is the default for all hierarchy dump
   modes except incremental.
}}}




{{{
bk_ss_.cds:       2 holdsw bit (1),				/* ON => do not unmount tape when done */
bk_ss_.cds:	bk_static.holdsw = ""0""b;

}}}

 bk_arg_reader_:


{{{
               else if op = ""hold"" then bk_ss_$holdsw = ""1""b; /* do not dismount */
               else if op = ""nohold"" then bk_ss_$holdsw = """"b; /* dismount, default */
}}}


then in start_dump.pl1, after 'examine_arguments:' (the ""join"" for complete_dump, catchup_dump, start_dump):


{{{
          bk_ss_$holdsw = ""1""b;
}}}

""-nohold"" is also the documented behavior for 'retreive' and 'reload', but I have not tested the actual behavior.

retrieve.info, reload.info:

{{{

The following defaults are in effect for the reloader and retriever
before any backup commands are given; they are not, however, reset to
these values at the start of each backup command, except as noted
below.

      -all                    -noquota
      -error_of               -primary
      -map                    -reload
      -nodebug                -setlvid
      -nohold                 -trim

}}}
"	anonymous
MR12.5	256	Multics allows a config deck with non-distinct SCU ports for multiple CPUs	Hardcore	MR12.5	defect	Eric Swenson	new	2021-11-03T01:42:27Z	2021-11-03T01:42:37Z	"If you author a config deck with, say:

{{{
cpu  a  7  on  dps8  70.  8.
cpu  b  7  off  dps8  70.  8.
}}}

Multics doesn't warn you.  If you then try to add the cpu designated as ""off"" in the config deck, Multics hangs."	Eric Swenson
MR12.5	391	exec_com &condition_info_ptr parameter is mis-described.	Documentation	MR12.5	defect	Eric Swenson	new	2026-06-19T00:03:58Z	2026-06-19T15:28:31Z	"The exec_com (version 2) program language includes a set of features which enable the program to establish an on-unit to handle one or more conditions that might occur while the program is executing.

{{{
&on active_function_error &begin
   &set status_code 
&+      &[status_code_name &condition_name &condition_info_ptr]
   &print Condition &condition_name occurred to report event
   &print &""   "" at location &condition_info_ptr 
   &print &""   "" with status code named:  &(status_code)
   &goto EXIT
   &end

string [path <><>]

&label EXIT
&quit
}}}

The &condition_info_ptr parameter is documented to expand to a 
virtual pointer (<segment_number>|<offset>) locating a 
condition_info structure describing the condition being handled.  

This description is wrong.  &condition_info_ptr actually locates
a condition_info_header structure that begins the specific data
structure associated with the signaled condition named &condition_name.

For example, the data structure associated with a command_error or
active_function_error condition is called com_af_error_info.  It is
declared as shown below.

{{{
/* BEGIN INCLUDE FILE com_af_error_info.incl.pl1 April 81 BIM */
/* format: style2 */

/* info structures for command error and active function error */
/* The include file condition_info_header must be included to  */
/* use this file */

     dcl com_af_error_info_ptr  pointer;
     dcl 1 com_af_error_info    aligned based (com_af_error_info_ptr),
           2 header             aligned like condition_info_header,
           2 name_ptr           ptr,
           2 name_lth           fixed bin,
           2 errmess_ptr        ptr,
           2 errmess_lth        fixed bin (21),
           2 max_errmess_lth    fixed bin (21),
           2 print_sw           bit (1);

dcl com_af_error_info_version_3 internal static options (constant) 
                                init (3);

/* END INCLUDE FILE com_af_error_info */

/* BEGIN INCLUDE FILE condition_info_header.incl.pl1 BIM 1981 */
/* format: style2 */

 dcl condition_info_header_ptr  pointer;
 dcl 1 condition_info_header    based (condition_info_header_ptr)
                                aligned,
     2 length                   fixed bin,              /* length in words of this structure */
     2 version                  fixed bin,              /* version number of this structure */
     2 action_flags             aligned,                /* tell handler how to proceed */
       3 cant_restart           bit (1) unaligned,      /* caller doesn't ever want to be returned to */
       3 default_restart        bit (1) unaligned,      /* caller can be returned to with no further action */
       3 quiet_restart          bit (1) unaligned,      /* return, and print no message */
       3 support_signal         bit (1) unaligned,      /* treat this signal as if the signalling procedure had the support bit set */
                                                        /* if the signalling procedure had the support bit set, do the same for its caller */
       3 pad                    bit (32) unaligned,
     2 info_string              char (256) varying,     /* may contain printable message */
     2 status_code              fixed bin (35);         /* if^=0, code interpretable by com_err_ */

/* END INCLUDE FILE condition_info_header.incl.pl1 */
}}}

The value displayed by the &condition_info_ptr parameter is 
associated with a condition_info structure only in the sense
that condition_info.info_ptr holds the value reported by that 
parameter.

Executing an exec_com program with the statements above correctly
reports the value stored in com_af_error_info.status_code.

{{{
ec test_status
Condition active_function_error occurred to report event
   at location 234|14716 
   with a status_code named: error_table_$bad_path

r 16:54 0.192 7 level 2

}}}

This documentation error should eventually be corrected.  Meanwhile,
this ticket can warn users about the documentation flaw in 
the Multics Commands and Active Functions (AG92-06B) page 3-322
where the &condition_info_ptr parameter is described. 
"	gary.c.dixon@…
MR12.5	392	compare_entry_names tool has several problems.	Standard Library	MR12.5	defect	Eric Swenson	new	2026-06-20T18:18:56Z	2026-06-20T18:18:56Z	"PROBLEM 1:  The compare_entry_names tool is documented to compare the names on two file system entries.  


{{{
help compare_entry_names -all

>doc>info>compare_entry_names.info   (14 lines in info)

1986-01-28  compare_entry_names, cen

Syntax as a command:  cen path1 path2

Function: compares the names on two entries in the storage system and
prints information about the differences.

Arguments:
path1
   is the pathname of the first entry.  You can't use the star
   convention.
path2
   is the pathname of the second entry.  You can use the equal
   convention.
}}}


However, because it chases links when locating the two ""entries"", it fails to compare names on a branch with names on a link to that branch that is located in a different directory.  Instead, it compares unique IDs of the two entries and complains they are the same segment.

The function it is actually performing should be called compare_branch_names.

To correct this problem: 
  A) calls to hcs_$status_long should pass a NO_CHASE argument value; and 
  B) the code should check if either entry is a Link before comparing unique IDs of the two branches.  If either is a Link, then it must skip unique ID comparison because Link entries do not have a unique ID.


PROBLEM 2: Because of a well-known flaw in the design of the hcs_$status_ and hcs_$status_long interfaces, the names on the target entry may be allocated in an extension component of an extensible area, and therefore may not be addressable by the calling program.

From status_structures.incl.pl1, the declaration for the name array returned by these two subroutines is declared as shown below.  In declaring status_entry_names, the array is located by combining the baseptr of the FIRST component segment of the extensible area with a relative offset of the allocated array within SOME component segment of the extensible area.  But the caller cannot tell which component holds the name array.  That is the flaw.

{{{
dcl 1 status_branch aligned based (status_ptr),
    2 short aligned,
      3 type fixed bin (2) unaligned unsigned,              /* seg, dir, or link */
      3 nnames fixed bin (16) unaligned unsigned,           /* number of names */
      3 names_relp bit (18) unaligned,                      /* see entry_names dcl */
         ...

dcl  status_entry_names (status_branch.nnames) character (32) aligned
          based (pointer (status_area_ptr, status_branch.names_relp));
}}}

compare_entry_names uses the area provided by get_system_free_area_ which is an extensible area.  Therefore, it is susceptible to this problem.

One possible solution is to use a non-extensible automatic area sufficiently large to hold the name array allocations.  For example, an area of 17000 words is large enough to hold two 1000-entry name arrays, and would occupy only 17 pages of stack storage.


PROBLEM 3: compare_entry_names tries to rejoin the directory and entryname portions of a pathname back together by just separating the two names with a greater-than (>) character.  For example:

{{{
      call ioa_ (""^/Names unique to ^a>^a"", dname1, ename1);
}}}

This method fails for entries in the root (>) directory.  It should be joining the two portions using the pathname_ subroutine."	Gary Dixon
MR12.5	405	Update >t>crossref.ec to include new >ldd>net library	Tools	MR12.5	defect	Eric Swenson	accepted	2026-08-31T16:34:03Z	2026-08-31T16:34:19Z	"The crossref exec_com generates cross references of the Multics libraries. Now that the new network library has been added to the release, this exec_com needs to include this library in its ""total"" cross reference."	Eric Swenson
MR12.5	265	cref_analyze_ gives superfluous errors for non-object segments	Tools	MR12.5	defect	Eric Swenson	new	2021-12-04T18:59:04Z	2023-05-01T17:46:59Z	"If you attempt to produce a crossref, you get lots of spurious errors from cref_analyze_ for every non-object segment it encounters (e.g. exec_coms, data files, etc.).  The error messages look like:

{{{
cref_analyze_: There is an internal inconsistency in the segment. volume_sys_vols.dump is non-object.
}}}

These should probably just be surpressed, as these are not really errors and muddy up the output so that real errors are obscured."	Eric Swenson
MR12.5	272	Crank runs give warnings about missing PDTs	Administration	MR12.5	issue	Eric Swenson	accepted	2021-12-24T17:25:53Z	2023-05-01T17:47:23Z	"When you run the crank on a newly-coldbooted system, you get the following warnings:

{{{
pdt_copy: Entry not found. Operator.pdt
pdt_copy: Entry not found. HFED.pdt
pdt_copy: Entry not found. Terminals.pdt
compute_bill: Entry not found. Operator.pdt
compute_bill: Entry not found. HFED.pdt
compute_bill: Entry not found. Terminals.pdt
update_pdts_from_reqfile: Entry not found. Operator.pdt
update_pdts_from_reqfile: Entry not found. HFED.pdt
update_pdts_from_reqfile: Entry not found. Terminals.pdt
}}}

These are not fatal, and probably even reasonable. It probably makes sense to NOT install the Operator, HFED, and Terminals projects automatically.  However, if we agree that this is true, it might be nice to update the crank to not provide these warnings (or not).  

This ticket is here so that we can decide. "	Eric Swenson
MR12.6e	35	Finish support for passwords up to 32 characters in length	General	MR12.6e	defect	Eric Swenson	new	2017-02-11T07:19:09Z	2017-02-11T07:20:44Z	While the PNT software appears to support passwords greater than 8 characters in length, passwords are currently limited to 8 characters -- probably because the answering service doesn't support passwords greater than this length. In this day and age, limiting passwords to 8 characters provides laughable security. Since 32-character passwords appear to be supported at the PNT level, we should investigate what it would take to enable passwords of up to 32 characters.	Eric Swenson
MR12.6e	41	Add exec_com to >tools for bootstrapping PL/1 compiler	Tools	MR12.6e	defect	Eric Swenson	new	2017-02-12T05:03:46Z	2017-02-12T05:03:46Z	As part of fixing the cat_op issue with the PL/1 compiler, we decided to resume bootstrapping the compiler with each new compiler release. As part of doing this for version 33f (MR12.6f) of the PL/1 compiler, I created an exec_com (bootstrap_compiler.ec/.absin). We decided it might be a good idea to install it.  	Eric Swenson
MR12.6e	69	Invoking trace_stack in admin mode crashes Multics	Tools	MR12.6e	defect	Eric Swenson	new	2017-03-19T18:04:29Z	2021-12-28T23:12:26Z	"If you invoke the ""trace_stack"" (""ts"") command from admin mode, the system crashes when Initializer runs out of stack. It recurses trying to report a ""null pointer"" exception, getting another ""null pointer"" exception in the condition handler."	Eric Swenson
MR12.6e	75	'lst' loops endlessly when encountering broken archive segment	Standard Library	MR12.6e	defect	Eric Swenson	new	2017-05-15T22:59:57Z	2021-12-28T23:58:44Z	"lst -ac >ldd>unb>o>bound_lisp_library_.archive
      ac   59 >ldd>unb>o>bound_lisp_library_.archive
 ac_comp         bound_lisp_library_.bind
 ac_comp         display_lisp_object_segment
 ac_comp         lisp_backquote_
 ac_comp         lisp_defmacro_
 ac_comp         lisp_defstruct_
 ac_comp         lisp_defun_
 ac_comp         lisp_destructuring_let_
 ac_comp         lisp_editor_
 ac_comp         lisp_format_
 ac_comp         lisp_gfile_
 ac_comp         lisp_gfn_
 ac_comp         lisp_loop_
 ac_comp         lisp_macro_macros_
                 Format error encountered in archive segment.
                 (reading archive)
 ac_comp         bound_lisp_library_.bind
 ac_comp         display_lisp_object_segment
 ac_comp         lisp_backquote_
 ac_comp         lisp_defmacro_
 ac_comp         lisp_defstruct_

... repeats endlessly ....


"	charles.unix.pro@…
MR12.6e	346	Several ipc_ entry points are not documented	Documentation	MR12.6e	defect	Eric Swenson	new	2025-01-16T16:27:23Z	2025-01-16T16:27:23Z	"[MTB-749;https://multicians.org/mtbs/mtb749.html] documents several ipc_ entry points which were apparently implemented in 1986 or later, but not included in >doc>info>ipc_.info.  These include:


{{{
pcref ipc_$create_event_channel
References to ipc_$create_event_channel:  (bound_ipc_ in HARDCORE)
    login_server_.pl1, mowse_io_.pl1, tc_io_.pl1, tty_.pl1,
    ws_packet_dispatcher_.pl1, ws_packet_receiver_.pl1

r 23:20 0.123 0

pcref ipc_$run_event_calls
References to ipc_$run_event_calls:  (bound_ipc_ in HARDCORE)
    wkp_signal_handler_.pl1
}}}

Comparing the full list of ipc_ entry points retained in bound_ipc_:

{{{
segname:    bound_ipc_

symb|0          bind_map
symb|0          symbol_table

segnames:   ipc_
            convert_ipc_code_

text|3          block
text|51         convert_ipc_code_
text|5          create_ev_chn
text|7          create_event_channel      (doc missing)
text|11         cutoff
text|13         decl_ev_call_chn          (doc missing)
text|15         decl_ev_wait_chn
text|17         decl_event_call_chn
text|21         delete_ev_chn
text|23         drain_chn
text|25         mask_ev_calls
text|27         read_ev_chn
text|31         reassign_call_channels    (doc missing)
text|33         reconnect
text|35         reset_ev_call_chn         (doc missing)
text|37         run_event_calls           (doc missing)
text|41         set_call_prior
text|43         set_wait_prior
text|45         unmask_ev_calls
text|47         wait_for_an_event
}}}

with the entry points documented in the info segment:

{{{
Entry points in ipc_:
  ipc_$block                 ipc_$delete_ev_chn       ipc_$set_call_prior
  ipc_$create_ev_chn         ipc_$drain_chn           ipc_$set_wait_prior
  ipc_$cutoff                ipc_$mask_ev_calls       ipc_$unmask_ev_calls
  ipc_$decl_event_call_chn   ipc_$read_ev_chn
  ipc_$decl_ev_wait_chn      ipc_$reconnect
}}}
"	Gary Dixon
MR12.6e	403	Add ipc_$read_ev_chn to pl1.dcl	Tools	MR12.6e	defect	Gary Dixon	accepted	2026-08-31T01:43:52Z	2026-08-31T16:09:42Z	"All of the external entry points of ipc_ are included in pl1.dcl 
(because they are all referenced via the ipc_.alm transfer vector)
except for:
   ipc_$run_event_calls   ipc_$read_ev_chn

Because $run_event_calls entry point is only expected to be called by the wkp_signal_handler_, one could argue there is no need to include its declaration in the pl1.dcl segment.  But if so, then why is its entry point documented in ipc_.info?  Perhaps it should not be so documented.

ipc_$read_ev_chn is definitely designed for use by IPC users, and therefore should be declared in pl1.dcl.  This ticket recommends that repair.
"	Gary Dixon
MR12.6e	406	Make fast event-wait channels easier to poll	Administration	MR12.6e	enhancement	Gary Dixon	accepted	2026-09-01T15:22:33Z	2026-09-01T20:10:53Z	"The Inter-Process Communication (IPC) facility provides 4 types of event channels for notifying a process of an external event:  fast event-wait, (regular) event-wait, event-call and async event-call channel types.  The caller of ipc_$create_event_channel selects one of these types when creating a new channel.

 - An event-wait channel receives events that are recorded as having occurred.  The process owning the channel is awakened if it called ipc_$block to wait for an event on that channel.  Or the owning process can call ipc_$read_ev_chn to check if the channel has received an event.  An event_wait_info structure is returned to the caller by both of these subroutines.

 - A fast event-wait channel operates like a regular event-wait channel, but has no event record associated with each event.  Instead there is one bit, the **fast event bit** which gets set to record that one or more events have been reported on that channel.  Both ipc_$block and ipc_$read_ev_chn check and clear this bit when they report occurrence of the fast event-wait.  It is one of 36 event bits stored in ipc_data_$fast_channel_events external static variable of the Event Channel Table (ECT).

The other two types are the event-call channel, and async event-call channel.  Neither of these two types factor into this discussion.

            

For a fast event-wait channel, there should be some way to return a pointer to fast_event_bit.  That would permit the owner of a channel to rapidly check if an event had been reported while his process had been blocked (preempted for quantum run-out, or waiting for a timer to expire, or perhaps calling ipc_$block directly to wait for other event-wait channels).  

This would allow the owner to poll event status directly.  
 - If the owner found the fast_event_bit = ""1""b, the bit could be cleared (set to ""0""b) and the owner could then respond to the event (processing an pending inputs or outputs).

 - If the owner found the fast_event_bit = ""0""b, it would not necessarily mean the event had not received a wake-up.  It might be that his process had not blocked in the past, so notification of the event might not have moved from the system-wide Interprocess Transmission Table (ITT) into the owner's Event Channel Table (ECT).  To be sure no event had occurred, the owner could:

    Call ipc_$read_ev_chn to have IPS call its internal copy_itt_messages which moves data from the ITT into the ECT, and also updates fast event channel bits in ipc_data_$fast_channel_events bit array.  The flag returned by ipc_$read_ev_chn would tell the owner definitely whether his channel's fast_event_bit had received a wake-up.

Note that cost of checking and clearing the fast_event_bit is significantly less than the cost of calling ipc_$read_ev_chn.  Depending upon the owner's non-polling activity, he might often find posting of that bit due to other blocking of his process; and thereby avoid the overhead of the ips_$read_ev_chn call.

Therefore, this ticket requests an enhancement to ips_$create_event_channel to return a pointer to the fast_event_bit associated with a new fast event-wait channel as one of its output values.

-----------

The input to ipc_$create_event_channel is a data structure.


{{{
dcl  1 ipc_create_arg_structure      aligned based (ipc_create_arg_structure_ptr),
       2 version                     char (8) unaligned    init(ipc_create_arg_structure_v1),
       2 channel_type                fixed bin,             /* See constants below. */
       2 pad1                        fixed bin,
       2 call_entry                  variable entry (ptr),  /* For event call channels -- who to call. */
       2 call_data_ptr               ptr,                   /* For event call channels -- something to tell them. */
       2 call_priority               fixed bin (17),        /* For event call channels -- who's first? */
       2 pad5                        fixed bin,

     ipc_create_arg_structure_ptr    ptr;
}}}

When creating either regular or fast event-wait channel, only version and channel_type elements are referenced.  The other elements relate to event-call channel creation.

So my suggestion is to make use of the call_data_ptr element when creating a fast event-wait channel by having ipc_$create_event_channel make it point to the fast_event_bit associated with the newly-created channel.

This could be done by adding two structures designed to create event-wait channels.


{{{
dcl  1 ipc_create_wait_event         aligned automatic,
       2 version                     char (8) unaligned    init(ipc_create_arg_structure_v1),
       2 channel_type                fixed bin             init(WAIT_EVENT_CHANNEL_TYPE),
       2 pad1                        fixed bin,
       2 pad2                        variable entry (ptr),
       2 pad3                        ptr,
       2 pad4                        fixed bin,
       2 pad5                        fixed bin;


dcl  1 ipc_create_fast_event         aligned automatic,
       2 version                     char (8) unaligned    init(ipc_create_arg_structure_v1),
       2 channel_type                fixed bin             init(FAST_EVENT_CHANNEL_TYPE),
       2 pad1                        fixed bin,
       2 pad2                        variable entry (ptr),
       2 event_bit_ptr               ptr                   init(null()),
                                                            /* For fast event wait channels                */
                                                            /*  -- output ptr which locates fast_event_bit */
       2 pad4                        fixed bin,
       2 pad5                        fixed bin,

      fast_event_bit                 bit(1) unaligned based (ipc_create_fast_event.event_bit_ptr);

}}}

----------

In the current ipc_create_arg.incl.pl1, the existing ipc_create_arg_structure is declared:


{{{
dcl  1 ipc_create_arg_structure      aligned based (ipc_create_arg_structure_ptr),
       2 version                     char (8) unaligned,    /* From above. */
       2 channel_type                fixed bin,             /* See constants below. */
       2 call_entry                  variable entry (ptr),  /* For event call channels -- who to call. */
       2 call_data_ptr               ptr,                   /* For event call channels -- something to tell them. */
       2 call_priority               fixed bin (17);        /* For event call channels -- who's first? */
}}}

The pad1 and pad5 elements are missing, but the gap between channel_type and call_entry still exists, because the entry data type must be aligned on an even-word boundary; and the pad5 word does exist because the entire structure is aligned on a double-word boundary and is an even number of words in length.  Coding standards require that all space within a public structure be explicitly declared.  So I have added the pad1 and pad5 elements to represent this hidden space in my proposal above."	Gary Dixon
MR12.6e	358	initiate command fails to handle allocation error from hcs_$status_	Administration	MR12.6e	defect	Eric Swenson	new	2025-04-10T13:41:24Z	2025-04-10T13:41:24Z	"An hcs_$status_ call in initiate.pl1 can report an error_table_$notalloc error when it successfully allocates storage in an extensible area.  Symptoms seen are shown in the com_err_ messages below.

{{{
azm:  ec event_channel_table.azmec
initiate: Allocation could not be performed. Unable to get names of >udd>m>gd>w>ect>token
initiate: Allocation could not be performed. Unable to get names of >udd>m>gd>w>ect>bit_string
}}}

In ect.azmec are two calls the initiate commands to ensure the uninstalled tools are found by the exec_com.

{{{
      e initiate &ec_dir>token -force -all                  &-     - Needs new token command/AF used by this exec_com
      e initiate &ec_dir>bit_string -force -all             &-     - Needs new bit_string command/AF used by this exec_com
}}}

Since the error refers to failure to allocate names, I presume that code implementing the -all control argument is causing the problem.


In initiate.pl1, -all turns on all_sw.  Since we are supplying a full pathname to initiate command, the affected code is shown below.

{{{
     if ^got_path then do;
          call expand_pathname_ (arg, dn, en, code);
          if code ^= 0 then do;
               call com_err_ (code, ""initiate"", ""^a"", arg);
               return;
          end;
          got_path = ""1""b;

          if all_sw then do;
              got_refname = ""1""b;
               area_ptr = get_system_free_area_ ();
               on condition (cleanup) call clean_up;
               call hcs_$status_ (dn, en, fixed (chase_sw, 1), 
                         addr (branch_status), area_ptr, code);
               if code ^= 0 then do;
                    call com_err_ (code, ""initiate"",
                         ""Unable to get names of ^a^[>^]^a"", dn, dn ^= "">"", en);
                    return;
               end;
}}}

Notice the”Unable to get names of …” error.  The status code is error_table_$notalloc.  From error_table_.alm:
{{{
ec  notalloc,,
          (Allocation could not be performed.)
}}}

The hcs_$status_ gate entry transfers to status_$status_ with an area_ptr set to the system free area for the user ring of the calling process.   status_.pl1 references the error_table_$notalloc code in only one place:
{{{
          on area call fatal_error (error_table_$noalloc);

          if n_names_to_allocate > 0
          then do;
               if have_s_permission
               then allocate return_names in (return_area) set (return_names_ptr);
               else n_names_to_allocate = 0; /* if no status, we have no name structure to copy */
            end;
          if pathname_length_to_allocate > 0
          then allocate return_pathname in (return_area) set (return_pathname_ptr);

          if return_names_ptr ^= null | return_pathname_ptr ^= null
          then do;
               if (return_names_ptr ^= null & baseno (return_names_ptr) ^= baseno (return_area_ptr))
                | (return_pathname_ptr ^= null
                & baseno (return_pathname_ptr) ^= baseno (return_area_ptr))
               then call fatal_error (error_table_$notalloc);
}}}

This code checks that both return_names_ptr and return_pathname_ptr are non-null and point to an allocation  space in the first extent of the possibly extensible area pointer they were passed.  


{{{
1 branch_status aligned,                /* automatic: hcs_$status uses a pointer */
  2 type bit(2) unaligned,              /* type of entry: link, segment, dir */
  2 number_names bit(16) unaligned,     /* unused by directory_status_ */
  2 names_rel_pointer bit(18) unaligned,/* unused by directory_status_ */
              ...
}}}

If the allocations were done in one of the additional extents of that area, then the allocated names array is returned as an offset value from the base of the return_area_ptr, but the allocated space is in a different segment (extent) than the first extent of that area.

This is a limitation of the data return protocol of hcs_$status.  The only way to avoid the problem is to pass in a non-extensible area which has enough space to hold the names array.  For example, space for 100 segment names requires 3200 characters of storage (or 800 words).   initiate.pl1 could create a 1-page area in its stack frame to hold this storage (rather than using the system free area).

{{{
  dcl  area area (1024);

  call hcs_$status_ (dn, en, fixed (chase_sw,1), addr (branch_status), addr(area), code);
}}}

By using an automatic area, the cleanup condition handler is no longer necessary, because the area is abandoned when the initiate command returns to its caller.  Initialization of the area is performed by the prologue code of the initiate entry point (the same code that pushes the stack frame and initializes other automatic variables).




"	Gary Dixon
MR12.6e	360	ring0_get_ declares Multics status code parameter incorrectly	Administration	MR12.6e	defect	Gary Dixon	accepted	2025-04-19T14:10:11Z	2026-09-01T19:58:08Z	"The ring0_get_ subroutine was written in 1976 before Multics status code arguments were upgraded from a fixed bin aligned integer to a fixed bin(35) aligned encoding of a packed pointer.  ring0_get_'s code parameter has never been upgraded from:
   dcl  code  fixed bin;
to:
   dcl  code  fixed bin(35);

Therefore, display_entrypoint_dcl (depd) and the emacs pl1dcl function return information about its entrypoint calling sequences ending with an incorrect code parameter declaration.

It would be nice if this program's code argument declaration was changed to correct this problem.

Meanwhile, programs declaring these entrypoints can manually change the declaration of the code argument to fixed bin(35).  Storage for both fixed bin aligned and fixed bin(35) aligned values is the same size.  This saves the programmer from having to declare an old_style_code variable to prevent the PL1 compiler from passing the normal code variable (fixed bin(35)) by value rather than by reference.

"	Gary Dixon
MR12.6f	79	configure.ini script shipped with QuickStart has ill effects if run a second time	General	MR12.6f	defect	Eric Swenson	new	2017-08-11T05:46:11Z	2017-08-11T05:46:11Z	configure.ini script is really sad. It needs to get replaced.	Eric Swenson
MR12.6f	156	Multics should fail to boot if 6601 console is not connected to IMU	Hardcore	MR12.6f	defect	Eric Swenson	new	2019-03-30T05:07:57Z	2019-03-30T05:07:57Z	"Multics misbehaves if a 6601 console is defined on an IOM that is not specified as model IMU. It should detect this and prevent booting with this config. 

In this (improper) config, console I/o doesn’t work. Real 6601s were only connected to IMUs
"	Eric Swenson
MR12.6f	188	Write up library maintenance and release-related processes for current Multics work	Documentation	MR12.6f	task	Eric Swenson	new	2019-09-09T16:47:23Z	2019-09-09T16:47:23Z	We should have some documentation in place to describe our Multics library maintenance and the processes for creating new releases. This should include any discussion of pnotices and software licenses, as well as conventions, rules, procedures, tools, etc. used in creating new releases.	Eric Swenson
MR12.6f	80	ALM crashes on syntax error	Tools	MR12.6f	defect	Eric Swenson	new	2017-08-23T03:53:15Z	2023-05-01T17:45:48Z	"pr crash1.alm

                    crash1.alm          08/22/17  1950.2 pst Tue


          dec       foo
foo:      end


r 19:50 0.052 11

alm crash1
ALM 8.14

Error:  illegal_procedure condition by decevl_$|572
(>system_library_standard>bound_alm_)
referencing any_to_any_|1224 (>system_library_1>bound_library_wired_|46576)

r 19:50 0.109 1 level 2
"	charles.unix.pro@…
MR12.6f	88	Document FIRST_TTY_BUF_PAGEX, dn355 DCWs, and IO page tables	Documentation	MR12.6f	defect	Eric Swenson	new	2017-12-23T00:26:58Z	2017-12-23T04:02:37Z	"In debugging ibm 3227 support in the emulator, a lot of time was wasted not understanding what the value of FIRST_TTY_BUF_PAGEX (dn355_data.incl.pl1) represented, what the value of tty_buf.absorig was used for, and how dn355 (and others) use DCWs passed through mailboxes and interpreted not by the IOM but by the FNP.  

It would be good to add some comments in dn355_data.incl.pl1 to document FIRST_TTY_BUF_PAGEX and in tty_buf.cds to document tty_buf.absorig.  In the logic that uses tty_buf.absorig in computing addresses for DCWs passed through mailboxes to the FNP, some documentation would be helpful."	Eric Swenson
MR12.6f	101	When reloading a volume with the same name as a mounted volume rldr_check_pvol_ and rldr_input_ report inappropriate messages	Hardcore	MR12.6f	defect	Eric Swenson	new	2018-01-18T23:18:38Z	2018-01-18T23:18:38Z	"If you boot a system with a d451 RPV, and reload an rpv to a 3381 io drive, you see the following messages:

{{{
1512.9  RCP: Mounted copy of Storage System volume rpv on dska_00a for user I/O.
1512.9  RCP: Mounted IO volume  on dska_00b for user I/O.
1512.9  RCP: Mounted IO volume  on dska_00c for user I/O.
rldr_check_pvol_: Reload may overflow volume
rldr_check_pvol_: Disk label requires 27006 records; Volog label requires 29950 records on pv rpv
rldr_check_pvol_: Reload may overflow vtoc
rldr_check_pvol_: Disk label requires 13505 vtoce; Volog label requires 14974 vtoce on pv rpv

reload_volume: Initialized physical volume rpv does not match online logical image. Do you wish to proceed   M-> [auto-input] yes
}}}

These are not really appropriate messages.  Of course the rpv-to-be-reloaded does not (necessarily) match the rpv that is mounted. But we shouldn't be comparing these two.  

The reload works perfectly fine, but the messages are wrong.  Also, a little later in the reload, you see:

{{{
rldr_input_: Please get the following input volumes
:  V01
reload_volume: Begin reload of volume rpv  at 1512.9
Mounting tape V01 for reading
1512.9  RCP: Attached tapa_01 for Initializer.SysDaemon.z
1512.9  RCP: Note (tapa_01) - V01,sys
1512.9  RCP: Using Reel V01 on tapa_01 for Initializer.SysDaemon.z
Mounted Multics volume ""V01"" (recorded at 800 BPI), on device tapa_01
rldr_input_: Warning - new disk type for rpv
1513.2  RCP: Detached tapa_01 from Initializer.SysDaemon.z
rldr_input_: reloaded from input volume V01 112 records of 28 directories and 3323 records of 251 segments on pv rpv
reload_volume: End reload of volume rpv at 1513.2
reload_volume: Reloaded on volume rpv 112 records of 28 directories and  3323 records of 251 segments and 0 null vtoces
}}}

The message: ""rldr_input_: Warning - new disk type for rpv"" is also not correct.  We don't really care that the foreign system rpv is not of the same disk type as the system on which we're performing the reload.  

These messages should be suppressed when the reload is done to volumes that were init_vol'ed with ""-copy"".  Not sure if that information is around by the time the reload happens though."	Eric Swenson
MR12.6f	107	AG93-05A documentation inaccuracies/omissions	Documentation	MR12.6f	defect	Eric Swenson	new	2018-04-22T17:55:35Z	2023-07-10T23:37:25Z	"Documentation for window_ is inaccurate/incomplete in the following ways:

Page 3-264, GET CHARS OPERATION states:

""This operation returns exactly one character, unechoed, regardless of the size of the caller's buffer.""

This is incorrect since window_io_iox_$get_chars echoes typed characters by default. This section also fails to explain that echoing can be controlled by the undocumented printer_on/printer_off CONTROL OPERATION.

Missing printer_on/printer_off CONTROL OPERATION:

The documentation for window_io_iox_$control fails to describe the printer_on and printer_off commands which enable or disable echoing of typed characters when window_io_iox_$get_chars is used. The documentation for these commands should describe them as needing no extra data to be passed to the control call (i.e., pass null ())."	jcooperddtd@…
MR12.6f	136	Error when exiting FAST subsystem	Unbundled Library	MR12.6f	defect	Eric Swenson	new	2018-08-20T13:31:01Z	2019-05-26T00:02:48Z	"At exit, the FAST subsystem throws an error which might be unexpected at logout.

You can confirm this by logging in via the FAST process overseer (ex:  login user -po >unb>fst_process_overseer_) and logging out:

Error:  finish condition by logout$|623
(>system_library_standard>bound_as_requests_)

The issue does not present itself when executing FAST from your login process. DFAST, the related DTSS simulation, >unb>dfast_process_overseer_ pworks correctly. 

The issue does not affect the functionality of the FAST system."	Trn
MR12.6f	221	display_ttt with -of control argument is supposed to output ttf in formation that cv_ttf will accept	Tools	MR12.6f	defect	Eric Swenson	new	2021-03-08T23:10:19Z	2021-03-08T23:10:19Z	"The display_ttt command supports an -of control argument that writes the TTT to a file in TTF format.  It is supposed to generate a TTF source file that is acceptable to cv_ttf.  

Instead, the resulting TTF cannot be compiled with cv_ttf.  It gets this error message:

{{{
display_ttt -of my_ttf.ttf
r 15:07 4.471 44

cv_ttf my_ttf.ttf

FATAL ERROR 37, SEVERITY 3 IN LINE 2868
Repetition factors nested too deep.
SOURCE:
           initial_string:   (111077) <H ETX ESC ""A11"" ESC ""`;"" (12) <NUL> ESC ""z0"" CR ESC ""z1"" CR ESC ""z2"" CR ESC ""z3"" CR ESC ""z4""
\c CR ESC ""z5"" CR ESC ""z6"" CR ESC ""z7"" CR ESC ""z8"" CR ESC ""z9"" CR ESC ""z:"" CR ESC ""z;"" CR ESC ""z<"" CR ESC ""z="" CR ESC ""z>"" CR ESC ""
\cz?"" CR ESC ""z@"" 177  ESC ""zA"" 177  ESC ""zB"" 177  ESC ""zC"" 177  ESC ""zD"" 177  ESC ""zE"" 177  ESC ""zF"" 177  ESC ""zG"" 177  ESC ""zH"" 1
\c77  ESC ""zI"" 177  ESC ""zJ"" 177  ESC ""zK"" 177  ESC ""zL"" 177  ESC ""zM"" 177  ESC ""zN"" 177  ESC ""zO"" 177  ESC ""zP"" CR ESC ""zQ"" CR ESC
\c ""zR"" CR ESC ""zS"" CR ESC ""zT"" CR ESC ""zU"" CR ESC ""zV"" CR ESC ""zW"" CR ESC ""zX"" CR ESC ""zY"" CR ESC ""zZ"" CR ESC ""z["" CR ESC ""z\"" CR
\cESC ""z]"" CR ESC ""z^"" CR ESC ""z_"" CR ESC ""z`"" 177  ESC ""za"" 177  ESC ""zb"" 177  ESC ""zc"" 177  ESC ""zd"" 177  ESC ""ze"" 177  ESC ""zf""
\c177  ESC ""zg"" 177  ESC ""zh"" 177  ESC ""zi"" 177  ESC ""zj"" 177  ESC ""zk"" 177  ESC ""zl"" 177  ESC ""zm"" 177  ESC ""zn"" 177  ESC ""zo"" 177
\c  ESC ""A10"" RS ESC Y ESC 0 CR ESC 1 (13) <(10) <SP> ESC 1>;
cv_ttf: Translation failed.
r 15:07 12.752 431
}}}
"	john ata
MR12.6f	226	reload_system_release of 12.7LDD_STANDARD produces an error file	Hardcore	MR12.6f	defect	Eric Swenson	new	2021-06-15T02:37:46Z	2021-06-15T22:58:00Z	"When reloading from 12.7LDD_STANDARD tape, a reload error file was created.  The console shows:


{{{
Input tape label:   M-> 12.7LDD_STANDARD

Mounting tape 12.7LDD_STANDARD for reading
1627.7  RCP: Attached tapa_02 for Initializer.SysDaemon.z
1627.7  RCP: Note (tapa_02) - 12.7LDD_STANDARD,sys
CONSOLE: ALERT
1627.7  RCP: Mount Reel 12.7LDD_STANDARD without ring on tapa_02 for Initializer.SysDaemon.z
attachTape selected unit 2
TAPE: unit is read only
Mounted Multics volume ""12.7LDD_STANDARD"" (recorded at 800 BPI), on device tapa_02
Error file attached to file "">reload_dir>reload.06/14/21.1629.ef"".
End of reel encountered.

}}}


The actual .ef file cannot be displayed until system is fully up in ring 4.  I had to force SysAdmin.* access, adjust bit count on the .ef file, to display its contents.



{{{
cwd >reload_dir
r 16:58 0.033 10


ls -dtcm

Segments = 2, Lengths = 26.

06/14/21 16:29  r w    0  reload.06/14/21.1629.ef
04/01/17 21:14        25  !BBBKLLcGDZxdbN.reload.map

Multisegment-files = 2, Lengths = 704.

06/14/21 16:34       365  !BBBKQCGZjnDFJm.reload.map
04/01/17 21:30       339  !BBBKLLcGGZmxpj.reload.map

r 17:10 0.053 0

sa **.ef rw *.SysAdmin
r 17:01 0.034 0

abc reload.06/14/21.1629.ef -ch
r 17:12 0.013 0

pr **.ef

                    reload.06/14/21.1629.ef       06/14/21  1712.4 mst Mon


hcs_$list_dir_fast: Allocation could not be performed. >library_dir_dir>include
backup_load_dir_list: Allocation could not be performed. >library_dir_dir>inclu
\cde
r 17:12 0.030 0

}}}


A quick comparison between GHM >ldd>include and the same directory on the reloaded system shows
segment count and total records used in >ldd>incl on GHM versus my just-upgraded system are identical.

I have no idea what might be causing the Allocation failure.  What is hcs_$list_dir_fast?  

This problem deserves more investigation.

"	Gary Dixon
MR12.6f	129	Add binary table to >doc>info>ascii_table.gi.info	Documentation	MR12.6f	enhancement	Eric Swenson	new	2018-07-10T03:21:45Z	2023-05-01T17:46:28Z	"Update ASCII chart to include the binary representation:

 
           00        01        10        11
00000     NUL       SP        @         `
00001     SOH       !         A         a
00010     STX       ""         B         b
00011     ETX       #         C         c
00100     EOT       $         D         d
00101     ENQ       %         E         e
00110     ACK       &         F         f
00111     BEL       '         G         g
01000     BS        (         H         h
01001     TAB       )         I         i
01010     LF        *         J         j
01011     VT        +         K         k
01100     FF        ,         L         l
01101     CR        -         M         m
01110     SO        .         N         n
01111     SI        /         O         o
10000     DLE       0         P         p
10001     DC1       1         Q         q
10010     DC2       2         R         r
10011     DC3       3         S         s
10100     DC4       4         T         t
10101     NAK       5         U         u
10110     SYN       6         V         v
10111     ETB       7         W         w
11000     CAN       8         X         x
11001     EM        9         Y         y
11010     SUB       :         Z         z
11011     ESC       ;         [         {
11100     FS        <         \         |
11101     GS        =         ]         }
11110     RS        >         ^         ~
11111     US        ?         _         DEL

See http://m.trnsz.com:61800/doc/info/ascii_table.gi.info (if formatting here fails)"	Trn
MR12.6f	131	read_mail (rdm) enhancement for brief header display mode	Unbundled Library	MR12.6f	enhancement	Eric Swenson	new	2018-07-15T03:29:58Z	2018-07-15T03:29:58Z	"rdm would be greatly enhanced with an equivalent of Emacs rmail-header-format brief-formatting-mode.

Modern internet header bloat makes handling intersystem Mail in rdm less than friendly.  

As rdm already support the ""-lghe"" control argument (long header), I propose that only a subset of important headers, ala rmail brief-formatting-mode be the default, and the full header can be displayed only if specifically requested. 

Other alternative implementations are possible and the proposal likely merits further discussion."	Trn
MR12.7	243	Dates with 2-digit year values after 2129 are assumed to be in the 20th century (e.g, 1930).	General	MR12.7	enhancement	Eric Swenson	new	2021-09-15T19:31:44Z	2023-09-05T08:29:46Z	"The Y2K change for interpreting 2-digit year numbers will have problems for years later than 2129.  A date like 30-12-18 would be interpreted as 1930-12-18 according to algorithm used in the current convert_date_to_binary_ code.  It may be appropriate to interpret years before 1960 (the year of early Multics design papers) as being in the 21 century, rather than in the 20th century.

The current code treats all 2-digit years < 30 as being in 21st century (e.g., 2125), and years in range 30 to 99 as being in the 20th century (e.g., 1950).

The following example shows where the breakpoint lies in the current code:


{{{
clock ^yc-^my-^dm 30-10-12
30-10-12
r 11:55 0.059 0 level 2

clock iso_date [clock ^yc-^my-^dm 30-10-12]
1930-10-12
r 11:55 0.377 0 level 2

clock ^yc-^my-^dm 29-10-15
29-09-15
r 11:56 0.054 0 level 2

clock iso_date [clock ^yc-^my-^dm]
2029-09-15
r 11:56 0.345 0 level 2
}}}
 "	Gary Dixon
MR12.7	248	mbuild should handle compiler pl1_macro -target L68 control argument.	Tools	MR12.7	enhancement	Eric Swenson	new	2021-10-06T18:05:39Z	2021-10-06T18:05:39Z	"The mbuild subsystem should accept a build script source statement like:

{{{
  source:   pc.pl1.pmac     REPLACE     compiler: pmac -target L68 -call ""pl1 -ot"";
}}}

which requests compiling macros in the source file for the L68 CPU type; then calling the pl1 compiler to process the result.

Right now, mbuild '''compile''' request fails to accept the -target control argument; and its '''read''' request ignores the -target XXX specification, and improperly handles the -call QUOTED_STRING.  It treats each components as a separate token.  The parsed tokens are:  

   -call
   ""pl1  
   -ot""

Also, the '''compile''' request should be able to insert its optional control args (-list and -table) into the operand of the quoted -call control arg, if either/both of those options are given in the compile line.  

More specifically, that means the request:

''' `compile **.pmac -list -table` '''

should process the source statement above by generating the following command line:

{{{
pl1_macro pc.pl1 -target L68 -call ""pl1 -ot -list -table""
}}}

Right now, either the read or analyze request ignores the -target option in the source line, and the compile request produces the following output:

{{{
mbuild:  comp **.pmac -list -table
mbuild (compile): COMPILE structure not found.  **.pmac

mbuild:
}}}

Eliminating use of the star convention to identify the segment to be compiled still produces errors:

{{{
mbuild:  comp pc.pl1.pmac -list -table

---------- pmac pc.pl1.pmac -call ""pl1 -ot"" -list

List not yet implemented.
pl1_macro  2.0

SEVERITY 2 ERROR ON LINE 6
%target used without use of -target control arg. L68 assumed.
SOURCE:   %if %target (L68) %then
pl1_macro: Errors in macro processing; output segment may be suspect.
mbuild (compile): Compile did not produce an object segment. COMPILE: pc.pl1.pmac

mbuild:  

}}}

pl1_macro does not support -list or -table (unless these are manually inserted into the operand of its -call control argument.  The compile request would have to learn to do that.  And the -target L68 control (from the build script file) was ignored by read, and therefore not present in the command line invoking pl1_macro.
"	Gary Dixon
MR12.7	286	mbuild should detect when segments in install directory match components in archives	Tools	MR12.7	defect	Gary Dixon	assigned	2022-08-03T01:15:12Z	2023-04-30T18:27:36Z	"If, in order to fix a compilation bug, you extract a source program from a source archive, fix the bug, and then reinvoke mbuild, it doesn't notice that there exists a segment (modified in this case) in the install directory that matches a component in the source archive.  The ""compile"" request works fine -- and compiles the standalone segment, but the source archive is not updated.  The bad source (in the archive) is installed.  If you later delete the install directory, the fixes you made are lost.

Recommend that mbuild warn if there exists a standalone segment in the source archive that matches a component in a source (or object) archive."	Eric Swenson
MR12.7	308	"""help ls"" hangs mid output"	General	MR12.7	defect	Eric Swenson	new	2023-07-25T12:20:09Z	2023-07-25T12:20:09Z	"I tried on linux x86_64 and MacOS (Intel) with a fresh download and after I log in as user Repair and change the password, ""help ls"" works until displaying 

-name, -nm
   print names column.

then hangs (Ctrl-C works). Other help output works correctly."	olf@…
MR12.7	292	Add support to help and help_ to use -referencing_dir to locate info segments	Tools	MR12.7	enhancement	Gary Dixon	assigned	2022-10-07T16:18:12Z	2022-10-08T14:19:12Z	"Since the info search path already supports -referencing_dir and this is included in the default search path, it might be nice to add the following feature:  if ""help foo"" is invoked, and foo is a program found in the search rules, but in a non-standard library, and if -referencing_dir is present in the info search paths, then look for a ""foo.info"" segment in the same directory where ""foo"" is found."	Eric Swenson
MR12.8	322	dump_segment -as ELEMENT fails to parse ELEMENT with negative array index	Tools	MR12.8	defect	Eric Swenson	new	2023-10-15T15:07:17Z	2023-10-15T15:07:17Z	"The problem is illustrated by the following dump_segment (ds) command:

{{{
ds 247|17240 -as ect_header.count""(-1)""
017240
dump_segment: Code 18. Parsing structure ect_header.count(-1).
}}}
 
The full ect_header structure is properly displayed, including the count(-1) array element.


{{{
dump_segment 234 -as stack_header.ect_ptr
000000
  ect_ptr = 247|17240   [pd]>!BBBKXGGNBpjnQH.area.linker
r 08:02 0.208 0 level 2

dump_segment 247|17240 -as ect_header
017240
ect_header                    @ 247|17240
  ect_areap = 247|17170   [pd]>!BBBKXGGNBpjnQH.area.linker, ect_area_size = 1044, count (-1) = 0, count (0) = 39, count (1) = 38,
  count (2) = 1, count (3) through count (5) = 0
  entry_list_ptrs (1)         @ 247|17252
    firstp = 247|17416   [pd]>!BBBKXGGNBpjnQH.area.linker, lastp = 247|20442   [pd]>!BBBKXGGNBpjnQH.area.linker
  entry_list_ptrs (2)         @ 247|17256
    firstp = 247|20406   [pd]>!BBBKXGGNBpjnQH.area.linker, lastp = 247|20406   [pd]>!BBBKXGGNBpjnQH.area.linker
  entry_list_ptrs (3)         @ 247|17262
    firstp = null, lastp = null
  entry_list_ptrs (4)         @ 247|17266
    firstp = null, lastp = null
  entry_list_ptrs (5)         @ 247|17272
    firstp = null, lastp = null
  meters                      @ 247|17276
    total_wakeups = 1, total_wait_wakeups = 1, total_call_wakeups = 0, ittes_tossed = 1
  seed = 4
  flags                       @ 247|17303
    mask_call_count = 0
    OFF: call_priority, wakeup_control_points
  ecit_ptr = 247|17314   [pd]>!BBBKXGGNBpjnQH.area.linker, ecit_lth = 64, r_offset = 190230, r_factor = 10766514273,
  last_fast_channel_events = ""000000000000""b3
r 08:03 0.252 0 level 2
}}}

Because dump_segment -as uses display services of the probe command, I suspect probe also has this difficulty.

Because the analyze_multics (azm) request display (d) uses the dump_segment_ display capabilities, I suspect azm display request also has this problem.
"	Gary Dixon
MR12.8	335	PL/I addbitno builtin function generates incorrect code	Standard Library	MR12.8	defect	Eric Swenson	new	2024-03-04T03:01:26Z	2024-03-04T03:01:26Z	"Code generated by the addbitno function fails to load the pointer to be adjusted before adding a bit offset.
The assembler listing for a statement using addbitno is shown below.


{{{
          else P_arg_info.address = addbitno ( P_arg_info.address,
                                               P_arg_info.array_extent.element_offset *
                                                (P_arg_info.element.selected - P_arg_info.array_extent.lbound) );

007737  aa  3 00104 3521 20   epp2      pr3|68,*            P_arg_info.address
007740  aa  3 00114 3361 00   lcq       pr3|76              P_arg_info.selected
007741  aa   000044 7770 00   llr       36
007742  aa   000044 7330 00   lrs       36
007743  aa  3 00107 0331 00   adl       pr3|71              P_arg_info.lbound
007744  aa   000000 5330 00   negl      0
007745  aa  6 00100 7571 00   staq      pr6|64
007746  aa  3 00111 2361 00   ldq       pr3|73              P_arg_info.element_offset
007747  aa  6 00100 3521 00   epp2      pr6|64
007750  aa  0 00671 7001 00   tsx0      pr0|441             mpfx2
007751  aa  2 00000 5035 06   abd       pr2|0,ql
007752  aa  3 00104 2521 00   spri2     pr3|68              P_arg_info.address
}}}

Notice that pr2 gets loaded by the first instruction, but later gets reused by the multiply operation in the second argument to the addbitno function.  It never gets reloaded, so an address associated with the multiple gets stored into the P_arg_info.address value.

An avoidance for this problem is shown below.  The avoidance moves calculation of the bit offset into a separate statement stored in a new variable.  This variable is then used as the bit offset addition in the addbitno builtin.


{{{
     2121   dcl  bit_offset             fixed bin(24);
      ...
          else do;

                                                            STATEMENT 1 ON LINE 2145
               bit_offset =  P_arg_info.array_extent.element_offset *
                            (P_arg_info.element.selected - P_arg_info.array_extent.lbound);

007737  aa  3 00114 3361 00   lcq       pr3|76              P_arg_info.selected
007740  aa   000044 7770 00   llr       36
007741  aa   000044 7330 00   lrs       36
007742  aa  3 00107 0331 00   adl       pr3|71              P_arg_info.lbound
007743  aa   000000 5330 00   negl      0
007744  aa  6 00102 7571 00   staq      pr6|66
007745  aa  3 00111 2361 00   ldq       pr3|73              P_arg_info.element_offset
007746  aa  6 00102 3521 00   epp2      pr6|66
007747  aa  0 00671 7001 00   tsx0      pr0|441             mpfx2
007750  aa  6 00100 7561 00   stq       pr6|64              bit_offset
                                                            STATEMENT 1 ON LINE 2147
               P_arg_info.address = addbitno ( P_arg_info.address, bit_offset );

007751  aa  3 00104 3521 20   epp2      pr3|68,*            P_arg_info.address
007752  aa  2 00000 5035 06   abd       pr2|0,ql
007753  aa  3 00104 2521 00   spri2     pr3|68              P_arg_info.address
                                                            STATEMENT 1 ON LINE 2148
               end;
}}}
"	Gary Dixon
MR12.8	338	The PL1 charno built-in function incorrectly evaluates a multi-element argument	General	MR12.8	defect	Eric Swenson	new	2024-08-16T07:13:32Z	2024-08-16T07:13:32Z	"The following test program demonstrates several problems in handling of any multi-element or complicated argument given to the PL1 charno built-in function.  charno is documented in the pl1.new_features.info segment as follows:

The charno, bitno, wordno, and segno functions:
These builtins extract information from pointers, and are defined as follows:

     C = charno (P);

P must be a scalar pointer value. The result, C, is a real fixed binary of
precision (21, 0), containing the zero origined character address of P [relative to baseptr(P) ].

However, the following test program demonstrates a significant failure in the compiler's handling of the argument to the charno built-in function.  Arguments such as:

   charno( stmt.P )

   charno( stmt.last_tokenP -> token.P )

are mishandled by the compiler in some unknown fashion.


{{{
                    test_charno.pl1     08/15/24  2355.8 pdt Thu


test_charno:
          proc();

  dcl  my_statement           char(42) init( ""positional pos(1) ctl(-name -nm) required;"" )
                              int static options(constant);
  dcl  semi_colon             char(1) defined(my_statement) pos(42);

  dcl 1 auto_stmt             aligned like stmt;
  dcl 1 (token1, token2)      aligned like token;
          
  dcl  (P1, P2)               ptr,
       (n1, n2)               fixed bin(21);

  dcl  ioa_                   entry() options(variable);

  dcl 1 stmt                   aligned based (stmtP),
        2 P                    ptr unal,
        2 L                    fixed bin(18),
        2 first_tokenP         ptr unal,
        2 last_tokenP          ptr unal,
       stmtStr                 char(stmt.L) based (stmt.P),
       stmtP                   ptr;

  dcl 1 token                  aligned based (tokenP),
        2 P                    ptr unal,
        2 L                    fixed bin(21),
       tokenP                  ptr,
       tokenStr                char(token.L) based(token.P);

          tokenP = addr(token1);
          unspec(token) = ""0""b;
          token.P = addr(my_statement);
          token.L = 1;

          stmtP = addr(auto_stmt);
          unspec(stmt) = ""0""b;
          stmt.P = addr(my_statement);
          stmt.L = 1;
          stmt.first_tokenP = tokenP;
          
          tokenP = addr(token2);
          unspec(token) = ""0""b;
          token.P =   addr(semi_colon);
          token.L = length(semi_colon);
          
          stmt.last_tokenP = tokenP;


          stmt.L = charno( stmt.last_tokenP -> token.P )
                 +         stmt.last_tokenP -> token.L
                 - charno( stmt.P );

          call ioa_( ""First, tried to set stmt.L using the statement:
     stmt.L = charno( stmt.last_tokenP -> token.P )
            +         stmt.last_tokenP -> token.L
            - charno( stmt.P );"" );

          call ioa_( ""^/Expect stmt.L to equal:           42 (000000000052)"" );
          call ioa_(   ""^19t Got:  ^11d (^w)"", stmt.L, stmt.L );

/* ---------- */
          
          call ioa_( ""^2/Second, tried to break down clauses in the expression."" );

          call ioa_( "" A:  n1 = charno( stmt.last_tokenP -> token.P );"" );
          n1 = charno( stmt.last_tokenP -> token.P );
          call ioa_( ""^19t Got:  ^11d (^w)"", n1, n1 );

          call ioa_( "" B:  n2 = charno( stmt.P );"" );
          n2 = charno( stmt.P );
          call ioa_( ""^19t Got:  ^11d (^w)"", n2, n2 );
          
          call ioa_( "" stmt.L = n1 + stmt.last_tokenP -> token.L - n2;"" );
          stmt.L = n1 + stmt.last_tokenP -> token.L - n2;
          call ioa_( ""^19t Got:  ^11d (^w)"", stmt.L, stmt.L );        

/* ---------- */

          call ioa_( ""^2/Third, tried to remove pointer indirection from the """"A"""" charno argument."" );

          call ioa_( "" A:  P1 = stmt.last_tokenP -> token.P;
     n1 = charno( P1 );"" );

          P1 = stmt.last_tokenP -> token.P;
          n1 = charno( P1 );
          call ioa_( ""^19t Got:  ^11d (^w)"", n1, n1 );

          call ioa_( "" B:  n2 = charno( stmt.P );"" );
          n2 = charno( stmt.P );
          call ioa_( ""^19t Got:  ^11d (^w)"", n2, n2 );
          
          call ioa_( "" stmt.L = n1 + stmt.last_tokenP -> token.L - n2;"" );
          stmt.L = n1 + stmt.last_tokenP -> token.L - n2;
          call ioa_( ""^19t Got:  ^11d (^w)"", stmt.L, stmt.L );        

/* ---------- */

          call ioa_( ""^2/Fourth, tried to remove structure element from """"B"""" charno argument."" );

          call ioa_( "" A:  P1 = stmt.last_tokenP -> token.P;
     n1 = charno( P1 );"" );

          P1 = stmt.last_tokenP -> token.P;
          n1 = charno( P1 );
          call ioa_( ""^19t Got:  ^11d (^w)"", n1, n1 );

          call ioa_( "" B:  P2 = stmt.P;
     n2 = charno( P2 );"" );

          P2 = stmt.P;
          n2 = charno( P2 );
          call ioa_( ""^19t Got:  ^11d (^w)"", n2, n2 );
          
          call ioa_( "" stmt.L = n1 + stmt.last_tokenP -> token.L - n2;"" );
          stmt.L = n1 + stmt.last_tokenP -> token.L - n2;
          call ioa_( ""^19t Got:  ^11d (^w)"", stmt.L, stmt.L );        

          call ioa_( ""^2/Display of the entire stmtStr now works OK.
 stmtStr: """"^a"""";"", stmtStr );

          call ioa_( ""^2/Thus, the charno built-in function appears to have argument processing problems."" );
          

          end test_charno;
}}}

Results of running this program demonstrate that expected values were obtained only when a single scalar pointer was passed as the argument to charno.  Attempting to pass a scaler pointer element of a containing structure did not work.  


{{{
test_charno
First, tried to set stmt.L using the statement:
     stmt.L = charno( stmt.last_tokenP -> token.P )
            +         stmt.last_tokenP -> token.L
            - charno( stmt.P );

Expect stmt.L to equal:           42 (000000000052)
                   Got:   9663676427 (110000000013)


Second, tried to break down clauses in the expression.
 A:  n1 = charno( stmt.last_tokenP -> token.P );
                   Got:   9741008906 (110447000012)
 B:  n2 = charno( stmt.P );
                   Got:     77332480 (000447000000)
 stmt.L = n1 + stmt.last_tokenP -> token.L - n2;
                   Got:   9663676427 (110000000013)


Third, tried to remove pointer indirection from the ""A"" charno argument.
 A:  P1 = stmt.last_tokenP -> token.P;
     n1 = charno( P1 );
                   Got:           41 (000000000051)
 B:  n2 = charno( stmt.P );
                   Got:     77332480 (000447000000)
 stmt.L = n1 + stmt.last_tokenP -> token.L - n2;
                   Got:    -77332438 (777331000052)


Fourth, tried to remove structure element from ""B"" charno argument.
 A:  P1 = stmt.last_tokenP -> token.P;
     n1 = charno( P1 );
                   Got:           41 (000000000051)
 B:  P2 = stmt.P;
     n2 = charno( P2 );
                   Got:            0 (000000000000)
 stmt.L = n1 + stmt.last_tokenP -> token.L - n2;
                   Got:           42 (000000000052)


Display of the entire stmtStr now works OK.
 stmtStr: ""positional pos(1) ctl(-name -nm) required;"";


Thus, the charno built-in function appears to have argument processing problems.
r 00:10 0.270 0
}}}

"	Gary Dixon
MR12.8	351	Emacs crashes with video invoked when requested Emacs line length exceeds Multics video line length.	General	MR12.8	defect	Eric Swenson	assigned	2025-03-03T21:20:35Z	2025-03-04T16:48:13Z	"1. `stty -ttp vt102`
2. `wdc invoke`
3. `emacs -ll 104 >udd>Ring0>JJohnson>speed>instr_speed.pl1`
4. Hold down Control-N (scrollng down line by line).

Once it scrolls to the line containing the ^L character, Emacs will crash:

{{{
Error:  emacs error by e_pl1_$signal_io_error|14573
(>system_library_unbundled>bound_multics_emacs_)
The request was not within the boundaries of the requesting window. Emacs encou
\cntered an error. Error from window_$<<video system ctl>>.
Give the following command:
file_output emacs_trace_;trace_stack;revert_output
and save the results for programming staff.
}}}

This happens when using Multics video system with a terminal of 80 width, but (likely erroneously) specifying that Emacs should use a width of 104.

I encountered this because I had (unintentionally) set an abbrev for emacs which was invoking it with -ll 104, and I was using the 80x25 vt102 terminal.

This is a very abnormal configuration for me, since I normally use a 132x50 terminal.

Rather than crash, if this is truly a fatal configuration error, Emacs should instead just complain that the requested line length exceeds maximum width width of the currently invoked Multics video session."	Jeffrey H. Johnson <trnsz@…>
MR12.8	354	Volume Retrieved segment had unexpected garbage at bottom of only page	Hardcore	MR12.8	defect	Eric Swenson	new	2025-03-26T22:08:14Z	2025-03-26T22:13:13Z	"On GHM system, I recently retrieved a segment which had accidentally been deleted.

{{{
>udd>Multics>GDixon>w>lr>ssu_request_tables_list.incl.pl1

NOTE:  I have since moved this segment to another directory to preserve its attributes and contents:
  >udd>Multics>GDixon>w>VOL_RETRIEVER_BAD_SEG
}}}

When Volume_Retriever reloaded this 1-page segment, it set the bit count to a whole-word boundary because the volume backup system is dumping based upon VTOCe contents.  It does not have access to the directory entry for the dumped segment (which contains the bit_count attribute).

When I ran the adjust_bit_count command, it adjusted the bit count to near end of the page.  A page has 36864 bits, but the adjusted bit_count was set to 36774 as shown below.

{{{
abc ssu_req*.ip -ch
r 14:16 0.061 1

st -ln ssu_req*.ip

          >udd>Multics>GDixon>w>lr>ssu_request_tables_list.incl.pl1

bit count:          36774
records used:       1
max length:         261120

r 14:20 0.034 11

calc 4096*9
=   36864

r 14:31 0.035 2
}}}

If this strange garbage was introduced when the segment was retrieved, the memory page into which the retrieval record was read should have contained all zero bits.

But I believe the entire volume backup of the 1-page segment dumped its entire record onto simulated tape.  And this entire record was then reloaded.  This means the 1-page segment could have had the unexpected garbage in its on-simulated-disk record, but the garbage was shielded from view by the more restrictive bit count on the segment.

At some point in its life-cycle on Multics, this 1-page segment gained what appears to be data from some other segment.  This would be a significant security violation.  

Note that this particular segment had only been in existence at the above location for about 1 month.  I was modifying an installed include segment.  I believe I read the installed copy of that segment into my emacs editor window, then saved its contents into a new segment (of the same name) in my local directory using the emacs write-file (^X-^W) request.  This segment is installed at:


{{{
lpn ssu_request_tables_list.incl.pl1
>ldd>include>ssu_request_tables_list.incl.pl1

r 15:02 0.267 21
}}}

Garbage (preceded by the last expected comment line in the file) is shown below.

{{{
ds ssu_request_tables_list.incl.pl1 1300 500 -ch
001300 124137124101 102114105123 137114111123 124137126105 T_TABLES_LIST_VE
001304 122123111117 116137061040 146151170145 144040142151 RSION_1 fixed bi
001310 156141162171 040163164141 164151143040 157160164151 nary static opti
001314 157156163040 050143157156 163164141156 164051040151 ons (constant) i
001320 156151164151 141154040050 061051073012 144143154040 nitial (1);.dcl
001324 040122105121 125105123124 137124101102 114105123137  REQUEST_TABLES_
001330 114111123124 137126105122 123111117116 137062040146 LIST_VERSION_2 f
001334 151170145144 040142151156 141162171040 163164141164 ixed binary stat
001340 151143040157 160164151157 156163040050 143157156163 ic options (cons
001344 164141156164 051040151156 151164151141 154040050062 tant) initial (2
001350 051073012012 057052040040 105116104040 117106072011 );../*  END OF:.
001354 163163165137 162145161165 145163164137 164141142154 ssu_request_tabl
001360 145163137154 151163164056 151156143154 056160154061 es_list.incl.pl1
001364 011040040052 040040052040 040052040040 052040040052 .  *  *  *  *  *
001370 040040052040 040052040040 052040040052 040040052040   *  *  *  *  *
001374 040052040040 052040040052 040040052040 040052040040  *  *  *  *  *
001400 052040040052 040040052040 040052040052 057012000000 *  *  *  * */...
001404 172000000000 000000000000 000000000000 000000000000 z...............
001410 544616743610 000000000000 001324001422 000002000010 ................
001414 001034001016 052500000000 000000000000 000000000000 ....*...........
001420 545417574645 000000000000 001412000000 000002000010 ................
001424 002012001016 052500000000 000000000000 000000000000 ....*...........
001430 545417574645 000000000000 001744001606 000007000046 ...............&
001434 545417574104 662664776050 400000000001 001442001442 ...D...(........
001440 001034001016 141000000000 000000000000 000006000016 ....a...........
001444 001432000010 000000000000 151160056163 145162166145 ........ip.serve
001450 162056066056 141143163040 040040040040 040040040040 r.6.acs
001454 040040040040 040040040040 000000000000 545417574104         .......D
001460 662665014561 000000000000 475402655553 031570000000 ................
001464 000000000000 000000000000 000000000000 444000000002 ................
001470 001576001566 001034001016 141000000000 000000000000 ........a.......
001474 000000000000 000000000000 544616743610 000000000000 ................
001500 000000001704 000002000010 000000000240 052500000000 ............*...
001504 000000000000 000000000000 545417574676 000000000000 ................
001510 000000001714 000002000010 000000000000 052500000000 ............*...
001514 000000000000 000000000000 573025701763 000000000000 ................
001520 001344005440 000007000046 573025702010 675412741104 .......&.......D
001524 400000000001 001530001530 001034001016 172000000000 ............z...
001530 000000000000 000006000016 001520000013 003656000000 ................
001534 151160137160 162157164157 143157154056 066040040040 ip_protocol.6
001540 040040040040 040040040040 040040040040 040040040040
001544 000000000000 573025702010 675550320777 000000000000 ................
001550 475402655553 000276000000 000000000000 000000000000 ................
001554 000000000000 333000000002 003540004002 001034001016 ................
001560 172000000000 000000000000 000000000000 000000000000 z...............
001564 544616743610 000000000000 000000001576 000002000010 ................
001570 000000000240 052500000000 000000000000 000000000000 ....*...........
001574 545417574104 000000000000 001566000000 000002000010 ...D............
001600 001034001016 052700000000 000000000000 000000000000 ....*...........
001604 545417574104 000000000000 001432001140 000007000046 ...D.......`...&
001610 545417574130 663000536756 400000000001 001616001616 ...X............
001614 001034001016 141000000000 000000000000 000006000016 ....a...........
001620 001606000006 000430000000 151160056163 145162166145 ........ip.serve
001624 162056061056 141143163040 040040040040 040040040040 r.1.acs
001630 040040040040 040040040040 000000000000 545417574130         .......X
001634 663000711763 000000000000 167552130015 013405000000 ........w.X.....
001640 000000000000 000000000000 000000000000 444000000003 ................
001644 001664005176 001034001016 141000000000 000000000000 ...~....a.......
001650 000000000000 000000000000 544616743610 000000000000 ................
001654 000000005020 000002000010 000000000240 052500000000 ............*...
001660 000000000000 000000000000 545574423440 000000000000 ................
001664 001734000000 000002000010 000266000304 052500000000 ............*...
001670 000000000000 000000000000 545417574130 000000000000 ...........X....
001674 001334000000 000002000010 001034001016 052500000000 ............*...
001700 000000000000 000000000000 545743454152 000000000000 ...........j....
001704 001500000000 000002000010 001034001016 052500000000 ............*...
001710 000000000000 000000000000 545417574676 000000000000 ................
001714 001510000000 000002000010 000000000240 052500000000 ............*...
001720 000000000000 000000000000 573025701763 000000000000 ................
001724 003772001334 000002000010 000000000304 052500000000 ............*...
001730 000000000000 000000000000 545743454152 000000000000 ...........j....
001734 005176001664 000002000010 001034001016 052700000000 .~..........*...
001740 000000000000 000000000000 545417574130 000000000000 ...........X....
001744 001256001432 000007000046 545417574645 662664776050 .......&.......(
001750 400000000001 001754001754 001034001016 141000000000 ............a...
001754 000000000000 000006000016 001744000021 000000000000 ................
001760 164143160056 167145154154 137153156157 167156137160 tcp.well_known_p
001764 157162164163 056141143163 040040040040 040040040040 orts.acs
001770 000000000000 545417574645 662665014565 000000000000 ................
001774 475321320733 027305000000 000000000000 000000000000 ................
r 15:06 0.479 0
}}}



"	Gary Dixon
MR12.8	362	"Y2K problem in gtss ""status"""	General	MR12.8	defect	Eric Swenson	new	2025-05-16T21:15:12Z	2025-09-09T01:04:56Z	"{{{
gtss
GTSS 4JS3 (4.0)
*status


channel 0400 ts0
user status on may 16,1925 at 14:13:09  log-on at 14:13:03
proc time used  0.05 sec., 0 file i/o   char key i/o
list of open files: none

*

}}}

Year is displayed as ""'''''1925'''''"" insted of ""'''''2025'''''"".

I am unsure if this is merely a cosmetic problem or indicative of of deeper Y2K issues in the GCOS TSS simulation."	trnsz@…
MR12.8	311	Misleading error message from exec_com processor	Standard Library	MR12.8	defect	Eric Swenson	new	2023-08-25T02:37:19Z	2023-08-27T19:42:08Z	"The following exec_com contains an error.

&version 2
&if &[or true &[equal A B] &then &print Misleading error message

The letter B should be followed by two close square brackets, not just one. However, the error message produced is
'''Nested control statement keyword ""&then""'''
which seems to be rather misleading since there is only one occurrence of ""&then"" and hence it can't be nested. "	David Rosenberg
MR12.8	314	Some command_processor_ pipes don't work in subsystem request lines.  Others do.	Hardcore	MR12.8	defect	Eric Swenson	new	2023-09-06T18:31:29Z	2025-07-11T17:05:14Z	"Inside an SSU subsystem like analyze_multics (azm), a request line using pipe syntax is supposed to
return the output of an azm request line as results of a pipe-capturing active request string.  Using azm
as an example:



{{{
azm

azm:  sld >dumps>gary_dumps>3
  ERF 3   in directory >dumps>gary_dumps dumped at 08/21/23  1019.4 pdt Mon.
  System-ID MR12.8 Version-ID MR12.8
Proc   0 DBR  17171450 running        on cpu a   Initializer.SysDaemon.z

azm:  d 234 -as stack_header.ect_ptr;
  ect_ptr = 340|16040 >pdd>!zzzzzzzbBBBBBB>!BBBKWznZHhplJH.area.linker|16040


azm:  sbag &1 ||[d 234 -as stack_header.ect_ptr;|]
azm: File does not exist.

azm:  sbag &1 ""  ect_ptr = 340|16040 >pdd>!zzzzzzzbBBBBBB>!BBBKWznZHhplJH.area.linker|16040""
  ect_ptr = 340|16040 >pdd>!zzzzzzzbBBBBBB>!BBBKWznZHhplJH.area.linker|16040

azm:  
}}}

An equivalent set of commands does work at Multics command level.  For example:


{{{
dump_segment 234 -as stack_header.ect_ptr
000000
  ect_ptr = 247|17240   [pd]>!BBBKXCDgBLglMZ.area.linker
r 11:27 0.172 0

string ||[dump_segment 234 -as stack_header.ect_ptr;|]
000000   ect_ptr = 247|17240   [pd]>!BBBKXCDgBLglMZ.area.linker
r 11:28 0.237 2

}}}
"	Gary Dixon
MR12.8	332	(add_)search_rules not properly working	General	MR12.8	defect	Eric Swenson	new	2024-01-22T20:38:11Z	2024-01-22T20:38:11Z	"Using asr on a path and then calling an executable on that path does not work, instead it outputs:
""calc_costs skrewed up. file a trouble report (tr)""
Calling the executable using its full path and then calling it as if it were on the search path works.

To reproduce / example:
On a freshly coldbooted Multics installation (with a test.c file):

! asr >sl3p>c_compiler>e
<READY MESSAGE>
! cc test.c
calc_costs skrewed up. file a trouble report (tr)
! >sl3p>c_compiler>e>cc test.c
<READY MESSAGE>
! cc test.c
<READY MESSAGE>

I don't believe this happened in R12.7"	em@…
MR12.8	374	qedx (qx) does not handle input lines longer than 607 characters	General	MR12.8	defect	Eric Swenson	new	2025-07-07T08:43:34Z	2025-07-07T08:43:34Z	"Attempting to use input lines longer than 607 characters crashes qedx.  (For comparison, when ted has a problem with lines - and the maximum is somewhat longer as well - it just gives a warning and does not crash.)

Example of the problem (using a 608 character string):

{{{

qedx
a
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij

Error:  out_of_bounds at edx_util_$read_ptr|1105
(>system_library_1>bound_qedx_)
referencing 12234|6542
There was an attempt to use an invalid segment number.
r 00:41 0.038 1 level 2

}}}

Using lines of 607 characters or less avoids the issue - but qedx still should't crash."	trnsz@…
MR12.8	388	Multics C documentation does not match implementation for error.h and missing declarations in stdio.h	Administration	MR12.8	defect	Eric Swenson	new	2026-04-24T20:02:33Z	2026-04-24T20:02:33Z	"Two related issues with Multics C:

1) The Multics C documentation says that an `error.h` file is provided that mappings of names to errno numbers, but no `error.h` file is provided.  In fact, these definitions are provided in `errno.h` (as is customary).

2) The Multics C documentation indicates the C implementation should be compatible with SysVr2 C.  In SysVr2 (and old BSD from where it inherited the behavior), the for facility for mapping error numbers to names (as opposed to names to numbers as described in issue 1 above) comes from the stdio package in the standard C library.  The Multics C implementation of the standard C library does include these functions in stdio, however there are no definitions making them easily available to users.

To resolve issue 1:
`add_name >sl3p>C_COMPILER>include>errno.h error.h` to add a new name of `error.h` for `errno.h`.  This corrects the implementation to match the documentation and would not break any existing source code.


To resolve issue 2:
The following additional declarations would need to be added to `>sl3p>C_COMPILER>include>stdio.h`:

`extern char *sys_errlist[];`
`extern int sys_nerr;`

This would also be compatible with existing source code and would better align Multics C with the SysVr2 standard it claims to implement.

These issues are present in all versions of Multics C as distributed with Multics through MR12.8."	johnsonjh.dev@…
MR12.8	312	Clarify that -dupt is an argument to eor, not ear + clarification that the .absout file is not necessarily in the same directory as the .absin file	Documentation	MR12.8	enhancement	Eric Swenson	new	2023-08-27T20:15:41Z	2023-08-28T08:07:55Z	"I misread mention of -dupt (-defer_until_process_termination) in the description of the enter_abs_request command in the enter_abs_request info segment and in the ""Multics Commands and Active Functions"" manual on page 3-297 (which bears the date 11/86 and order number AG92-06A).

I mistakenly thought that it was a control argument to ear. It is actually a control argument to eor. My misreading was the result of my failing to notice a one letter difference.

I'd like to suggest a clarification of the documentation to reduce the likelihood of anyone else making the same error that I made. For one thing, the example 
{{{
eor -dupt [user absout]
}}}
could be changed to 
{{{
enter_output_request -dupt [user absout]
}}}
The point could made more forcefully by adding a note something like ""NOTE: This is an enter_output_request command, not an enter_abs_request command.""

----

There is a separate issue in the same paragraph dealing with the need for the -defer_until_process_termination control argument. It starts with the sentence
  All input and output that occurs in the absentee job is written to the segment STR.absout in the same directory as the absentee segment STR.absin.
I think that isn't true. I think that the ear -output_file control argument can cause the .absout file to be written to a different directory than the directory holding the absin file."	David Rosenberg
MR12.8	320	Cold-booted config deck should include a definition for all CPUs	Install/Upgrade	MR12.8	enhancement	Eric Swenson	assigned	2023-10-05T17:26:39Z	2025-07-27T19:57:28Z	"Update the cold-booted config deck to include at least a definition for all CPUs, but leaving only CPU A (bootload CPU) automatically added.

This will allow the cold-booted system to run well on a single-cpu host, but make it easier to simply start more CPUs with the ""rcf add cpu N"" command."	David Rosenberg
MR12.8	342	Enable HFP (hex floating point) in next Multics release QuickStart configuration.	Administration	MR12.8	enhancement	Eric Swenson	assigned	2024-12-29T16:44:05Z	2025-07-27T19:56:55Z	"The simulator has supported HFP (hexadecimal floating point) option for DPS8M CPUs since simulator R3.0.0 and this functionality has been well tested through the R3.0.1 release cycle - it would be great to enable this feature for users of the default QuickStart distribution.  I see no downsides to enabling this support.

Simply adding `set cpu0 config=hex_mode_installed=1` to the INI file used for booting the MR12.9 QuickStart system should be sufficient."	trnsz@…
MR12.8	331	Possible mistakes in the System Installation Bulletin	Documentation	MR12.8	defect	Eric Swenson	assigned	2024-01-22T12:49:47Z	2025-07-28T17:25:02Z	"In STEP 3 of SECTION 5 (5-6), the example configuration contains the line:
""prph -subsys dska -iom a -chn 13 -nchan 1 -model 3381. -number 16""
Looking at the valid models listed in AM81-04 (7-22) for the prph record, all numbers have a period after the number except for 0 (drive does not exist).
Furthermore, a few lines from this one, there's:
""prph -subsys tapa -iom a -chn 12 -nchan 1 -model 500. -number 16.""
Which has a period after the 16; shouldn't the dska line also contain a period?

In STEP 13 of SECTION 5 (5-17) there's the following statement: ""During this stage you will encountered the error, ""set_max_length: Validation level not in ring bracket. >system_control_1>mcaa.acs"", which occurs if an IMU is configured. Ignore this error message.""
I believe that ""you will encountered the error"" should be replaced with ""you will encounter the error"". (Or ""you may encounter the error"")

Going back to STEP 3 of SECTION 5 (5-6), it is stated that: ""User types in configuration fields as defined in the System Maintenance Procedures, Order Number AM81-03"".
Is there any reason why AM81-03 (Multics 11.0) is referred instead of AM81-04 (Multics 12.0)?"	em@…
MR12.8	348	Simulator startup script enhancements	Simulator Interaction	MR12.8	defect	Eric Swenson	assigned	2025-01-25T10:47:30Z	2025-02-25T00:19:19Z	"1) The simulator script does not explicitly release the console, so you need to hit ESC twice currently.  It would be an improvement to add:

`autoinput \xReady\x`

before the `autoinput \z`"	trnsz@…
MR12.8	382	Info seg privileged/hpset_ring_brackets.info has typo	Documentation	MR12.8	defect	Eric Swenson	new	2025-10-28T14:32:25Z	2025-10-28T14:32:25Z	"The ""Access required"" section reads:

To use this command, a system administrator must have
access to the highyl privileged gate hphcs_.

The word in the second line should obviously be ""highly"".
"	jjm@…
MR12.9	387	finger program should allow specification of network	Networking	MR12.9	defect	Eric Swenson	new	2026-04-22T16:17:18Z	2026-04-22T16:18:30Z	The finger program, when provided an -at control argument and target host, will look up the host in the network service list and determine what network to use (chaos or internet) based on the first entry found in the host table for the host.  If a host is specified as both an internet and chaos host, and the chaosnet software is installed and configured, but the internet software is not, then finger may choose the internet protocols if the internet address appears first for the host.  There is no way to override this with a control argument, such as the -net control argument of other utilities.	Eric Swenson
MR12.9	397	Need a tool to display IPC Event Channels	Tools	MR12.9	enhancement	Gary Dixon	accepted	2026-08-10T13:05:08Z	2026-08-31T16:42:50Z	"It is sometimes necessary to display status information for the IPC event channels in-use by a given process in order to determine why the communication between two Multics processes is not functioning properly.

An Event Channel Table (ECT) is created in each active ring of a user process which invokes ipc_$create_event_channel (or one of the earlier channel creation subroutines) to request creation of a new event wait or event call channel for use in that ring.

A new tool is needed to:
- Display meters describing event channels in use by a given ring of a process.
- Display information about status of each event channel registered in that ring.

Ideally, the new tool would be able to display unhandled events recorded in the table on a particular event channel.  However, this may be difficult to do, since there is no particular format required for the event messages sent through event wait and event call channels.

Providing meters, and showing status of existing event channels would be a good start for such tool.
"	Gary Dixon
MR12.9	398	Install new token command/active function	Tools	MR12.9	enhancement	Gary Dixon	accepted	2026-08-10T18:55:41Z	2026-08-31T16:41:50Z	"token is a new command/active function which captures the output returned by a command (like dump_segment or ring_zero_dump), parses it into tokens, then uses specifications (rules) to select desired information from that output.  The command displays the selected tokens; the active function returns value items (numbers, pointer values, etc) to the caller.

token is designed to be used in an exec_com script to select specific information from a data segment (using dump_segment's structure display interface to select the particular items), and save that data as an exec_com variable for eventual display to the user.  A given data item can be acquired and saved in a single exec_com &set statement.  

For example, the following &set statement dumps the first 1200_o words of the stack_header structure and selects the stack_header.ect_ptr pointer value as the return string from the token active function.  vptr uses that pointer to locate the Event Channel Table for the given ring (whose stack_header is being displayed), and assigns that location to the ectP exec_com variable.  The rules for selecting the return string are tailored to dump_segment structure output strings.  The -dump_segment_as_value (-dsav) control_arg selects those canned rules as -match specifications.


{{{
&set ectP &[vptr ||[token -cmd ""rzd &(stackP) +0 1200 -as stack_header.ect_ptr"" -dsav] -null]
}}}

The calling sequence for the proposed token command/AF is shown below.


{{{
2026-08-10  token

Syntax as a command:
   token -control_args

Syntax as an active function:
  [token -control_args]

Control arguments (input):
 -input TOKEN_STRING,     -command COMMAND_LINE,
   -in TOKEN_STRING         -cmd COMMAND_LINE

Control arguments (specifications):
 -match SPECIFICATION,    -dump_segment_as_value,
   -m SPECIFICATION         -dsav

Control arguments (debugging):
 -mode MODE_STRING, -md MODE_STRING

List of matching specifiers:
 <element_name>           <value>
 <array_index>            <value: if <element_name>>
 <entrypoint_name>        <value: if <element_name> returns ""1""b>
 <skip>                   <value: if <element_name> returns ""0""b>
 <skip: N>                <value: if <entrypoint_name>>

List of mode names:
 args   input, in   specifications, specs, sp   match, mh, m
}}}
"	Gary Dixon
MR12.9	399	analyze_multics (azm) display request should accept -in control arg	Tools	MR12.9	enhancement	Gary Dixon	accepted	2026-08-12T01:03:47Z	2026-08-31T16:40:30Z	"The dump_segment command currently supports display of a region of memory as holding elements of a PL/I structure.  It obtains descriptors for elements of the structure from a source program which declares the structure and is compiled with a symbol table.


{{{
help dump_segment -scn ""structure display""

>doc>info>dump_segment.info   (24 lines follow; 372 lines in info)

2026-06-12  dump_segment, ds

Control arguments (structure display as a command):
   The following control arguments may not be given when dump_segment
   is invoked as an active function.
-as STRUCTURE_NAME
   displays the data as a PL/I structure defined by STRUCTURE_NAME.
   The STRUCTURE_NAME can be a structure defined in one of the system
   include files supported by the analyze_multics display request.
   See >doc>ss>azm>structure_names.info for a list of supported
   include files and structures.  Or the STRUCTURE_NAME can be a PL/I
   structure declared in an object program specified in the -in control
   argument.  See ""Notes for structure display"" below.

-in VIRTUAL_ENTRY
   identifies an object program compiled with the -table control
   argument which declares the STRUCTURE_NAME given with the -as
   control argument.  If -in is not given, then STRUCTURE_NAME must be
   found in one of the segments listed in the structure search list.
}}}

For example:

{{{
dump_segment 234|0 -as stack_header.ect_ptr
000000
  ect_ptr = 247|17240   [pd]>!BBBKbhJCBqLBMM.area.linker
}}}

If dump_segment -as is given without using -in control argument, the object segments named in the structure search paths are searched for the given STRUCTURE_NAME.ELEMENT_NAME.  These objects are compiled with a symbol table (pl1 -table ...) declaring the STRUCTURE_NAME variable's elements.

{{{
psp structure
structure
          >tools>structure_library_1_
          >tools>structure_library_2_
          >tools>structure_library_3_
          >tools>structure_library_4_
          >tools>structure_library_5_
          >tools>structure_library_6_
          >udd>m>gd>lib>gcd_structure_library_1_
}}}

If the -in control argument is also given, it specifies the pathname of another object segment compiled with -table which includes the structure variable declared as STRUCTURE_NAME.

The example below shows the ring_zero_dump (rzd) entrypoint of dump_segment specifying location of a pds object segment using the -in control argument.

{{{
rzd pds -as pds.process_group_id -in [hd]>lib>structures>pds
000000
  , process_group_id = ""GDixon.Multics.a                ""
}}}

The analyze_multics (azm) display (d) request also supports the -as control argument, but only looks for an object segment using the structure search list.  If the desired structure is not declared in one of those object programs, display of the structure (or its elements) cannot be done using the display request.

This ticket requests an enhancement to azm display to support the -in control argument as an additional way to locate descriptors for a structure declaration.
"	Gary Dixon
MR12.9	390	Add C preprocessor defintion identifying the Multics C compiler	Tools	MR12.9	enhancement	Eric Swenson	new	2026-05-10T22:00:54Z	2026-05-10T22:00:54Z	"I propose that we define `__COMPILER_MULTICSC__` automatically, which programs can use to determine that they are being built with the ""Multics C Compiler"".  This is in-line with the KCC C compiler for TOPS-20 defining `__COMPILER_KCC__`, etc.  (Clang does similar, defining `__clang_version__` to the version in use, Vbcc defines `__VBCC__`, etc.)

Currently Multics C automatically defines ""`multics`"" which can be used to identify **the platform**, but nothing for identification of **the specific compiler**.  This would be the equivalent of passing the `-def __COMPILER_MULTICSC__` control argument to `cc`.

Because Multics C is known to be somewhat deficient, it's common to have various Multics C-specifc workarounds in C programs, even those written extremely portably, and guard those workarounds with `#ifdef multics`.

Once we have the future theoretical bug-free non-Multics C-based compiler, whatever it might end up being, it will become important to be able to differentiate between the different compilers at compile-time.  While those compilers will of course identify themselves in a similar fashion, it is still useful to differentiate Multics C.

We have the source code to the `cc` compiler driver (see `>sl3p>cc>s>bound_cc_commands.s.archive>c_compile.pl1`) so making this addition would be trivial, and there would be no effect on any existing C code that does not have knowledge of or check for the definition.

Programs that do wish to use the definition could do so:

`#ifdef multics`
`      /* Multics OS code */`
`# ifdef __COMPILER_MULTICSC__`
`      /* Multics C Compiler specific code */`
`# else`
`      /* Other Multics compilers */`
`# endif`
`#else`
`      /* non-Multics OS code */`
`#endif`

A real-life example of a program that would benefit is http://gitlab.com/dps8m/crc - there are 12 checks for the `multics` definition and of those 12, only **one** is really checking for ""Multics, the operating system"".  The other 11 uses are actually specific to ""Multics C, the compiler""."	johnsonjh.dev@…
	127	Error:  out_of_bounds at e_lap_|424 (>system_library_unbundled>bound_multics_emacs_)	Unbundled Library		defect	Eric Swenson	new	2018-07-07T13:29:52Z	2022-09-04T04:33:46Z	"Error:  out_of_bounds at e_lap_|424
(>system_library_unbundled>bound_multics_emacs_)
referencing lisp.lists.!BBBKMQmMgXXwzW|776000 (in process dir)
Attempt to access beyond end of segment

Error:  out_of_bounds at e_lap_|424
(>system_library_unbundled>bound_multics_emacs_)
referencing lisp.lists.!BBBKMQmMgXXwzW|776000 (in process dir)
Attempt to access beyond end of segment.

r Trn.SysEng:>user_dir_dir>SysEng>Trn  09:23 07/07/18 0.171 1 level 2,16
probe
Condition out_of_bounds raised at Block at lisp|34163|35014 (level 9).
sk
 15          command_processor_
 14          abbrev_processor
 13          release_stack
 12          unclaimed_signal
 11          wall
 10          any_other.2
  9          Block at lisp|34163                           out_of_bounds
  8          lisp
  7          >unb>bound_multics_emacs_ (alm)
  6          emacs
  5          emacs
  4          command_processor_
  3          abbrev_processor
  2          listen_
  1          initialize_process_
    

Emacs crash when using PgUp/PgDn"	Trn
	152	Scavenger not deleting orphan entries.	Hardcore		defect	Eric Swenson	new	2019-03-16T20:52:19Z	2019-03-17T19:17:50Z	"My system has been salvaged and scavenged, but still contains VTOC entries that are orphans (not reachable from "">"")


display_vtoce rpv 3

VTOCE ""process_dir_dir"" (Directory), vtocx 3 on pvtx 1 (rpv)

UID: 505737623552, msl: 205, csl:   0, records:   0
     Quota received (S D)    (131071 131071)
     Time-record product (D)  1.5e-5 page-seconds
          updated at 2017-10-12 10:38:10.063360 pst.
Created    2017-10-12 10:38:01.805824 pst
Never dumped
Used       2017-10-12 10:38:01.805824 pst
Modified   2017-10-12 10:38:01.805824 pst

ON:
OFF:       deciduous per_process nqsw master_dir nid ncd dnzp damaged
           synchronized fm_damaged fm_checksum_valid

Access Class:  system_low

vtoc_pathname rpv 3
vtoc_pathname: Entry not found. Cannot completely convert uid path
Pvtx 1 vtocx 3 = >-NOT-LISTED-


  



"	canthony
	157	Specify a config deck with a model 6601 console attached to a non-IMU IOM causes BCE to lockup	Hardcore		defect	Eric Swenson	new	2019-03-30T05:08:50Z	2019-03-30T05:08:50Z	"If ocdcm_.pl1 sees that the operators console is a model 6601, it assumes that the IOM model is IMU and becomes incapable of accepting console input.

The config deck code that parses the opc model number should verify that the IOM that a 6601 console is attached to is a IMU model.

This situation would not arise in actual hardware as the 6601 would not work with an IOM; however operator error in editing the config deck could cause this situation, and it leaves the disk unbootable.
"	canthony
	198	MRDS retrieve display is ill-formatted	Tools		defect	Eric Swenson	new	2020-01-29T03:52:00Z	2025-02-08T19:05:33Z	"[http://ringzero.wikidot.com/wiki:cac-2020-01-28]

Observed by Kazuhisa Shimizu  


{{{
cd db
cwd db
edm
domain:      char_12    char(12),
             char_5     char(5);

attribute:   name       char_12,
             emp_num    char_5,
             comp       char_5;

relation:    Employee (name  emp_num* comp),
             Comp_mgr (comp* emp_num);
.
w foo.cmdb
q
create_mrds_db foo Pers_Info -list
edm
dom: a bit; /* simplest possible database */
rel: b(a*);
.
w x.cmdb
q
cmdb x small -list
create_mrds_dm_include Pers_Info -based
mrds_call open Pers_Info eu
mrds_call store 1 Employee name1 123 comp1
mrds_call retrieve 6 1 ""-range (e Employee) -select e"" -all
}}}



{{{
Values are:

\000\000\000\000r_dir_dir>SysAdmin>Repair>db>Pers_Info.db
\c
\c                        exclusive_update    \400\000\000\000\000\000\000\000\
\c000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0
\c00\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
\c0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\c\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
\c0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\c000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0
\c00\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
\c0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\c000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0
\c00\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
\c0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\c000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0
\c00\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
\c0\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
\c0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\c000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0
\c00\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
\c0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\c000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0
\c00\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
\c0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
\c000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0
\c00\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00
\c0\000\000\000\000\000
name1
123
comp1

(END)

}}}


The ""\000"" seem to be in error.

"	charles.unix.pro@…
	206	"plio2 fails to initialze fsb.iocb_p for ""get string"" construct."	Hardcore		defect	Eric Swenson	new	2020-04-17T01:30:10Z	2020-04-17T01:30:10Z	"A pl1 program containing a line like:

{{{
    get string (translate (dottedaddr, "","", ""."")) list (fields);
}}}

was observed to work correctly but sometimes crash with a command fault in the plio2_ library.

It was hypothesised that the random nature of the crashes pointed to an unitiailized stack variable. A version of the program that would fill the stack was fixed values was generated, experimentation showed that the plio2_ library was indeed using an uninitialized operand for a LPRP instruction, and if the two high bits in the uninitailzed operand were set, a command fault would occur (as per the LPRP instruction specification). 

It was observed that if the instruction did not fault, the plio2 library would return the correct result; it seemed somewhat odd that an accessing an unitiialized variable would return correct results.

Investigation of the plio2_ source revealed the line:

{{{
    iocbp = ps.fsbp -> fsb.iocb_p;
}}}

The code was making a local copy of the variable, but not using it.

The variable in question is a pointer to an iocb block for the file being operated on. For the case of ""get string"", there is no actual file; the fsb buffer pointer and length are set to the string being read from, and as the buffer is already full, iox is never invoked. Thus the local copy of iocb_p is never dereferenced, and the plio2 code works for get string.

The plio2 code that sets up the fsb for ""get string"" operations was located and code to initialize the iocb was added. This resulted in code using ""get string"" to run without falling prey to random command faults.

{{{
cpa <plio2_get_util_.pl1 plio2_get_util_.pl1

Inserted in B:
B494                          fsb.iocb_p=null;
Preceding:
A494
A495                          if ps.varying_string then i=addrel(bptr,-1)->base
\cd_int;

Comparison finished: 1 difference, 1 line.
}}}
"	charles.unix.pro@…
	212	>ldd>xref>total.crossref contains program names including bogus ARCHIVE:: prefix	Documentation		defect	Eric Swenson	new	2020-08-28T01:50:22Z	2020-08-28T01:50:22Z	"Many (but not all) of the programs in bound_mbuild_ are listed in the peruse_crossref data file (>ldd>xref>total.crossref) preceded by a bogus source archive name.  For example:

pcref help_$init
References to help_$init:  (bound_info_rtns_ in STANDARD)
    help.pl1, help_rql_.pl1, **mbuild_help_.s::mbuild_help_.pl1**,
    probe_info_requests_.pl1, tedhelp_.pl1, tutorial.pl1,
    xforum_help_.pl1, xmail_display_help_.pl1

The extent of this problem is shown in the output of the following command:

print >ldd>xref>total.crossref -match ::

Try that command to see the extent of this problem.  You will see that many (but not all) of the mbuild*.pl1 source files listed in this output have this archive component name structure.  It does not seem to affect other PL/I programs listed in the cross reference data.

Cause of this problem is unknown."	Gary Dixon
	222	save_dir_info mishandles names for branches saved in the .dir_info file	Tools		defect	Eric Swenson	new	2021-05-03T16:33:30Z	2021-05-03T16:33:30Z	"The save_dir_info command (tool) has problems saving names of branches in a directory.  The name count is mis-handled.

For example, in the sseg internal procedure:


{{{
sseg:     proc;

               ec = 0;
               xxp = addr (seg_rec.brstat);
               call hcs_$status_long (dirname, en, 0, xxp, null, ec);
               if ec ^= 0 then return;
}}}

But later in that internal procedure, the data returned by hcs_$status_long is referenced using point '''p''' instead of pointer '''xxp'''.

{{{
               seg_rec.n_names = fixed (p -> branches.nname, 16);
               tp = addr (seg_rec.names);
               do j = 1 to seg_rec.n_names;
                    tp -> names (j) = nptr -> names (j+k-1);
                    end;
               next_xp = addr (seg_rec.end_seg_rec);
               seg_rec.fnext = rel (next_xp);
               oldxp = xp;
               xp = next_xp;

          end sseg;
}}}

Similar problems occur in internal procedures sdir and slink.

This is an internal administrative tool which is seldom used (after the new storage system code gained stability).  So it's not surprising these bugs have not been noticed.

USERS of this tool should beware.

Perhaps this tool (though documented in MPM Commands and in help files) should be moved to the obsolete library?
"	Gary Dixon
	244	What?????	Answering Service		defect	Eric Swenson	new	2021-09-19T17:08:02Z	2021-09-19T17:08:02Z	"Found in init_sst.pl1

```
      355                if (scs$controller_data (i).online | scs$controller_data (i).offline) & base = 0
      356                then begin;                                  /* we found our bootload controller */
```

How can you be running at all if the low memory controller is offline?

This is equivalent to the ""Branch If Power Off"" instruction."	canthony
	246	"exercise_disk lacks test size control and ""progress bar"""	Answering Service		defect	Eric Swenson	new	2021-09-29T19:38:46Z	2021-09-29T19:38:46Z	"exercise_disk's random test takes six and a half hours to run; it has no progress indication, nor a method for doing a shorter test.

Add a ""-loops"" parameter to limit the size of the test.

Add a ""progress bar"" during the test so as to allow an estimated time to completion.

{{{
[pwd]>exercise_disk d501 cac -loops 10000

exercise_disk: Device type is d501 pack serial no. is cac
exercise_disk: exercise_disk will destroy all data on this pack !

exercise_disk: Do You Wish To Continue?   yes
exercise_disk: Requesting mount of volume cac.

exercise_disk: Begin random test on dskb_01 (d501) @  1121.1
0%.........10%.........20%.........30%.........40%.........50%.........60%.....
\c....70%.........80%.........90%.........100%

exercise_disk: Testing Completed for dskb_01 (d501).
Test Summary:
Number of Sectors Written           5000
Number of Sectors Read              5000
}}}

(Strictly speaking, ""-loops"" is a misnomer here; it actually sets the number of reads and writes, of which there are four for every loop.)
"	canthony
	275	Transient failure	Administration		defect	Eric Swenson	new	2021-12-31T05:17:30Z	2021-12-31T05:17:30Z	"{{{
eor -pch -raw fnp.6670.pol.32.h3
enter_output_request: Entry not found.
Entry will not be submitted
(>user_dir_dir>SysAdmin>Repair>5~fnp.6670.pol.32.h3).
0 requests in punch queue 3.
r 21:03 0.157 3

ls fnp.6670.pol.32.h3

Segments = 1, Lengths = 3.

r w    3  fnp.6670.pol.32.h3

r 21:13 0.067 0

eor -pch -raw fnp.6670.pol.32.h3
1 request submitted; 0 already in punch queue 3.
r 21:14 0.084 0
}}}"	canthony
	279	PL/I generates incorrect code for divide operation specifying truncate or floor of quotient	Administration		defect	Eric Swenson	new	2022-02-20T22:43:36Z	2022-02-20T23:39:56Z	"I am trying to implement an algorithm that wants the integer part of a division result, using float dec(59) data variables for dividend, divisor and quotient.  The PL/I compiler generates code that ALWAYS rounds up the quotient, no matter what builtin functions surround the divide operation.


{{{
bad_divide:
          proc();

  dcl (dividend, divisor, product, quotient, quotient_t, quotient_f, quotient_d) float dec(59);
  dcl (divide, floor, trunc) builtin;
  dcl  ioa_ entry() options(variable);

          divisor = 8.;

          dividend = 8.0779356694631608874161005084957309918536338955163955688476e+058;
          quotient =  dividend / divisor;
          product = divisor * quotient;
          if  product > dividend  then
               call ioa_( ""quotient of divide was rounded up."");

          dividend = 8.0779356694631608874161005084957309918536338955163955688476e+058;
          quotient_t =  trunc( dividend / divisor );
          product = divisor * quotient_t;
          if  product > dividend  then
               call ioa_( ""quotient using trunc was rounded up."");

          dividend = 8.0779356694631608874161005084957309918536338955163955688476e+058;
          quotient_f =  floor( dividend / divisor );
          product = divisor * quotient_f;
          if  product > dividend  then
               call ioa_( ""quotient using floor was rounded up."");

          dividend = 8.0779356694631608874161005084957309918536338955163955688476e+058;
          quotient_d = divide( dividend, divisor, 59 );
          product = divisor * quotient_d;
          if  product > dividend  then
               call ioa_( ""quotient using divide was rounded up."");

          end bad_divide;
}}}

Results from the bad_divide program prove that the quotient is being rounded up, because the divisor * quotient value is greater than the dividend.


{{{
bad_divide
quotient of divide was rounded up.
quotient using trunc was rounded up.
quotient using floor was rounded up.
quotient using divide was rounded up.
}}}


In each case, the PL/I compiler generates code which does the divide operation, and is followed by an MVN to move the temporary result WITH ROUNDING to the quotient variable.  It then calls whatever built-in function was specified to process this rounded-up result.  

Code for the simplest division (without a surrounding built-in function) is shown below.


{{{
                                                            STATEMENT 1 ON LINE 11
          quotient =  dividend / divisor;

000104  aa  100 100 227 500   dv3d      (pr),(pr),(pr)
000105  aa  6 00120 00 0075   desc9fl   pr6|80,61           divisor
000106  aa  6 00100 00 0075   desc9fl   pr6|64,61           dividend
000107  aa  6 00260 00 0077   desc9fl   pr6|176,63
000110  aa  000 300 300 500   mvn       (pr),(pr),round
000111  aa  6 00260 00 0077   desc9fl   pr6|176,63
000112  aa  6 00160 00 0075   desc9fl   pr6|112,61          quotient
}}}

Use of eis_tester shows that the dv3d instruction is generating the expected quotient with two fractional places added to the end to accommodate possible rounding.  But the compiler ALWAYS adds a mvn instruction with ,round specified instead of conditionally doing the rounding unless suppressed by use of a trunc or floor built-in function.

The following eis_tester script shows the dv3d instruction and its result.


{{{
                    bad_divide_et_script          02/20/22  1431.5 pst Sun


inst      dv3d      -nt ""divide using 3 arguments""
          -mf1      ar
          -mf2      ar
          -mf3      ar;

desc 1    -sd f     -nn 61;   /* float dec(59) divisor  */
desc 2    -sd f     -nn 61;   /* float dec(59) dividend */
desc 3    -sd f     -nn 63;   /* float dec(61) quotient */

data 1    ""+"" (58) ""0"" ""8"" 000;         /* divisor  = 8.0 */
data 2    ""+80779356694631608874161005084957309918536338955163955688476"" 000;
                                        /* dividend = 8.0779356694631608874161005084957309918536338955163955688476e+058 */
data 3    ""+10097419586828951109270125635619663739817042369395494461060"" 000;
                                        /* quotient = 1.0097419586828951109270125635619663739817042369395494461060e+058 */
}}}


Results of this script are shown below:


{{{
eis_tester bad_divide_et_script -long

ET
TEST   1 (dv3d)

Test Description:  divide using 3 arguments

Eis instruction:    ( 354|4000 )   Ind  Desc.
    - - - -- - - -
     100100227500
     100010000075
     200020000075
     300030000077

Pointer Registers:  ( 354|20 )
     pr0 - pr3    77777|1  361|1770  362|1760  363|1750
     pr4 - pr7    77777|1  77777|1  77777|1  77777|1

Test Indicators:    ( 354|111 )
     000000000200

This test will take  0  page faults.

data field 1        ( 361|2000 )
     053060060060  060060060060  060060060060  060060060060
     060060060060  060060060060  060060060060  060060060060
     Previous line repeated  1  time.
     060060060060  060060060060  060060060070  000

data field 2        ( 362|2000 )
     053070060067  067071063065  066066071064  066063061066
     060070070067  064061066061  060060065060  070064071065
     067063060071  071061070065  063066063063  070071065065
     061066063071  065065066070  070064067066  000

data field 3        ( 363|2000 )
     Result data field initialized to all zero bits.

test  data          ( 354|23776 )
     xxxxxxxxxxxx  xxxxxxxxxxxx  053061060060  071067064061
     071065070066  070062070071  065061061060  071062067060
     061062065066  063065066061  071066066063  067063071070
     061067060064  062063066071  063071065064  071064064066
     061060066060  000xxxxxxxxx  xxxxxxxxxxxx  xxx

Data resulting from test ( 1 - dv3d ) is incorrect.

result data         ( 363|1776 )
     xxxxxxxxxxxx  xxxxxxxxxxxx  053061060060  071067064061
     071065070066  070062070071  065061061060  071062067060
     061062065066  063065066061  071066066063  067063071070
     061067060064  062063066071  063071065064  071064064066
     061060065071  065060376xxx  xxxxxxxxxxxx  xxx

*** TEST NOTES: divide using 3 arguments ***
}}}

Note that the result data represents the value:


{{{
+1009741958682895110927012563561966373981704236939549446105950e-02
}}}

If the trunc built-in was permitted to remove the fractional digits before rounding, this correct integer value would be obtained:

{{{
+10097419586828951109270125635619663739817042369395494461059
}}}


"	Gary Dixon
	285	input_history (ih) improperly handles input lines longer than the screen width	General		defect	Eric Swenson	new	2022-07-25T18:26:22Z	2022-07-25T18:26:22Z	"With video system enabled and input_history command attached (as shown in pat output below)...

{{{
pat
user_terminal_      tc_io_ -login_channel
          stream_input_output
error_output        syn_ user_i/o -inh close get_line get_chars
user_output         syn_ user_i/o -inh close get_line get_chars
user_input          syn_ user_i/o -inh close put_chars
user_i/o
     window_io_ user_terminal_ -first_line 1 -n_lines 77 -first_column 1 -n_columns 131
          stream_input_output Video
}}}

the terminal setup is as follows:


{{{
stty -all
Type: VT102_132C_78L
Modes: more_mode=scroll,more,ll=131,pl=77,^vertsp,can,erkl,esc,^rawo,^red,^ctl_char,^edited
Erase: #,  Kill: @
Frame_begin: \000, Frame_end: \000
Delays: vert_nl 0, horz_nl  0.500, const_tab 0, var_tab  0.000, backspace 0, vt_ff 0
output suspend: \023; output resume: \021
}}}

When operating in this environment, a typed input line longer that the screen width is split into two input lines, as shown by the following command and its output.


{{{
string ...5....1 ...5....2 ...5....3 ...5....4 ...5....5 ...5....6 ...5....7 ...5....8 ...5....9 ...5....0 ...5....1 ...5....2 ...5
\c....3 ...5....4
...5....1 ...5....2 ...5....3 ...5....4 ...5....5 ...5....6 ...5....7 ...5....8 ...5....9 ...5....0 ...5....1 ...5....2 .
r 11:11 0.136 0

Segment 5....3 not found.
r 11:11 0.073 0
}}}

In the exact same video environment but with input_history detached, the long command input line is handled properly:


{{{
ih detach
r 11:12 0.053 0

string ...5....1 ...5....2 ...5....3 ...5....4 ...5....5 ...5....6 ...5....7 ...5....8 ...5....9 ...5....0 ...5....1 ...5....2 ...5
\c....3 ...5....4
...5....1 ...5....2 ...5....3 ...5....4 ...5....5 ...5....6 ...5....7 ...5....8 ...5....9 ...5....0 ...5....1 ...5....2 ...5....3 .
\c..5....4
r 11:12 0.139 0
}}}

"	Gary Dixon
	306	Multi-cpu configs don't properly update ASTE for prds on non-boot CPUs	Hardcore		defect	Eric Swenson	new	2023-05-01T17:02:39Z	2023-05-01T17:04:08Z	"On GHM, I was researching length of prds (per-processor) segments.  The config deck shows 2 cpus running.

{{{
pcd cpu

cpu  a  7  on  dps8  70.  8.
cpu  b  6  on  dps8  70.  8.
cpu  c  5  off  dps8  70.  8.
cpu  d  4  off  dps8  70.  8.
cpu  e  3  off  dps8  70.  8.
cpu  f  2  off  dps8  70.  8.

r 09:53 0.083 3
}}}

But lengths reported for these prds files show a positive length only for the bootload CPU A.


{{{
ls >sl1>*.prds

Segments = 6, Lengths = 9.

       9  cpu_A.prds
       0  cpu_B.prds
       0  cpu_C.prds
       0  cpu_D.prds
       0  cpu_E.prds
       0  cpu_F.prds

r 09:51 0.152 4

}}}

Does this mean that when 2nd thru nth CPU is added, the dynamic CPU adding code does not properly update the ASTE for these prds file to reflect length of these segments (whose pages must be wired in memory)?

I have not investigated this bug, but only entered it to record this anomaly. 

I was investigating bug #170 when I discovered this anomaly.
"	Gary Dixon
	355	Problem in card reader when reading absentee job	Administration		defect	Eric Swenson	new	2025-03-27T10:40:02Z	2025-03-27T10:40:02Z	"When reading a card deck in via the reader, in certain cases it appears that an extraneous newline is being received by Multics. I discovered this when I was adding to my absentee job for assembling the FPGA T&Ds.

The symptom: when I submit the absentee deck, at character position 836 it appears a newline is inserted somewhere in the path. This newline does not exist in the input deck but appears in the absentee output.

Why it might be Multics: at first I suspected the simulator, however, I used the same mechanism to send the MAP355 source code and it does not get an extraneous newline inserted at the character position (or any other). I verified this by submitting the source code to Multics and punching out a deck from the source and performing a comparison. There were no differences in the two files (except that the punched deck was space padded out to 80 characters due to the way cards are formatted).

This is an extract from the absentee output (I added the line numbers at the beginning of the lines for reference):

{{{
01: coremif tand
02: r 14:54 1.599 30
03: 
04: eor tand.list
05: 1 request submitted; 0 already in printer queue 3.
06: r 14:54 0.090 7
07: 
08: -pr -q 1
09: Segment -pr not found.
10: r 14:54 0.008 0
11: 
12: eor tand.mif -punch -q 1
13: 1 request submitted; 0 already in punch queue 1.
14: r 14:54 0.016 0
15: 
16: logout
}}}

The ""eor"" command on line 4 was supposed to have ""-pr -q 1"" on it (and does in the source deck). Instead the extraneous newline was inserted and line 04 was split into line 08.

If I insert a bunch of newlines in the input file so the extraneous one is inserted in a benign place, it works fine.

I have replicated this on the Quick Start system. 
"	dean@…
	263	Proposed Printer Plan.	Answering Service		enhancement	Eric Swenson	new	2021-12-01T02:26:23Z	2021-12-01T02:26:23Z	"The simulator's handling of spooled print jobs is incomplete and fragile (see dps8m ticket #153).

The base problem is that the simulator has no way of knowing what Multics is doing with the printer -- it does not know when a new job starts; it does not know the job and user names, it does not know when the job ends.

Currently it monitors the printer output and applies simple pattern recognition to try to track what is going on; this is feeble and fragile.

If instead we added some new device commands to the printer ""hardware':

   1. Start of new job; it passes an i/o buffer holding the job and user name. The simulator will open a new prt file with the job and user name. The head sheet data, if any, follows this command.

   2. Start of job body: this command indicates that the head sheet is finished and the actual job is to be printed next.

   3. End of job body; this command marks the end of the job body and the start of the tail sheet, if any

   4. End of job. The simulator closes the prt file.

The first one is the hardest to implement on the Multics side; the job and user name string was to be wired down and sent as i/o data. but similar code exists for VFC and Print Image data, so it should be easy to copy the pertinent bits.

Either a new printer type is added and the printer daemon is fixed to send the new commands to that printer type, or the printer daemon sends the new commands to all of the printer types.

The second option violates the backward compatibility goals, but a global enable switch should allay that concern.
"	canthony
	295	Add early bootload warning if Calendar Clock set beyond September 17, 2043	Hardcore		enhancement	Eric Swenson	new	2022-11-30T20:29:03Z	2022-11-30T20:29:03Z	"The web page
   [https://multics-wiki.swenson.org/index.php/Design_Limitations:_How_Long_can_Multics_Run] 
describes a Multics operating system design limitation that will prevent the file system from working as designed after September 17, 2043.

I suggest that Multics collection 1 code be enhanced to check the calendar clock setting against this limiting data, and warn the user against continuing the bootload because of probable corruption of file system integrity.  

Perhaps this check would be added near the existing check that the calendar clock setting does not indicate a date/time prior to time the Root PV was last shutdown.  This existing check protects against a calendar clock that lost power (was reset to 0) or otherwise lost significant time while the system what shutdown."	Gary Dixon
	363	Add operator support for GCOS Daemon	Administration		enhancement	Eric Swenson	new	2025-05-17T16:07:39Z	2025-05-17T16:07:39Z	"Now that the GCOS Daemon is working, it would be helpful to have operator support from the console in starting and maintaining it.

For example, ""x io"" and ""x io1"" prepare the printers, punches, etc. for use. It would be nice to have a ""x gcos"" that would login the GCOS daemon.

In a similar fashion, ""x read_cards"" starts a read on the card reader, ""x gcos_read_cards"" could attach and start the GCOS Daemon card reading."	anonymous
	121	Newly created root disks need salvaging.	Install/Upgrade		defect	Eric Swenson	new	2018-06-10T02:19:35Z	2018-06-10T02:19:35Z	"Doing ""boot star rvls"" on a newly built root disk results in many ""04  Corrected master directory UID in header"" messages in the SALV OUTPUT report. (Discussions with Olin Sibert about the messages indicate that this is a minor Multics issue related to the order of events in the cold boot rather then an emulator or cold boot process error).

Adding a salvage run at the end of the cold boot process would clean up the distributed disk image."	anonymous
	133	"Unitialized variable ""TINY"" in gdemos>globe.pl1"	Unbundled Library		defect	Eric Swenson	new	2018-08-11T22:54:50Z	2022-09-04T04:37:41Z	The variable TINY is declared and used, but is not initialized in globe.pl1 in the gdemos collection. 	canthony
	138	Padding amount incorrect in mcs_echo_neg.incl.pl1	Include Files		defect	Eric Swenson	new	2018-08-25T16:56:14Z	2018-08-25T16:56:14Z	"mcs_echo_neg.incl.pl1 contains the declaration of echo_neg_data:

     dcl  1 echo_neg_data          based (echo_neg_datap) aligned,
                                                            /* Echo negotiation data */
            2 version              fixed bin,
            2 break                (0:255) bit (1) unaligned,
                                                            /* Break table, 1 = break */
            2 pad                  bit (7) unaligned,
            2 rubout_trigger_chars (2) unaligned,           /* Characters that cause rubout action */
              3 char               char (1) unaligned,
            2 rubout_sequence_length
                                   fixed bin (4) unsigned unaligned,
                                                            /* Length of rubout sequence, output */
            2 rubout_pad_count     fixed bin (4) unsigned unaligned,
                                                            /* Count of pads needed */
            2 buffer_rubouts       bit (1) unaligned,       /* 1 = put rubouts and rubbed out in buffer */
            2 rubout_sequence      char (12) unaligned;     /* Actual rubout sequence */


'version' is at offset 0.

'break' starts at bit 0 of word 1 and extends to bit 3 of offset 8. (256 bits is 7 words plus 4 bits).

'pad bit (7)' starts at offset 8, bit 4 and extends to bit 10.

rubout_trigger_chars is data type char, so the compiler forces alignment to the next char boundary at bit 18.

The 'pad bit(7)' is harmless but misleading. Looking at the version 1 of the structure, we see that 'break' was resized but pad was not adjusted to compensate.

'pad' should be declared 'pad bit (14)' to correctly describe the actual layout generated by the compiler."	charles.unix.pro@…
	168	Race condition in sys_trouble can block.	Hardcore		defect	Eric Swenson	new	2019-05-15T03:09:15Z	2019-05-15T03:09:15Z	"If there is a problem in rcf add cpu, sometimes the sys_trouble broadcast is sent before the new CPU has got it's act together and it misses the broadcast.

The code in sys_trouble that loops until all CPUs have acknowledged the sys_touble should have code to timeout and rebroadcast; and to give up waiting if that times out.

The added CPU does not boot correctly; occasionally seen in LOCKLESS due to host thread scheduling causing start CPU handshake failure.  The added CPU takes too long to signal successful startup; rcf assumes that the CPU is not running and goes to sys_trouble. The added CPU sets the flags that it has started; sys_trouble tells all of the non-bootload CPUs to die; the added CPU has not finished setting up it's interrupt handlers and misses the message. sys_troulbe loops forever waiting for it to acknowledge the die message. 
"	anonymous
	169	'rcf delete cpu' is simple-minded and misleadiing	Hardcore		defect	Eric Swenson	new	2019-05-19T17:10:04Z	2019-05-19T18:37:22Z	"With a config deck:

  cpu  a  7  off  dps8  70.  8.
  cpu  b  6  on  dps8  70.  8.
  cpu  c  5  on  dps8  70.  8.
  cpu  d  4  on  dps8  70.  8.
  cpu  e  3  on  dps8  70.  8.
  cpu  f  2  on  dps8  70.  8.  a
  cpu  g  2  on  dps8  70.  8.  b
  cpu  h  2  on  dps8  70.  8.  c

  boot stan
  rcf add cpu b
  rcf add cpu c
  rcf add cpu d
  rcf add cpu e
  rcf add cpu f
  rcf add cpu g
  rcf add cpu h

  rcf delete cpu a

  reconfigure: No acceptable bootload CPU would be left.

This is a Multics bug, related to an interaction between the port-expander logic and the interrupt mask assignment logic.
￼
Due to the SCU design, only two CPUs can receive interrupts.

Due to the port expander design, a CPU on a port expander cannot be the bootload CPU.

At bootup, the bootload CPU receives interrupts.

When a CPU is added, it also receives interrupts, taking eligibility from the CPU that was taking the second interrupt slot, if any.

At bootup:

   A   interrrupts

Add B

   A interrupts
   B interrupts

Add C

   A interrupts
   B no longer
   C interrupts

For the system I am analyzing, it boots on A and then adds B, C, D, E, F, G, H; so A and H are receiving interrupts.

The delete CPU logic is a bit simple-minded. If you are deleting the boot load CPU, it checks to see if the other interrupt receiving CPU is eligible to be bootload CPU. Since (on this system) G is  on a port-expander, it is not eligible and the delete fails with the misleading error message:

reconfigure: No acceptable bootload CPU would be left.

The message is really ""the other CPU receiving interrupts cannot be a bootload CPU, so rather then finding a bootload eligible CPU I am giving up.""

This demonstrates that the message is wrong:

  M-> rcf delete cpu a

  reconfigure: No acceptable bootload CPU would be left.
  Ready
  M-> rcf delete cpu b

  0849.2  stop_cpu: Removed CPU B.
  Ready
  M-> rcf add cpu b

  0849.3  start_cpu: Added CPU B.
  Ready
  M-> rcf delete cpu a

  0849.4  stop_cpu: CPU B is now the bootload processor.
  0849.4  stop_cpu: Removed CPU A.
  Ready

Deleting and adding B has the side-effect of making B the second interrupt receiving CPU, so now A can be deleted and B assigned bootload status.

M-> rzd scs$processor_data 0 10

000042 205002000007 411002000006 411002000005 401002000004 
000046 401002000003 401002000042 401002000052 401002000062 

Bit 5 in the flag indicating that the CPU is receiving interrupts; now B and C are receiving interrupts.

When A was deleted, an interrupt slot became available, and the list was searched for a processor eligible to receive interrupts and not receiving them; C was the first found and was set to receive interrupts.

The delete cpu code should be able to cope with this situation by attempting to reassign the second interrupt slot to a bootload eligible CPU before giving up, as implied by the text of the error message."	canthony
	171	Start_cpu can fail on port expander.	Hardcore		defect	Eric Swenson	new	2019-05-28T01:25:17Z	2019-05-28T01:25:17Z	"Starting a CPU on a port expander may fail.

Condition: There is a running CPU on the expander and start_cpu is not executing on it.

(Given a configuration with CPU A not on an expander, and B, C, D sharing an expander, this condition can arise if:

    start_cpu is running on A, B is running and C is added, or

    start_cpu is running on B, C is running and D is added.)

Assuming the second case (it is the well analyzed one):

Start_cpu configures the SCU port and the port expander

{{{
/* Mask interrupts for new processor and enable all controller ports to new processor. */

               call scr_util$set_mask (scs$interrupt_controller, (pdata.controller_port), scs$sys_level);
                                                            /* Allow no interrupts. */
               call scr_util$set_port_enable ((pdata.controller_port), ""1""b);
                                                            /* Set port enaobled on all controllers. */
               if pdata.expanded_port then do;              /* Update port expander bits */
                    call scr_util$set_export_enable ((pdata.controller_port), (pdata.expander_port), ""1""b);
                    call scr_util$update_export_xipmsk ((pdata.controller_port));
                                                            /* Make mask from pdata.interrupt_cpu's */
               end;
}}}

The ""set export enable"" configures the expander port to forward ""connects"" on the SCU port to the CPU on the subport. For the ""adding CPU D"" case, the expander port would be configured to forward to B, C and D.

Next, start_cpu initializes variables in init_processor, and then sends connects to make all other processors suspend normal operations. (It does not send a connect to itself, thus the two different configurations shown above.)

Because of the way that the port expander works, the connect sent to C will also be delivered to D. Depending on the timing of D's response to the connect it may execute code that renders it unresponsive to the interrupt that start_cpu sends.

This failure is reliably reproducible in the multi-threaded emulator, but is sensitive to timing conditions, indicating that this is a ""race condition"" between start_cpu's sending of connects and setting up for the interrupt with the response of the started CPU to the connect. It is unknown how the h/w would behave in this situation.

Restricting the configuration to a maximum of two CPUs per port expander seems to remediate the situation for the tc_init$start_other_cpus, as the observed behavior is that a newly added CPU executes the next start_cpu cycle, with the effect that none of the CPUs on the expander receive connects (start_cpu does not send a connect to itself) and so the second CPU on the port expander is safely isolated.

Adding a 100ms delay to start_cpu after the connect lock is released also remediates the race; but the mechanism is not well understood, and so is not necessarily a robust solution.

When adding CPUs with rcf, the race condition has not been observed; it is believed that time taken to process each rcf command allows time for the race condition to abate, but again the mechanism is not well understood.





"	canthony
	177	absa_al macro generates inefficient code.	Hardcore		defect	Eric Swenson	new	2019-06-04T23:05:48Z	2025-02-08T19:03:27Z	The absa_al macro does a run-time check of system type (ADP/L68); this check should be done at assembly time.	canthony
	184	cds, rdc, pmac cannot compile source files residing within a source archive.	Tools		defect	Eric Swenson	new	2019-07-12T00:07:53Z	2019-07-12T00:07:53Z	"Both pl1 and alm compilers permit the user to compile a source file while it resides as a component of a source archive.  The source input is identified using an archive pathname.  For example:

    pl1 bound_mbuild_.s.archive::mbuild.pl1 -ot -table -list

If other popular compilers also permitted this feature, it might help those writing tools to manage
compilations. 

Noteable exceptions are the compilers:  create_data_segment (cds); and reductions (rdc; and
   pl1_macro (pmac).

These do support support compiling a source referenced via archive pathname; the source must be
extracted from the archive to be compiled."	Gary Dixon
	189	hcom.pl1 oper declaration incorrectly includes -fill and -nofill	General		defect	Eric Swenson	new	2019-09-10T16:54:33Z	2019-09-10T16:54:33Z	"While checking code in hcom.pl1, I noted that the array oper (which declares names of control_args that
accept an operand) includes -fill and -nofill (control_args that do not accept an operand).  It also includes
-field_names (a control_args that accepts 0, 1, or more non-control_arg operands).  

These are problematic because code near the start of hcom.pl1 tries to locate the first positional argument by checking for control_args that match words in the oper array.  If found, this code unconditionally skips the next argument in the arg_list, assuming it is the operand of the matched control_arg.  As we have seen,
-fill and -nofill accept no operands; and -field_names accepts 0, 1, or more non-control_arg operands.  This code is therefore flawed.

All this was done in an effort to allow hcom to intermix positional arguments and control_args within the command line.  Since most users give the first positional argument as the 1st arg in the command line, they don't encounter this bug.  (The loop in question stops as soon as the first positional arg is found.)  So this bug is minor in nature."	Gary Dixon
	202	eis_tester documentation of -io option confused	Documentation		defect	Eric Swenson	new	2020-02-18T04:20:01Z	2020-02-18T04:20:01Z	"AR97-3 System Diagnostic Aids, page 2-50:

""-io N
    defines the instruction offset.  It is used to position the instruction 
    relative to a page boundary.  The default is 0.  This places the 
    instruction at word 0 of the second page of the instruction area. X
    indicates the number of words of the instruction to be placed in the
    first page of the instruction are. The maximum value of X is 3.""

The source code (bound_eis_test_.s$et_inst.pl1) is a bit clearer:

   *          h)  -io X       X defines the  Instruction Offset.  It is used to position
   *                          the instruction on a page boundary.  The default is  0.  This
   *                          will place the instruction at word 0 of the second page
   *                          of the instruction area.   X indicates the number of words of
   *                          the instruction which will be placed in the first page of the
   *                          instruction area.  The maximum value of  X  is  3.

However, it is still internally inconsistent. Is X the offset or the length?

Looking at the code (bound_eis_tester.s$et.pl1), is seems to be offset:

/*        Get a pointer to where we must place the instruction.  Note, the instruction
   *      area words that are not used are left as  nops.  Once we have the pointer
   *      we will move the instruction word.  Note, the instruction offset defined by
   *      the user is backwards as far as we are concerned.  We need the offset from the
   *      beginning of the instruction area.  We will convert it.
*/

               our_offset = (instr_offset - 3)* (-1);

               instr_ptr = addrel (addr (etx$instruction_area), our_offset);

               instr_ptr -> eis_map.instruction = instr_word;

"	canthony
	249	"Random ""Unexpected IOM status"" messages in ci-kit ""psl -syserr"""	Hardcore		defect	Eric Swenson	new	2021-10-10T18:18:42Z	2021-10-10T18:18:42Z	"
{{{
03:09:28 1000135  5 disk_control: Unexpected IOM status 400000000000000000000000 for dska (channel A11).
}}}

The number and timing of the messages vary from run to run, suggesting a race condition.

Running ci-kit in a single CPU configuration results in no messages, suggesting that the race condition is in Multics and not the simulator.

The message is generated by procedure check_stat in disk_control.pl1. check_stat is called by two procedures: ""run"" and ""disk_inter"".

The ""run"" procedure contains the comment:

{{{
/* Poll for disk completion.  This is required for allocation lock checks, and
   during run_locks from page control, since both are run masked, and this
   polling is the only way we would see disk completion.  This race hazard
   on normal 15-seconds run_locks will produce some interrupts without
   terminate status, but you can't win them all.  It may also produce some
   situations of interrupt wile not active. */
}}}

It is not known that this is the source of the message."	canthony
	269	PL/I convert operators returns wrong oncode for 1.Fnnn Exponent	Standard Library		defect	Eric Swenson	new	2021-12-19T17:28:41Z	2021-12-19T17:39:18Z	"Test program fld59 accepts a fixed-point string with optional exponent sub-field, and uses the PL/I convert built-in to change this string to a float dec(59) data type.  

Results of using this program to convert strings within and just outside of the support exponent range for float dec(59) show correct signaling of exponent overflow and underflow when outside the supported range:
      -128 <= exponent <= +127.

{{{
fld59 1E(-129 -128 -127 126 127 128 129) -d
   in:  1E-129
fld59  underflow condition:  oncode: 706  exponent underflow condition
   in:  1E-128
  out:  1.e-128
 dump:  +00000000000000000000000000000000000000000000000000000000001 -128
   in:  1E-127
  out:  1.e-127
 dump:  +00000000000000000000000000000000000000000000000000000000001 -127
   in:  1E126
  out:  1.e126
 dump:  +00000000000000000000000000000000000000000000000000000000001 126
   in:  1E127
  out:  1.e127
 dump:  +00000000000000000000000000000000000000000000000000000000001 127
   in:  1E128
fld59  overflow  condition:  oncode: 705  exponent overflow condition
   in:  1E129
fld59  overflow  condition:  oncode: 705  exponent overflow condition
}}}

If the same test values are entered using the F exponent letter, slightly different failure points are signaled, and different oncode values are returned.  Also, the messages associated with the returned oncode values seem inverted: 

- The message associated with overflow is returned (by interpret_oncode_) for the oncode value for F-exponents experiencing underflow.
- The message associated with underflow is returned for the oncode value for F-exponents experiencing overflow.

{{{
fld59 1F(-129 -128 -127 126 127 128 129) -d
   in:  1F-129
fld59  conversion condition:  oncode: 408  Scale factor > 127 in scaled fixed binary or decimal field.
  onsource: ""1F-129""  onchar: ""9""  onchar_index:  6
                  ^
   in:  1F-128
fld59  conversion condition:  oncode: 408  Scale factor > 127 in scaled fixed binary or decimal field.
  onsource: ""1F-128""  onchar: ""8""  onchar_index:  6
                  ^
   in:  1F-127
  out:  1.e-127
 dump:  +00000000000000000000000000000000000000000000000000000000001 -127
   in:  1F126
  out:  1.e126
 dump:  +00000000000000000000000000000000000000000000000000000000001 126
   in:  1F127
  out:  1.e127
 dump:  +00000000000000000000000000000000000000000000000000000000001 127
   in:  1F128
fld59  overflow  condition:  oncode: 705  exponent overflow condition
   in:  1F129
fld59  conversion condition:  oncode: 409  Scale factor < -128 in scaled fixed binary or decimal field.
  onsource: ""1F129""  onchar: ""9""  onchar_index:  5
}}}

Because oncode values are just numbers having no names, it isn't clear whether the wrong oncode number is associated with F-exponent underflow and overflow; or the correct oncode is being used but the message table containing the description associated with those encode values (oncode_messages_$) is wrong.  "	Gary Dixon
	307	azm apte request display bad year numbers in date associated with State value	Tools		defect	Eric Swenson	new	2023-05-01T17:08:32Z	2023-05-01T17:08:32Z	"The following scenario shows a year number of ""*"" in date associated with State value for a running process in an azm apte output.


{{{
azm

azm:  sld 1
  ERF 1   in directory >dumps dumped at 12/24/21  1306.7 pdt Fri.
  System-ID MR12.7 Version-ID MR12.7
Proc   0 DBR  17171450 running        on cpu a   Initializer.SysDaemon.z

azm:  apte -run

APTE #1 at ADDR 3000:
Processid:  003000777777 (Initializer.SysDaemon.z); DBR:      17171450
State:      running at 12/24/* 13:5:57.486967

azm:  

}}}
"	Gary Dixon
	356	Bind map appears to have wrong symbol name	Tools		defect	Eric Swenson	new	2025-03-28T03:32:59Z	2025-03-28T03:32:59Z	"Segment aligna_.alm

```        segdef  aligna_
        zero    1,1
aligna_:
        zero    1,2
        zero    1,3
        end
```

Segment alignb_.alm

```
        segdef  alignb_
        zero    2,1
        eight
alignb_:
        zero    2,2
        end
```

Segment align.bind

```
Objectname:     bound_align_;
Addname:        aligna_, alignb_;
Order:  aligna_, alignb_;
objectname:     aligna_;
objectname:     alignb_;
```

Segment align.ec:

``alm aligna_ -list
alm alignb_ -list
delete align.archive
ac ad align aligna_ alignb_
ac a align align.bind
bind align -ls
```

Executing ""ec align"" will assemble and bind. The generated bind map shows:

```
segname:    aligna_

text|10         alignb_
symb|100        symbol_table

segname:    alignb_

text|30         alignb_
symb|206        symbol_table
````

Note that segname aligna_  contains the symbol ""alignb_"" instead of the expected ""aligna_""

"	canthony
	359	Missing pseudo-op in AG92 ALM	Documentation		defect	Eric Swenson	new	2025-04-17T01:43:01Z	2025-04-17T01:43:01Z	"AG92 pages 3-30 to 3-37 contains the ""LIST OF PSEUDO-OPERATIONS"".

On page 3-36, ""short_call"" is listed; the description contains a reference to ""short_return"", but ""short_return"" is not itself in the list."	canthony
	368	tty_write_ outputs erroneous spacing.	Hardcore		defect	Eric Swenson	assigned	2025-05-26T16:22:40Z	2026-09-03T21:48:50Z	"Attached is tty_write.ec, containing:

{{{
&command_line off
stty -delay 0,0,0,0,0,0 -modes ^erkl,^esc,^ll
flnnl AAAAAAAAAAAAAAAAAAAAAAAAAA
flnnl BBBBBBBBBBBBBBBBBBBBBBBBBB
flnnl CCCCCCCCCCCCCCCCCCCCCCCCCC
flnnl DDDDDDDDDDDDDDDDDDDDDDDDDD
flnnl EEEEEEEEEEEEEEEEEEEEEEEEEE
flnnl FFFFFFFFFFFFFFFFFFFFFFFFFF
flnnl GGGGGGGGGGGGGGGGGGGGGGGGGG
flnnl HHHHHHHHHHHHHHHHHHHHHHHHHH
flnnl IIIIIIIIIIIIIIIIIIIIIIIIII
flnnl JJJJJJJJJJJJJJJJJJJJJJJJJJ
flnnl KKKKKKKKKKKKKKKKKKKKKKKKKK
flnnl LLLLLLLLLLLLLLLLLLLLLLLLLL
flnnl MMMMMMMMMMMMMMMMMMMMMMMMMM
flnnl NNNNNNNNNNNNNNNNNNNNNNNNNN
flnnl OOOOOOOOOOOOOOOOOOOOOOOOOO
flnnl PPPPPPPPPPPPPPPPPPPPPPPPPP
flnnl QQQQQQQQQQQQQQQQQQQQQQQQQQ
flnnl RRRRRRRRRRRRRRRRRRRRRRRRRR
flnnl SSSSSSSSSSSSSSSSSSSSSSSSSS
flnnl TTTTTTTTTTTTTTTTTTTTTTTTTT
flnnl UUUUUUUUUUUUUUUUUUUUUUUUUU
flnnl WWWWWWWWWWWWWWWWWWWWWWWWWW
}}}

When executed, the following output is generated:

{{{
ec tty_write
AAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCDD
DDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFGGGG
GGGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJ
JJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMM
MMMMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPPP
PPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQQQQRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSS
SSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTT                                        
                                                                        UUUUUUUU
UUUUUUUUUUUUUUUUUU                                                                                                                                              
}}}


In wtcb.incl.pl1, line 81 is:

{{{
    2 actcol fixed bin (9) unsigned unaligned,          /* tty column position */
}}}

tty_write_ tracks the tty column position there; when the column position exceeds 511, the 9 bit value overflows and wraps around zero.

Also in wtcb.incl.pl1, line 81:

{{{
    2 white_col fixed bin (17) unaligned,               /* column position resulting from trailing white space */
}}}

Note that this is an 18 bit value.

In tty_write.pl1, lines 1161 to 1167:
{{{
insert_white:                  
     proc;
             
/* this procedure puts white space into the output string */
  
        if wcol ^= col                          /* make sure we're not already where we belong */
        then do;
}}}

Normally wcol tracks col; but due to the overflow of col, insert_space appends spaces to the output to advance col to match wcol.

Note: col and wcol are local copies of wtcb.col and wtcb.white_col, declared as fixed bin.  The overflow occurs when tty_write finishes a string and updates wtcb from the local copies; on the next call to tty_write the locals are restored from wtcb and insert_white generates the extra spaces.


"	canthony
	384	config deck parser doesn't understand that L68 CPUs have 2 bit CPU numbers.	Hardcore		defect	Eric Swenson	new	2025-12-07T22:34:28Z	2025-12-07T22:34:28Z	"On DPS8M CPUs, the configuration panel has a 3 bit ""CPU number"" setting, allowing the number to be set from 0 to 7 (A-H).

On L68 CPUs, it is a 2 bit number, so L68 CPUs are numbered 0-3 (A-D).

The RSW,2 instruction is used to read the CPU number switch settings. On L68, the value is returned in bits 34-35; on DPS8M in bits 33-35.

When Multics starts the CPU. the switch setting is compared to the CPU config card; if they do not match, the CPU is not started.

When ISOLTS starts the test CPU, the same check is made.

The switch settings are cosmetic; they are checked to make sure that operations can locate the correct cabinet if Multics/ISOLTS/T&D directs them to a particular CPU.

Because L68 CPUs have a two bit CPU number, they cannot pass the value check if that are configured as E, F, G or H.

The config deck parser should generate a warning if a CPU config deck CPU card specifies a L68 model and a D, E, F or G tag.

"	canthony
	139	Setup GCOS SysDaemon	Unbundled Library		enhancement	Eric Swenson	new	2018-08-26T12:31:50Z	2018-08-26T12:31:50Z	"The GCOS daemon is installed but not registered or configured. It would save some time and the need for following the installation documentation to setup the daemon with an empty user table.

See AN05-02A, Appendix A:

Creating the GCOS User Table (A-5)
Initializing the User Table (A-5)
Installing the GCOS SysDaemon (A-6 — A-7)"	Trn
	230	"""initiate"" command lacks ability to specify the segment number of the initiated segment."	Hardcore		enhancement	Eric Swenson	new	2021-07-24T00:29:35Z	2021-07-24T00:29:35Z	"hcs_$initiate allows the specification of the segment number of the initiated segment (set the baseno of the segptr argument to the desired number and set seg_sw to 1).

The initiate command does not support this. A command line parameter to specify that a specific segment number is wanted, and to specify it; something akin to

      -seg_no number"	canthony
	284	>doc>info>manuals.gi.info needs improvements	Documentation		enhancement	Eric Swenson	new	2022-07-11T03:24:30Z	2022-07-11T03:24:30Z	"manuals.gi.info needs several changes to make it easier to use.

 - To make it easier to find, add the name:  manuals.info
 - To make it more inclusive, add entries for all the Multics manuals known on the bitsavers web site:
        http://www.bitsavers.org/pdf/honeywell/multics/
 - Include URL of this web site to provide location from which to download Multics manuals in PDF form.

The reference to the URL might appear early in the info segment, along with clues about using help's -search (-srh) control argument and search (srh) request to locate manuals.

Consider moving manual version publication information into some other info block (like manual_versions.gi.info which could be a block in the same manuals.gi.info segment).  Just have one line per manual to make the list shorter.

Instead of grouping manuals by order number, consider grouping them in info sections by major topic like PL/I  or  Other Languages  or  Commands  or  Subroutines  or  Introduction to Multics  etc.
Explain these section divisions in opening section of the info block.

       "	Gary Dixon
	305	Conditional assembly/compilation of simulator-aware code.	Hardcore		enhancement	Eric Swenson	new	2023-04-22T22:09:40Z	2023-04-29T23:53:41Z	"I would like to propose the addition of a conditional build construct to allow control over simulator-aware code changes to Multics. (See #228 for an example.)

Definitions:
   Simulator-dependent:  Code that will only run correctly on the simulator, and will give unexpected results if run on hardware.
   Simulator-aware:  Code that will run correctly on both the simulator and the hardware, but mitigates some simulator issue. This code may cause unnecessary overhead on hardware.

Statement of purpose for conditional assembly/compilation""

""We are careful to not put simulator dependencies in Multics, so as to remain h/w compatible. We may carefully add simulator aware code; that code will be conditionally built. The Multics distributions will always be built with the condition enabled; but a simulator agnostic build can easy be done if needed.""

"	canthony
	321	accounts_overseer_.pl1 (for SA1) should have a larger command buffer and should not execute an incomplete command	Standard Library		enhancement	Eric Swenson	new	2023-10-05T20:47:30Z	2023-10-05T20:47:30Z	"I stored an exec_com in >user_dir_dir>SysAdmin>admin and tried executing it as SA1.

One of the commands in the exec_com was an enter_abs_request command which had a lot of control arguments and (using the -arguments control argument) passed a lot of arguments to the absentee job. After expansion the command was 284 characters long. The error message 
{{{
accounts_overseer_: Record is too long.
}}}
was produced, but the enter_abs_request command was executed anyway - apparently using only the first 211 characters and ignoring characters after that.

I have two suggestions:
1. accounts_overseer_ should not execute part of a command that was truncated. If the whole command can't be executed, don't execute just part of it.
2. Expand accounts_overseer_'s command buffer to accommodate longer commands. I don't know what size to recommend. I would think at least 1,000 characters, but larger than that might be more appropriate."	David Rosenberg
	345	"Multics C: Create a ""limits.h"" and other standard include files."	Administration		enhancement	Eric Swenson	new	2025-01-15T17:52:49Z	2025-01-15T17:52:49Z	"Multics C is ""C87"", i.e. enhanced K&R C.  This is a pre-standard pre-ANSI (pre-C89) superset of K&R C (C78), roughly compatible with circa-1987 PCC/SGS as distributed with AT&T System V.

Multics C includes a non-standard ""values.h"" which defines some pre-ANSI standard definitions such as BITSPERBYTE, etc.

We should create a standard ""limits.h"" file, the following would be a good start:

#include <values.h>
#define CHAR_BIT BITSPERBYTE
#define CHAR_WIDTH CHAR_BIT
#define CHAR_MIN -256
#define CHAR_MAX 255
#define SCHAR_MIN CHAR_MIN
#define SCHAR_MAX CHAR_MAX
#define UCHAR_MIN 0
#define UCHAR_MAX 511

This would take care of the char types.

https://en.cppreference.com/w/c/types/limits shows other things this file should include.  This would not interfere with or modify the existing non-standard ""values.h"".

This issue is mostly a placeholder for now - I intend to complete the limits.h to be C89 compliant, and provide some additional C89 headers as well."	trnsz@…
	166	Scrub remaining BOS reference from Multics	Tools		task	Eric Swenson	new	2019-04-29T00:06:19Z	2019-05-28T16:36:05Z	"(See ticket #116)

BOS functionality has been removed from Multics, but there are still traces of it in the source.

ldd>sl1>s>bound_library_1_.s$fill_vol_extents_.pl1

  When setting up the default cold boot RPV partition, a BOS partition is included:

{{{
          call part_side_door (""bos"", ""high"", DEFAULT_RPV_BOS_SIZE_char);
          call part_side_door (""dump"", ""high"", DEFAULT_RPV_DUMP_SIZE_char);
          call part_side_door (""log"", ""high"", DEFAULT_RPV_LOG_SIZE_char);
          call part_side_door (""file"", ""high"", DEFAULT_RPV_FILE_SIZE_char);
          call part_side_door (""bce"", ""high"", ltrim (char (BCE_PART_LTH)));

          declare 1 found                aligned,
                    2 hc                 bit (1) unaligned,
                    2 conf               bit (1) unaligned,
                    2 bos                bit (1) aligned,
                    2 bce                bit (1) aligned,
                    2 file               bit (1) aligned;

               else if label.parts (j).part = ""bos""
               then found.bos = ""1""b;
}}}

  (That code has already been fixed to not require a BOS partition: found.bos is set but not used.)

ldd>sl1>s>bound_temp_1.s.$init_early_config.pl1

{{{
          do part = ""bos"", ""conf"", ""log"";

          do part = ""bos"", ""conf"", ""log"", ""dump"";
}}}

ldd>>tools>s>save_previous_system.pl1

{{{
     valid_names (6)          char(12) init   /* ""legal"" names                        */
          ( ""hardcore"", ""hard"", ""supervisor"", ""sup"", ""bos"", ""mcs"" ),
     proper_name (3)          char(8) init    /* proper name equivalent               */
          ( ""hardcore"", ""bos"", ""mcs"" );
}}}



ldd>tools>s>bound_mis_.s.archive$upd_doc_task_.pl1

{{{
          call MATCH_PATHS (dn, "">ldd>bos>object"", code );            /* BOS */
          if code = 0                                                 /*  .  */
               then go to got_odd_lib;                                /*  .  */
                                                                      /*  .  */
          call MATCH_PATHS (dn, "">ldd>bos>execution"", code );         /* BOS */
          if code = 0
               then go to got_odd_lib;
}}}


ldd>toos>s>bound_dn355_tools_.s.archive$test_fnp.pl1""


  Several mentions of ""bos"" but I believe not referring to the BOS partition.

ldd>>tools>source>bound_azm_.s.archive
ldd>include>amu_mc.incl.pl

  Several mentions of ""bos"" in comments, probably not relevant.

documentation>subsystem>bce>bos.info

  Should be deleted.

documentation>info_segments>multics_libraries_.info

  'bos' is included in a list of libraries as part of bootload; the reference should be deleted.

"	canthony
	197	tape_mult_ does not return error_table_$short_record when fewer chars remain than caller requested	General		task	Eric Swenson	new	2020-01-23T20:49:00Z	2020-01-23T20:49:00Z	"The iox_$get_chars subroutine document (MPM Subroutines, AG93) specifies:

The desired number of bytes, N, is specified in the call.  Some I/O modules may actually read fewer than N bytes into the buffer, even though N bytes are available from the file or device. In this case the code error table_$short_record is returned.  When this code is returned, the caller may again call the iox_$get_chars entry point to get more bytes. The contents of the buffer beyond the last byte read are undefined.

The meaning of this specification is unclear.  If taken literally, it says that error_table_$short_record should be used only if n_read (the number of bytes returned) is less than n (the number of bytes the caller asked to be read) AND there are more bytes to be read in subsequent calls.  However, some people have interpreted this to mean error_table_$short_record should be returned whenever 0 < n_read < n, even when no more bytes remain to be read.

It is unclear which of these ambiguous interpretations of the iox_$get_chars specification is correct.

This ticket records the fact that the tape_mult_ I/O module does not return error_table_$short_record when\\
 0 < n_read < n for the last set of data read from the tape.  

Instead, it returns error_table_$end_of_info with 0 < n_read < n.

If tape_mult_'s implementation is deemed to be defective, it would have to be changed to return error_table_$short_record when last set of characters read was less than n (number of characters expected by the caller) when reading at end-of-tape.  

NOTES:
It may be difficult to find all programs using tape_mult_ and evaluate whether they would work correctly if such change was made.  Not all tape_mult_ programs are installed in the Multics Libraries.  Some may be owned by users.  

Furthermore, peruse_crossreference is of little help when searching for programs using I/O modules, since the I/O module name is generally a character string in an attach description; not a direct declaration and use of a particular subroutine entrypoint.  print -match tape_mult_ might have to be used to search the Multics Library source directories for such programs.

Given the ambiguity of the iox_$get_chars specification, I am marking this ticket as a ""task"" type.  It is not yet considered either a defect or an enhancement request.

See the description of iox_$get_chars and the tape_mult_ I/O module in the MPM Subroutines manual, AG93 for more details.  See ticket #195 and MCR10071 (https://s3.amazonaws.com/eswenson-multics/public/mcrs/MCR10071.pdf) for more details about how this issue was discovered."	Gary Dixon
	178	Extraordinarily bad code in init_sst.pl1	Hardcore		defect	Eric Swenson	new	2019-06-05T17:29:32Z	2019-06-05T17:29:32Z	"In init_sst.pl1 is the code:

{{{
          begin;
declare  1 TEMPLATE_CME aligned like cme;
               unspec (TEMPLATE_CME) = """"b;
               TEMPLATE_CME.fp, TEMPLATE_CME.bp = ""777777""b3;
               CME (*) = TEMPLATE_CME;                      /* compiler is clever with these */
          end;
}}}

The comment is not at all true. The generated code for ""CME(*) ="" is

{{{
    for (*)
      {
         CME.fp = CME_TEMPLATE.fp;
         CME.bp = CME_TEMPLATE.bp;
....
         CME.synch_page_entryp = CME_TEMPLATE.synch_page_entryp;
      }
}}}

Each of the 19 fields in individually copied, usually with a CSL instruction, with its attendant overhead.

There should be a pl1 construct that generates a single MRL instruction to copy the entire CME_TEMPLATE."	canthony
	137	Deprecated code scheduled for removal	Include Files		task	Eric Swenson	new	2018-08-25T15:48:41Z	2018-08-25T15:48:41Z	"The segment >ldd>include>mcs_echo_neg.incl.pl1 contains a declaration for ""v1_echo_neg_data"" captioned with the comment:

/*** VERSION 1 STRUCTURE DECLARATION FOR COMPATIBILITY (TO BE REMOVED FOR MR12) ***/

Here we are at MR12.6f and it hasn't been removed.

"	chares.unix.pro@…
