The problems all stem from a single root cause: when an interrupt is requested - via any one of dozens of mechanisms (uend, normal end, special request, error, etc), the interrupt routine must be presented with the full device address, including the unit, which is stored in the channel data structures. This is so that AIO (acknowledge interrupt) can retrieve the unit number from the channel data structures and give it back to the invoking program. Unfortunately, service routines, error routines, etc were simply using the base device address, which is good enough for all channel operations EXCEPT AIO. So the four multi-unit device (RAD, DK, DP, MT) have had changes to reconstruct the full device address, with unit number, before any calls into the channel are made. DP, funnily enough, required the fewest changes. Ken was exactly right about the need to OR the unit number into dva at the start of the unit service routine. That had to be done in a few more places where my code was being lazy. RAD, DK, MT required many more changes, but they were mostly mechanical. All references to xx_dib.dva had to be examined and replaced with a full device address. The full device address had to be reconstructed from the UNIT pointer and the base device address, through the magic of pointer arithmetic. Another sore spot was HIO. HIO stops all the active unit in its tracks and does a channel UEND on it. The calculation of the unit number in the UEND was not correct in a few places, notably if DP did a controller reset. Fixes for the four modules; an updated bug history; and an expanded design document; are attached.
30 KiB
30 KiB