﻿ticket	summary	component	version	milestone	type	owner	status	created	_changetime	_description	_reporter
8	ISOLTS executes pas2 test harness incorrectly.	General			defect	Eric Swenson	new	2017-01-12T17:07:11Z	2026-10-11T17:54:26Z	"Running the pas2 exec command 'hdump' produces an infinite listing of history resister values.

"	charles.unix.pro@…
35	Finish support for passwords up to 32 characters in length	General	MR12.6e		defect	Eric Swenson	new	2017-02-11T07:19:09Z	2026-10-13T16:20:11Z	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
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
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
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
11	ISOLTS misses test opportunity	Documentation			enhancement	Eric Swenson	new	2017-02-05T18:38:17Z	2026-10-11T17:57:18Z	"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
26	Update clok card to support contemporary time zones	Hardcore	MR12.5	MR12.9	defect	Eric Swenson	assigned	2017-02-11T06:50:07Z	2026-10-13T16:19:56Z	Bring the configuration deck 'clok' card time zone list up to contemporary usage. -- Charles	Eric Swenson
69	Invoking trace_stack in admin mode crashes Multics	Answering Service	MR12.6e	MR12.9	defect	Eric Swenson	new	2017-03-19T18:04:29Z	2026-10-10T16:18:35Z	"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
75	'lst' loops endlessly when encountering broken archive segment	Standard Library	MR12.6e	MR12.9	defect	Eric Swenson	assigned	2017-05-15T22:59:57Z	2026-10-13T17:21:00Z	"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@…
156	Multics should fail to boot if 6601 console is not connected to IMU	Hardcore	MR12.6f	MR12.9	defect	Eric Swenson	assigned	2019-03-30T05:07:57Z	2026-10-13T19:47:53Z	"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
157	Specify a config deck with a model 6601 console attached to a non-IMU IOM causes BCE to lockup	Hardcore	MR12.5	MR12.9	defect	Eric Swenson	assigned	2019-03-30T05:08:50Z	2026-10-13T19:48:15Z	"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
411	info_seg.gi.info still references obsolete validate_info_seg (vis)	Documentation	MR12.8	MR12.9	defect	Gary Dixon	assigned	2026-09-24T00:29:39Z	2026-09-24T03:44:39Z	"The first Notes section says:

{{{
Notes: Type ""help vis"" for information on the validate_info_seg
command, which checks for proper info seg syntax and names.
}}}

It also uses validate_info_seg in an example:

{{{
Follow the date with two spaces and the long (and short, if any)
name of the module being described; for example,

   1985-10-10  validate_info_seg, vis
   1985-09-23  ioa_
}}}
"	Eric Swenson
412	Bugs identified in archive.pl1	Standard Library	MR12.9	MR12.9	defect	Eric Swenson	new	2026-09-25T19:32:19Z	2026-09-25T19:32:19Z	"The archive command has several bugs that destroy user data or leave the user with unintended access, and several that print misleading messages or leak storage. Numbers 1-19 below are part of a single numbering for a total of 36 identified bugs across the archive programs (archive.pl1, archive_util_.pl1, archive_.pl1, archive_aux_.pl1, and update_handler_.pl1). Line numbers are from MR12.8 and indicate the start of the problem area. Item 6 below is not a bug but documented behavior missing from archive.info; other errors in archive.info are listed below but are in addition to the numbered bugs. I have a tests.archive test kit which has an exec_com for each item marked ""Test"" which prints the expected behavior and then runs commands. In the examples below, t_ok.archive holds two components, alpha and beta, and seed.txt is any small text segment.

Bug 1: an archive that exists but cannot be read is treated as missing, line 460

For the replace and append keys (r, rd, a, ca, ...), any failure of initiate_file_ on the archive, not only ""entry not found"", is taken to mean that the archive does not exist. The command then tries to create a new archive, gets ""name duplication"", and calls nd_handler_, which asks whether to delete the existing archive. Answering yes replaces the whole archive with one holding only the new components.

sa t_ok.archive w
ac r t_ok beta
archive: Name duplication. Do you want to delete the old segment ...>t_ok.archive?

Expected: the error from initiate_file_ (here ""No read permission on entry"") is reported, and no query is asked. Test: bug01.ec.

Bug 2: updating a protected archive deletes the user's own ACL entry instead of restoring it, lines 672 and 717

When the user lacks w on the archive, the command asks whether to update it, gives the user's process group ID (e.g. Person.Project.a) rw, and afterwards deletes that ACL entry. If an entry for that exact name already existed, it is overwritten and then deleted.

sa t_ok.archive r
sa t_ok.archive r Person.Project.a
answer yes ac r t_ok beta
list_acl t_ok.archive          (the Person.Project.a entry is gone)

Expected: the ACL is the same after the update as before it. Test: bug02.ec.

Bug 3: forced access is left on a protected archive after a failure or an interruption, lines 702 and 792

The ACL entry added in bug 2 is removed only on the successful path. After a record quota overflow, or if the command is interrupted and the user releases, the user is left with rw on the archive:

list_acl DIR>t_rqo3.archive
rw    Person.Project.a
r     Person.Project.*

Expected: the original access is restored on every path. Test: bug03.ec (needs an empty directory with a 60-record quota).

Bug 4: after a record quota overflow, the saved copy of the updated archive is misreported and then destroyed, line 705

When an update fails for lack of quota, the updated archive, built in the process directory as archive_temp_.archive, is renamed to the archive's name and the user is told where to find it. If that name is already taken in the process directory (e.g. by a copy saved by an earlier failure), the rename fails, the message names [pd]>temp.archive, which does not exist, and the segment remains the command's temporary. The next update in the process truncates it to 0 records, destroying the only updated copy; its bit count is left unchanged, so it then lists as a format error.

ac r DIR>t_rqo c2
archive: Record quota overflow. Archive DIR>t_rqo.archive not updated.
A copy of the updated archive can be found in [pd]>t_rqo.archive
ac r DIR>t_rqo c3
archive: Record quota overflow. Archive DIR>t_rqo.archive not updated.
A copy of the updated archive can be found in [pd]>temp.archive
ac r t_ok beta
status [pd]>archive_temp_.archive      (records used: 0)
ac t [pd]>archive_temp_
archive: Format error in [pd]>archive_temp_.archive

Expected: the message names the segment that holds the copy, and the copy survives later archive commands. Tests: bug04.ec, bug04d.ec (need an empty directory with a 60-record quota).

Bug 5: extracting with force over a link deletes the link's target instead of the link, line 855

When the destination entry exists and is a link, x and xd ask (through nd_handler_) whether to unlink it, while a similar copy -force's behavior unlinks it with the message ""Name duplication. Unlinking the old link ... (Target ... exists.)""; in each case the target is not touched. xf and xdf instead call the command's own delete_seg, which chases the link and deletes its target (which may be anywhere in the hierarchy), then create a new segment through the link in the target's directory. No segment is created in the working directory, the target loses its other names and its ACL, and no message is printed.

add_name keep>alpha keepname
link keep>alpha alpha
ac xf t_ok alpha
status alpha                    (still a link)
status keep>alpha -names        (keepname is gone)

Expected: as the MPM says, an existing entry is handled by the copy command's duplicate name convention: the link is unlinked, as by copy -force, and the component is extracted in the working directory. Test: bug05.ec (also runs copy -force and ac x over a link for comparison).

6: Not a bug: deleting a linked source after rd, ud or ad deletes the link's target, which archive.info does not say

When a source named on the command line is a link, the deletion requested by rd, ud or ad deletes the segment the link points to, not the link. This is documented in the MPM (Commands, archive, Notes: ""For segment deletions after replacement requests, if the specified component name was a link to a segment, the segment linked to is deleted. The link is not unlinked.""), but archive.info says nothing about it, and the behavior is unexpected: a segment elsewhere in the hierarchy, possibly with other names, is deleted, and the link is left pointing to nothing.

Expected: archive.info includes the MPM's statement.

Bug 7: component names longer than 32 characters are truncated for table and delete, line 535

For t, tl, tb, tlb, d and cd, a component name argument is assigned to a 32-character variable without a length check, so a longer name matches the component named with its first 32 characters. ac d deletes a component that was not named:

ac d t_longname abcdefghijklmnopqrstuvwxyz0123456789
                (deletes abcdefghijklmnopqrstuvwxyz012345)

Expected: ""Entry name too long"", as the other keys already report through expand_pathname_, and nothing is deleted. Test: bug07.ec.

Bug 8: a global extract-and-delete can remove a component that was not extracted, line 835

In xd with no component names, if creating the segment for a component fails (e.g. a directory of that name exists), whether the component is kept in the archive depends on a stray word of storage (see bug 9). In practice it is deleted from the archive without being extracted:

create_dir beta
ac xd t_ok
archive: This operation is not allowed for a directory. ...>beta
archive: All components of ...>t_ok.archive have been deleted.

Expected: a component that was not extracted stays in the archive. Test: bug08.ec.

Bug 9: a failed extraction with no component names writes outside the argument array, line 835

In the same case as bug 8, and for x with no names when a segment cannot be created (e.g. no append permission), the command reads and writes element 0 of the argument array (nonglobal (i) with i = 0), which does not exist, overwriting a word of the stack frame before the array. Found by inspection; exercised by bug08.ec.

Bug 10: a global delete-type update of more than 102 components creates, and leaks, a segment for each further component, line 990

The list of source segments to delete is kept on the stack; when it fills, it is moved to a segment in the process directory. The test for ""full"" does not check whether the list has already been moved, so for every component after the 102nd a new segment is created and the list copied into it; only the last is deleted. A global rd of a 110-component archive leaves 7 unnamed segments in [pd]. Test: bug10.ec.

Bug 11: the global update messages name the archive's directory instead of the working directory, line 778

The source segments for a global update come from the working directory, but the messages name the directory containing the archive:

cwd work
ac u <t_ok
archive: No matching segments in ...>bug11; no components were updated in archive ...>bug11>t_ok.archive
archive: Archive ...>t_ok.archive contains the latest versions; no components were updated from ...>bug11.

Expected: both name the working directory (...>bug11>work). Test: bug11.ec.

Bug 12: with the copy keys, messages name the original archive, which is unchanged, lines 760 and 769

For cr and its variants, the message for a component added to the archive names the original archive rather than the new copy in the working directory. The ""Archive segment overflow"" message has the same error.

cwd work
ac cr <t_ok gamma
archive: ...>work>gamma appended to ...>bug12>t_ok.archive

Expected: ""appended to ...>bug12>work>t_ok.archive"", the archive that was changed. Test: bug12.ec.

Bug 13: an archive overflow while copying leaves an incomplete new archive, line 1087

If a copy key (cr, ca, cd, ...) runs out of room while copying components into the new archive in the working directory, the command stops and leaves the partial archive, with a bit count of 0. Expected: no partial archive is left. Found by inspection (needs an archive near the maximum segment length).

Bug 14: segments are left initiated on error paths, lines 851, 975, 1021 and 1030

When a source's bit count is inconsistent with its length, and when adding a source would overflow the archive, the source segment is not terminated. When xf replaces an existing destination entry, the segment returned by the first hcs_$make_seg is not terminated. Found by inspection.

Bug 15: a global replace sets a flag through a stale index, line 935

If the archive itself matches a component name in a global replace, the command sets flags (i) using the index of the last named component, which in the global case is stale and points into the deletion list. Found by inspection.

Bug 16: an error from fs_util_$get_max_length is ignored when a new archive is created, line 1120

The code tests code instead of error after the call. Found by inspection.

Bug 17: an unexpected error from archive_util_$first_element is ignored, line 473

If the archive's status cannot be obtained, first_element returns a system error code, which the command treats as success. Found by inspection.

Bug 18: the archive is not terminated when the command stops on an early error, line 467

When the archive's mode or maximum length cannot be obtained, the command returns directly (goto RETURN) instead of through its cleanup. Found by inspection.

Bug 19: word counts are computed with 17-bit precision, lines 816, 1008 and 1078

divide (..., 17, 0) is used for component word counts, which can exceed 131,071 for large components. No failure was seen on MR12.8, because the values are held in full words. Found by inspection.

Errors in archive.info

paths is described only for table and delete operations; it is also the source or destination segment for append, replace, update and extract.
tlb is said to suppress ""the time portion of dates""; it suppresses the title and column headings, as the MPM says.
ca: ""appending components to a copy of the new archive segment"" should be ""a copy of the archive segment""; cud: ""copies, update, and deletes"" should be ""copies, updates, and deletes"".
x, xf: the MPM's statement that an existing entry is handled by the copy command's duplicate name convention is missing.
Notes: the MPM's statement about linked sources (item 6) is missing, as is any mention that the copy operations cannot be used on an archive in the working directory, or of what happens after a record quota overflow.

"	Jim Lippard
413	Bugs identified in archive_util_.pl1	Standard Library	MR12.9	MR12.9	defect	Eric Swenson	new	2026-09-25T19:35:03Z	2026-09-25T19:35:03Z	"archive_util_ accepts archives that archive_ rejects, so the archive command and the archive_ subroutine disagree about what an archive is: the command lists and processes damaged archives that the subroutine calls format errors. It also has precision and declaration errors. Numbers 20–27 are part of a single numbering across the archive programs; line numbers are those of the MR12.8 source. The crafted archives named below are in the test kit (tests.archive), with an exec_com for each item marked ""Test"".

Bug 20: headers beginning with the obsolete archive_data_$header_begin are accepted, line 71

A header may begin with either archive_data_$ident or the obsolete archive_data_$header_begin. archive_ accepts only archive_data_$ident. An archive whose first header uses the obsolete string lists without error:

ac tl t_obsolete       (lists alpha and beta)

Expected: ""Format error"", as from archive_. (No archive using the obsolete string is known to exist.) Test: bug20.ec.

Bug 21: the header fence (archive_data_$fence) is not checked, line 71

A header whose fence is damaged is accepted:

ac tl t_nofence        (lists alpha and beta; beta's fence is damaged)

Expected: alpha is listed, then ""Format error"", as from archive_. Test: bug21.ec.

Bug 22: the bit count field is not validated, lines 61 and 121

The bit count field is converted with cv_dec_ with no check, so a field that is not a number is taken as some value (possibly 0), and the scan continues at the wrong place, possibly treating component data as the next header:

ac tl t_badbc
alpha        09/22/26  1639.0 r w  09/22/26  1630.0   x
beta         ...

Expected: ""Format error""; the field must be digits (left or right justified, as archive_ allows), and the component must lie within the archive. Test: bug22.ec.

Bug 23: an archive whose bit count is not a whole number of words is accepted until its end, line 92

The archive's length is rounded up to a whole word, so its components are listed or processed before a format error is reported at the end:

ac tl t_unaligned      (t_ok plus one character)
alpha ...
beta ...
archive: Format error in ...>t_unaligned.archive

Expected: ""Format error"" at the start, with nothing listed or processed. Test: bug23.ec.

Bug 24: a header that extends past the end of the archive is read, line 69

When 1 to 24 words remain after a component, the next header is read partly beyond the archive's bit count. Normally this produces a format error anyway. Found by inspection.

Bug 25: offsets are computed with 17-bit precision, lines 36 and 61

Word offsets and the archive length are held as fixed bin (17) and computed with divide (..., 17, 0), limiting them to 131,071 words, while a segment can be 262,144 words. An offset derived from a corrupt bit count can also wrap around the segment, since it is not checked against the archive length before a pointer is formed. No failure was seen in tests on MR12.8 with archives over 128K words. Found by inspection.

Bug 26: first_disected returns component outputs along with an error code, line 112

On a status error or an empty archive, the segment pointer, name and bit count outputs are filled from whatever the header pointer addresses. Expected: outputs cleared whenever the code is nonzero. Found by inspection.

Bug 27: incorrect declarations, lines 34, 40, 103 and 135

hcs_$status_mins is declared with fixed bin (17) type and code arguments (actual: fixed bin (2) and fixed bin (35)); the error code parameters are fixed bin (17), though a full error_table_ code can be returned in them when the archive's status cannot be obtained; cv_dec_ is declared as a subroutine rather than a function. Found by inspection."	Jim Lippard
421	">doc>privileged should be included in default ""info"" search paths."	Documentation	MR12.8	MR12.9	defect	Eric Swenson	new	2026-10-03T21:23:28Z	2026-10-10T15:23:03Z	"Because the default linker search paths include a broad set of Multics software, tools, commands, and administrative programs and scripts, there seems to be a general consensus that >doc>privileged (which documents many of the programs in the >tools directory) should be included in the default ""info"" search paths.  The current default linker search paths are shown below.

{{{
psp linker
linker
        -initiated_segments
        -referencing_dir
        -working_dir
        system_library_standard
        system_library_unbundled
        system_library_1
        system_library_tools
        system_library_network
        system_library_auth_maint
}}}

The current default info search paths are shown below.

{{{
psp info
info
      >doc>iml_info
      >doc>info
      >doc>aml_info
}}}

I recommend adding >doc>privileged after >doc>info in the default info search paths shown above.


One could argue that since >standard_library_network is included in the default linker search paths, its info segment directory should also be included in the default info search paths:  >doc>net

I am not sure there is general consensus on this point, however.
"	Gary Dixon
422	ftp_dialup_ logs garbage for logout type upon ftp hangup	Answering Service	MR12.9	MR12.9	defect	Eric Swenson	new	2026-10-08T16:09:38Z	2026-10-08T16:20:14Z	"When an FTP user hangs up, ftp_dialup_ receives a hangup event message. This message is binary.  It is included in the LOGOUT AS log message as binary and therefore a log message like this results:

{{{
   0830  as   LOGOUT             Swenson.SysAdmin.a int sty.sftp_01   0: 1 $0.08 (\400\000\000\002)
}}}

dialup_, which handles non-FTP, interactive logins and logouts, also logs an AS message upon hangup, but changes the 4-character logout type to ""hngp"" so that the message looks like:

{{{
   0830  as   LOGOUT             Swenson.SysAdmin.a int d.h000   0: 1 $0.08 (hngp)
}}}
ftp_dialup_ should get updated to do as dialup_ does in this case, and set the logout type to ""hgnp""."	Eric Swenson
424	cv_ptr_$terminate can cause termination of segment being initiated by segno	Standard Library	MR12.6e	MR12.9	defect	Gary Dixon	accepted	2026-10-10T21:19:14Z	2026-10-10T21:20:58Z	"If a program like area_status is invoked to display status information about the system free area, it can unintentionally terminate that segment by calling cv_ptr_$terminate as documented.  

Documentation says callers of cv_ptr_ should call cv_ptr_$terminate to remove a null reference name from count associated with the segment.  But if such callers gave a segment number as input to cv_ptr_, the new cv_ptr_ does not initiate that segment with a null reference name (since it is already known to the process).  It just returns a pointer to the segment.  When the caller subsequently calls cv_ptr_$terminate for an outer-ring segment, a reference name will be removed from the segment.  If the segment's null reference counter drops to zero, the segment will be made unknown to the process.

A worst-case example:  

{{{
call cv_ptr_ [call get_system_free_area_ -out -return] -out -code -out

-- Return from: cv_ptr_ -------
 code02               OK
 retValue             247|0
r 14:02 0.150 17

call cv_ptr_$terminate 247|0

Fatal error. Process has terminated. Improper access on user's linkage segment.
New process created.
}}}

This problem can occur more in a less-expected manner by invoking a command which calls cv_ptr_ with an input VIRTUAL_PTR string.

{{{
area_status [call get_system_free_area_ -out -return]

                Busy      Free

Blocks            86         5
Words          66052       112
194932 words of virgin storage
in 1 components.
Zero on free in effect.

Fatal error. Process has terminated. Improper access on user's linkage segment.
New process created.
}}}

I think the old cv_ptr_ had this same problem.  

For callers of the new cv_ptr_$details entry point, the details returned to the caller along with the pointer indicate when cv_ptr_$terminate should not be called when the segment pointed to is: an inner-ring segment, or was already known to the process.  But the cv_ptr_ interface has no way of knowing when it should or should not call cv_ptr_$terminate.

I think the cv_ptr_ interface should always initiate an outer-ring segment with a null reference name, whether or not is was already known to the process.  That way, the null reference name counter can be decremented without causing the segment to be made unknown to the process.
"	Gary Dixon
243	Dates with 2-digit year values after 2029 are assumed to be in the 20th century (e.g, 1930).	General	MR12.7	MR12.9	enhancement	Eric Swenson	new	2021-09-15T19:31:44Z	2026-10-11T05:03:08Z	"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
420	system_info_ entry points are poorly declared in both source and documentation.	Administration	MR12.6e	No Milestore	defect	Eric Swenson	new	2026-09-27T00:06:02Z	2026-09-27T00:07:25Z	"The system_info_.pl1 source program does not declare the parameters expected by each of its external entry points.  A few have their parameters declared fully; others declare some of the parameters but not all of them; and most of the entry points declare none of the expected parameters.

The following except lines from system_info_.pl1 show this problem.

{{{
installation_id: entry;
sysid:    entry;
version_id:    entry;
session:  entry;
titles:   entry;
users:    entry;
timeup:   entry;
next_shutdown: entry;
last_shutdown: entry;
rates: prices: entry;
rates_rs: prices_rs: entry (rs_number);
device_rates: device_prices: entry (ndev, devp);
device_rates_rs: device_prices_rs: entry (rs_number, ndev, devp);
abs_limits: entry;
default_absentee_queue: entry;
abs_prices: entry;
abs_prices_rs: entry (rs_number);
io_prices: entry;
io_prices_rs: entry (rs_number);
abs_chn:  entry (ev, pid);
next_shift_change: entry (curshft, shftime, newshft, starttime);
shift_table: entry (stt);
request_chn: entry;
access_ceiling: entry (access_ceiling);
log_threshold: entry;
level_names: entry;
category_names: entry;
ARPANET_host_number: entry;
resource_price: entry (a_price_name, a_price, a_code);
resource_price_rs: entry (rs_number, a_price_name, a_price, a_code);
rs_name:  entry (rs_number, rs_name, a_code);
rs_number: entry (rs_name, rs_number, a_code);
max_rs_number: entry (rs_count);
trusted_path_flags: entry (stp);
}}}


Note that some of these entry points appear in the MPM Subroutines writeup for system_info_ with parameters fully specified.  

Other entry points are missing from the manual, but are fully declared in the system_info_.info segment.  

And most of the entry points have parameter attributes declarations in the >sss>pl1.dcl segment.  However, while all of these entry points are retained by bound_info_rtns_.bind, some are not declared in MPM Subroutines writeup or the system_info_.info segment.

The system_info_.pl1 code enables setting undeclared output values by treating then as command arguments.  It calls cu_$arg_ptr to locate the char(*) argument, and sets its output value using the cu_-provided pointer and length.  This practice may have stemmed from limitations of the v1pl1 compiler, but those have long since disappeared from Multics.

 - Code in system_info_.pl1 should be updated to declare all parameters for every external entry point, and to use those declarations to return output data to the caller.

 - Information in system_info_.info should be made fully consistent with the declared parameters, and provide documentation for all system_info_ external entry points.

 - All system_info_$XXX entry points listed in >sss>pl1.dcl should be removed.  Some are incorrect, and none will be needed if the actual parameters are declared in the PL/I source program.  The PL/I compiler will provide argument descriptors for these parameters.

Until this issue is corrected, the user should refer to the MPM Subroutines or system_info_.info segment for correct calling sequence expected for each entry point.

When this ticket is closed, all entry points should be properly declared in the source.  The display_entry_point_dcl (depd) command and Emacs pl1dcl keystroke will provide correct documentation for each parameter.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               "	Gary Dixon
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	2026-10-13T19:41:14Z	"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
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@…
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
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
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
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
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
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
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@…>
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
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@…
362	"Y2K problem in gtss ""status"""	General	MR12.8		defect	Eric Swenson	new	2025-05-16T21:15:12Z	2026-09-08T00:25:11Z	"{{{
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@…
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@…
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
409	weekly absentee job needs weekly_time set in sys_admin.value	Administration	MR12.8		defect	Eric Swenson	new	2026-09-19T16:20:47Z	2026-09-19T16:20:47Z	"On a brand new cold-booted system (or quickstart), if you try to run the weekly absentee:

{{{
cwd >udd>sa>a
ec master weekly
}}}

you get an error that weekly_time hasn't been set in sys_admin.value.

This value should get set to some default, perhaps."	Eric Swenson
426	PL/I I/O describes but does not implement the column(e) option	General	MR12.6e		defect	Eric Swenson	new	2026-10-13T22:51:56Z	2026-10-13T22:51:56Z	"AM83 Multics PL/I Reference Manual, pg 14-40 describes a control format option for use in print stream output:  column(c)  


{{{
'column' FORMAT ITEM

The 'column' format item has the forms:

     column(e)
     col(e)

Let n be the value of the expression e for a given execution; then the item
advances the stream pointer to the next character position that is in column n;
that is, to a character position that is the nth character position of a line.
This interpretation implies that if the stream pointer is beyond the nth column,
the operation is applied to the next line. If n exceeds the length of the line
(so the specified character position does not exist), the stream pointer is set
to the beginning of the next line.
}}}

Unfortunately, this column format option does not seem to be implemented.  Here is a program example which tries to use this option.


{{{
foo:      procedure;

  dcl (item1, item2) char(10);
  dcl  sysprint file external;

          item1 = ""1st value"";
          item2 = ""2nd value"";

          put skip(5) column(10) list(item1, item2);
          put skip;

          end foo;
}}}

The compiler issues the following two error statements.

{{{
PL/1 33f

ERROR 288, SEVERITY 3 ON LINE 9
Unrecognizable option or attribute ""column"" in an I/O statement. It has
been ignored.
SOURCE:   put skip(5) column(10) list(item1, item2);

ERROR 1, SEVERITY 3 ON LINE 9
A syntax error has been found in this statement. Processing of the
statement has been terminated.
pl1: An error of severity 3 has occurred.
pl1: Translation failed. foo.pl1

}}}

This indicates two actual problems.  

 - The column option is diagnosed as an unknown option, even though it is documented in AM83.
 - The compiler rejects the otherwise proper put statement, even though it says it is ignoring the unknown option.

Removing the column option allows the program to compile and execute correctly.


{{{
foo:      procedure;

  dcl (item1, item2) char(10);
  dcl  sysprint file external;

          item1 = ""1st value"";
          item2 = ""2nd value"";

          put skip(5) list(item1, item2);
          put skip;

          end foo;



r 15:50 0.059 4

pl1 foo -ot
PL/1 33f
r 15:50 0.102 15

foo





1st value           2nd value  
r 15:50 0.023 0
}}}

"	Gary Dixon
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
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	2026-09-19T22:58:32Z	"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
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
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@…
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	2026-10-13T18:08:33Z	"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
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	2026-10-13T18:11:43Z	"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
80	ALM crashes on syntax error	Tools	MR12.6f	MR12.9	defect	Eric Swenson	new	2017-08-23T03:53:15Z	2026-10-13T17:42:16Z	"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@…
88	Document FIRST_TTY_BUF_PAGEX, dn355 DCWs, and IO page tables	Documentation	MR12.6f	MR12.9	defect	Eric Swenson	assigned	2017-12-23T00:26:58Z	2026-10-13T18:02:13Z	"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
107	AG93-05A documentation inaccuracies/omissions	Documentation	MR12.6f	MR12.9	defect	Eric Swenson	new	2018-04-22T17:55:35Z	2026-10-13T18:24:05Z	"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@…
136	Error when exiting FAST subsystem	Unbundled Library	MR12.6f	MR12.9	defect	Eric Swenson	assigned	2018-08-20T13:31:01Z	2026-10-10T19:34:22Z	"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
226	reload_system_release of 12.7LDD_STANDARD produces an error file	Hardcore	MR12.6f	MR12.9	defect	Eric Swenson	new	2021-06-15T02:37:46Z	2026-10-11T04:40:23Z	"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
249	"Random ""Unexpected IOM status"" messages in ci-kit ""psl -syserr"""	Hardcore	MR12.7	MR12.9	defect	Eric Swenson	assigned	2021-10-10T18:18:42Z	2026-10-11T04:39:28Z	"{{{
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
358	initiate command fails to handle allocation error from hcs_$status_	Administration	MR12.6e	MR12.9	defect	Eric Swenson	assigned	2025-04-10T13:41:24Z	2026-10-11T04:39:02Z	"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
374	qedx (qx) does not handle input lines longer than 607 characters	General	MR12.8	MR12.9	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@…
388	Multics C documentation does not match implementation for error.h and missing declarations in stdio.h	Administration	MR12.8	MR12.9	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@…
414	Bugs identified in archive_.pl1 subroutine	Standard Library	MR12.9	MR12.9	defect	Eric Swenson	new	2026-09-25T19:37:21Z	2026-09-25T19:37:21Z	"Numbers 28–32 are part of a single numbering across the archive programs; line numbers are those of the MR12.8 source. The test kit (tests.archive) contains an exec_com for the item marked ""Test"", and archive_test.pl1, a program that calls the archive_ entries directly.

Bug 28: a component name longer than 32 characters is truncated, line 110

archive_$get_component and archive_$get_component_info truncate the component name argument to 32 characters, so a longer name finds the component named with its first 32 characters. With an archive holding abcdefghijklmnopqrstuvwxyz012345:

archive_test t_longname abcdefghijklmnopqrstuvwxyz0123456789
get_component abcdefghijklmnopqrstuvwxyz0123456789:
  found, bc 324
get_component_info abcdefghijklmnopqrstuvwxyz0123456789:
  abcdefghijklmnopqrstuvwxyz012345  bc 324 ...

Expected: error_table_$no_component from both, since no component can have a name longer than 32 characters. Test: bug28.ec.

Bug 29: on a format error in list_components, the component list is freed without naming the caller's area, line 266

The list is allocated in the caller's area (output_area) but freed with a plain free. (The cleanup handler frees it in (output_area).) No symptom was observed, probably because a Multics allocation block identifies its own area. Found by inspection.

Bug 30: a header that extends past the end of the archive is read, line 336

When fewer words remain after a component than a header needs, the next header is read partly beyond the archive's bit count. Normally this produces a format error anyway. Found by inspection.

Bug 31: next_component with a pointer that does not follow a header reports a format error in the archive, line 176

A component_ptr that points into the middle of a component is backed up by a header length and rejected as error_table_$archive_fmt_err, blaming the archive for the caller's bad argument. Expected: error_table_$bad_arg. Found by inspection.

Bug 32: missing parameter attribute, line 50

The declaration of P_n_components lacks the parameter attribute. Found by inspection."	Jim Lippard
415	Bugs identified in archive_aux_.pl1 subroutine	Standard Library	MR12.9	MR12.9	defect	Eric Swenson	new	2026-09-25T19:38:41Z	2026-09-25T19:38:41Z	"Numbers 33–35 are part of a single numbering across the archive programs; line numbers are those of the MR12.8 source. The test kit (tests.archive) contains an exec_com for the item marked ""Test"".

Bug 33: a directory in the working directory is treated as a source segment, line 102

For a global replace or update (r, u and variants with no component names), a directory, or a link to one, whose name matches a component is taken as that component's source; the command then reports an error for it. With an archive holding alpha and beta:

copy <seed.txt alpha
create_dir beta
ac r t_ok
archive: This operation is not allowed for a directory. ...>bug33>beta

Expected: directories are not candidate sources, so alpha is replaced and beta is left unchanged without a message. Test: bug33.ec (a directory; the link-to-directory case is by inspection).

Bug 34: free uses an uninitialized area pointer, line 119

The free entry frees the directory listing in (area), where area is based on a pointer set only in the invocation of the listwdir entry, not in this one. Found by inspection.

Bug 35: listwdir returns garbage if hcs_$star_list_ fails, line 75

The entry and name pointers are not initialized, and the entry count is updated even when the call fails, so the caller can receive uninitialized pointers and a nonzero count. Expected: null pointers and a zero count on failure. Found by inspection."	Jim Lippard
418	There are two telnet.info segments -- one is obsolete and should be removed	Networking	MR12.8	MR12.9	defect	Eric Swenson	new	2026-09-25T23:39:03Z	2026-09-25T23:39:03Z	Both >doc>info>telnet.info and >doc>net>telnet.info are present in the storage system. The one in >doc>info is old, obsolete, and discusses the version of telnet that existed for the ARPANET.  It should be deleted.	Eric Swenson
425	mlsys_transmit_.pl1 doesn't return an error code when it doesn't know a routing path to a destination	Standard Library	MR12.9	MR12.9	defect	Eric Swenson	new	2026-10-13T19:58:13Z	2026-10-13T19:58:13Z	When mlsys_transmit_.pl1, line 3088, dealing with network mail, hits a destination for which it doesn't know a routing path, it attempts to return mlsys_et_$cant_compute_route, but sets the value of the variable code instead of the variable recipient.code, so no appropriate error code is returned to the caller.	Jim Lippard
129	Add binary table to >doc>info>ascii_table.gi.info	Documentation	MR12.6f	MR12.9	enhancement	Eric Swenson	new	2018-07-10T03:21:45Z	2026-10-13T19:32:33Z	"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
390	Add C preprocessor defintion identifying the Multics C compiler	Tools	MR12.9	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@…
166	Scrub remaining BOS reference from Multics	Tools	MR12.5	MR12.9	task	Eric Swenson	assigned	2019-04-29T00:06:19Z	2026-10-13T20:02:33Z	"(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
417	archive.pl1 xd and xdf operations result in data loss if an archive has 2+ same-named components	Standard Library	MR12.9	No Milestore	defect	Eric Swenson	new	2026-09-25T22:48:35Z	2026-09-25T22:48:35Z	"The archive command will not create an archive with duplicate component names, but if such an archive is created, the xdf operation will extract each successive duplicately named component over the previous and then delete all of them from the archive, leaving only the last one extracted. With xd, any components you say ""yes"" to will overwrite previously extracted ones and be deleted from the archive, any you say ""no"" to will remain in the archive."	Jim Lippard
121	Newly created root disks need salvaging.	Install/Upgrade			defect	Eric Swenson	new	2018-06-10T02:19:35Z	2026-10-13T19:23:43Z	"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
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
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
265	cref_analyze_ gives superfluous errors for non-object segments	Tools	MR12.5		defect	Eric Swenson	new	2021-12-04T18:59:04Z	2026-09-15T17:51:07Z	"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
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
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	2026-09-15T17:50:20Z	"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
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
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
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	2026-09-15T17:49:42Z	"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
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
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
131	read_mail (rdm) enhancement for brief header display mode	Unbundled Library	MR12.6f		enhancement	Eric Swenson	new	2018-07-15T03:29:58Z	2026-10-13T19:37:21Z	"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
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
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	2026-09-06T15:38:52Z	"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
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
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@…
272	Crank runs give warnings about missing PDTs	Administration	MR12.5		issue	Eric Swenson	accepted	2021-12-24T17:25:53Z	2026-09-15T17:50:51Z	"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
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
416	Bug identified in archive's update_handler_.pl1 subroutine	Standard Library	MR12.9	MR12.9	defect	Eric Swenson	new	2026-09-25T19:39:59Z	2026-09-25T19:39:59Z	"Number 36 is part of a single numbering across the archive programs (the archive command's handling of protected archives, bugs 2 and 3, is proposed to use update_handler_); the line number is that of the MR12.8 source.

Bug 36: for an entry in the root directory, the protected-segment query shows the path as >>name, line 68

The query ""Do you want to update the protected segment ^R^a>^a^B?"" builds the path with ^a>^a, so for an entry in the root directory (directory name >) the path is printed as >>name. Expected: the path as pathname_ forms it (>name). This affects every caller of update_handler_. Found by inspection."	Jim Lippard
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	2026-10-13T19:38:54Z	"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@…
