@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            SYS193
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                           ISSUE 11~
~V9 -1
~P
~V9 1
~YSYS193
~M~OSYS IMPLEMENTATION DESCRIPTION
~
~M~OSection 19 Version 3
~S1~OSection 19.3 Configuration Management (Dynamic version)
~S1~O1. General Description
~BThe configuration manager is responsible for discovering the
local peripheral configuration upon startup - i.e. what devices are
connected to which sockets - and keeping this information up to
date in the light of peripheral breakdowns and re-configurations.
A subsidiary task is to re-route messages directed at output devices
which are not available.
~BIn this  version, the peripheral configuration is
dynamic, and is determined by the command procedure, CONFIG.
~S1~O2. Interfaces
~
Other modules used~
   Section 7 (Input/Output and communications manager)~
Organisational commands~
   SET.PERIPHERAL (ENTRY, PERIPHERAL NAME, SPN)~
   REROUTE.PERI (PERIPHERAL CHANNEL, NEW SPN, NEW PID, NEW CHANNEL)~
   CONFIG (DEVICE NO, LOGICAL ID, PHYSICAL ID, PHYSICAL MODE)~
Command level interface procedures~
   ROUTE (DESTINATION)~
   LOOK.UP.PERI (NAME)~
   HELD (DEVICE NO, REASON)~
   READY (DEVICE NO)~
Configuration parameters~
   PERI.NAME~
   CONFIG.TABLE~
   PERI.BUFF.VA~
   PERI.BUFF.RA~
~S1~O2.1 Hardware Interface
~BNone
~S1~O2.2 Software Interface
~S11) ROUTE (DESTINATION)
~BThis procedure is called by the send message command (section 15),
prior to linking a message to a peripheral channel. It enables the
configuration manager to alter the destination of the message,
in order to take account of peripheral re-configurations.
~S12) LOOK.UP.PERI (NAME)
~BThis procedure is called by the process manager (section 13) to obtain
the message destination information for a named peripheral channel. Its
specification is exactly the same as that for the organisational command

LOOK.UP.PROCESS.
~S13) HELD (DEVICE.NO, REASON)
~BThis procedure is called by the input / output manager
(section 7) to inform the configuration manager that a particular
device has been switched into the HELD state. The REASON parameter
indicates the reason for the state change, as follows:~
~
   1   Device has been switched OFF~
   2   Device has been configured OUT by the operator~
   3   Device has given a TRANSFER FAIL.~

~S14) READY (DEVICE NO)
~BThis procedure is called by the input / output manager (section 7)
to inform the configuration manager that a particular device has
been made operable by the operator (using the ON or IN button).
~S15) PERI.NAME
~BThis data structure is declared and initialised externally, in the
appendix configuration module, to define the process names associated
with peripheral channels.
~S16) CONFIG.TABLE
~BThis data structure is declared and initialised externally, in the
appendix configuration module, to define the peripheral configuration
for the system.
~S17) PERI.BUFF.VA
~BThis gives the virtual address (byte units) of the start of the
core resident peripheral buffer area. Peripheral buffers are allocated
by the configuration manager starting from this address.
~S18) PERI.BUFF.RA
~BThis gives the real address corresponding to PERI.BUFF.VA.
~S1~O3. Implementation
~S1~O3.1 Outline of Operation
~BIn this version, the devices attached to the system
are dynamically configured, using the information available in the
CONFIG file, or made available by the operator. The initial configuration
is done by the SET UP task.
The HELD procedure tries to re-start a device on transfer
failure, otherwise does nothing. The READY procedure re-starts the specified
device.
~S1~O3.2 Data Structures
~
~T% 27
~
PERI.NAME~IA vector, indexed by Peripheral channel number, giving the process
name associated with this peripheral channel.~
CONFIG.TABLE~IA vector, indexed by Device number, giving the characteristics of
the
device attached to each socket. Each entry contains:~
   :LOGICAL.DEVICE.MODE~IHolds three different attributes:
 the type of the device (least significant 8 bits),
the logical device class (middle 8 bits), and
the peripheral channel associated with the device
(bits 16 to 23) (see section 7, CONNECT).~
   :PHYSICAL.DEVICE.ID~IThis field holds the actual device type (high
byte), and the device number within that type (low byte).~
   :PHYSICAL.DEVICE.MODE~ITis field contains device-dependent software
(least sig. 8 bits) and hardware parameters
 (next 10 bits) (see section 7, CONNECT).~
~S1~O3.3 Special Notes
~BNone.
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                SYS193
~V9 -1
~F
@TITLE SYS19(3,10)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
CONFIGURATION MANAGER
(STATIC VERSION)
@BOX 4.0
CMD1 ROUTE
CMD2 LOOK UP PERI
CMD3 HELD
CMD4 DISCONNECT
CMD5 SET PERIPHERAL
CMD6 REROUTE PERI
CMD7 CONFIG
TSK1 INIT DEV TASK
@BOX 6.0
END
@BOX 1.1
#SYS19/1
MODULE SYS19 (ROUTE, LOOK.UP.PERI, HELD, DISCONNECTED,
   SET.PERIPHERAL, REROUTE.PERI, CONFIG, INIT.DEV.TASK);
@BOX 2.1
TYPE CONFIG.INFO IS
   LOGICAL32 LOGICAL.DEV.ID, PHYSICAL.DEV.ID, PHYSICAL.DEV.MODE, PAIR.DEV.NO;
TYPE REROUTE.INFO.TYPE IS
   INTEGER DEST.SPN, SPN, PID, CH;
@BOX 3.1
*GLOBAL 6;
REROUTE.INFO.TYPE [NO.OF.PERI.REROUTES] REROUTE.INFO;
@BOX 4.1
::*INIT %7000;
*CODE 17;
PSPEC ROUTE (ADDR [INTEGER]);
PSPEC LOOK.UP.PERI (LOGICAL64);
   #SYSCMD19.1
   #SYSCMD19.2
*CODE 18;
PSPEC HELD (INTEGER, LOGICAL);
PSPEC DISCONNECTED (INTEGER, LOGICAL, ADDR [LOGICAL8], INTEGER);
   #SYSCMD19.3
   #SYSCMD19.4
*CODE 21;
LSPEC SET.PERIPHERAL (INTEGER, LOGICAL64, INTEGER);
LSPEC REROUTE.PERI (INTEGER, INTEGER, INTEGER, INTEGER, INTEGER);
LSPEC CONFIG (INTEGER, LOGICAL, INTEGER, INTEGER, LOGICAL, LOGICAL, LOGICAL);
   #SYSCMD19.5
   #SYSCMD19.6
   #SYSCMD19.7
*CODE 4;
PSPEC INIT.DEV.TASK ();
   #SYSTSK19.1
@BOX 5.1
*CODE 7;
SYS20.SET.TASK (SYS20.INIT.DEV.TASK, 0);
@BOX 6.1
*END
@END
@TITLE SYS19/1(3,10)
@COL 1S-2R-3R-4R
@FLOW 1-2-3-4
@BOX 1.0
OTHER MODULES REFERENCED
@BOX 4.0
SECTION 7 I/O AND COMMUNICATIONS MANAGEMENT
SECTION 20 PROCESS ZERO
@BOX 1.1
::EXTERNAL ENVIRONMENT
@BOX 2.1
IMPORT LITERAL NO.OF.DEVICES, NO.OF.PERI.CHANNELS, NO.OF.PERI.PROCS,
   CONFIG.SIZE, PAGED.DATA.SEG, PAGED.DATA.MAPPED.SEG, NO.OF.PERI.REROUTES,
   PERI.BUFF.VA, PERI.BUFF.RA, PERI.BUFF.SIZE, NO.OF.P.DEV.TYPES,
   NO.OF.DEVICE.CLASSES, NO.OF.PRESET.DEVICES;
LOGICAL32 [CONFIG.SIZE] CONFIG.TABLE;
LOGICAL64 [NO.OF.PERI.PROCS] PERI.NAME;
LOGICAL [NO.OF.PERI.PROCS] PERI.SPN;
INTEGER [NO.OF.P.DEV.TYPES] DEVICES.PER.P.DEV.TYPE;
@BOX 4.1
TYPE ADDRESS8 IS ADDR [LOGICAL8] ADDRESS;
PSPEC SYS07.RETURN.DOC (INTEGER, ADDR ADDRESS8, ADDR INTEGER);
PSPEC SYS07.CONNECT (INTEGER, LOGICAL, INTEGER, ADDR, LOGICAL32,
   LOGICAL, LOGICAL, LOGICAL, INTEGER);
PSPEC SYS07.DISCONNECT (INTEGER);
PSPEC SYS07.RESTART (INTEGER);
PSPEC SYS13.CHECK.PRIV ();
PSPEC MAP (INTEGER, INTEGER, INTEGER);
PSPEC SYS14.CMD.MAP (INTEGER, INTEGER);
PSPEC RELEASE.SEGMENT (INTEGER);
PSPEC SYS15.SET.PERI.CH.STATUS (INTEGER, LOGICAL, INTEGER, INTEGER);
IMPORT LITERAL SYS20.INIT.DEV.TASK;
PSPEC SYS20.SET.TASK (INTEGER, INTEGER);
ADDR PW0, PW1, PW2, PW3;
@END
@TITLE SYSCMD19.1(3,10)

@COL 1S-2T-3R-4F

@FLOW 1-2REROUTE-3-4
@FLOW 2YES-4

@BOX 1.0
ROUTE (DESTINATION);
@BOX 2.0
STRAIGHT THROUGH?
@BOX 3.0
CHANGE DESTINATION
@BOX 4.0
END
@BOX 1.1
PROC ROUTE (DEST);
INTEGER I;
@BOX 2.1
-1 => I;
WHILE 1 +> I < NO.OF.PERI.REROUTES AND
   DEST.SPN OF REROUTE.INFO [I] /= DEST^ [0] DO OD
IF I >= NO.OF.PERI.REROUTES
@BOX 3.1
SELECT REROUTE.INFO [I];
SPN => DEST^ [0];
PID => DEST^ [1];
CH => DEST^ [2];
@BOX 4.1
END
@END
@TITLE SYSCMD19.2(3,10)
@COL 1S-2T-3R-4F
@COL 5R
@ROW 3-5
@FLOW 1-2OK-3-4
@FLOW 2NOT FOUND-5-4
@BOX 1.0
LOOK UP PERI (NAME)
@BOX 2.0
SEARCH FOR NAME IN
PERIPHERAL NAME TABLE
@BOX 3.0
RETURN PERIPHERAL
CHANNEL IDENTIFICATION
@BOX 4.0
END
@BOX 5.0
SET FAULT REASON -33
(NAME NOT FOUND)
@BOX 1.1
PROC LOOK.UP.PERI (NAME);
INTEGER PROC.NO;
SYS14.CMD.MAP (PAGED.DATA.SEG, PAGED.DATA.MAPPED.SEG);
@BOX 2.1
-1 => PROC.NO;
WHILE 1 +> PROC.NO /= NO.OF.PERI.PROCS
   AND PERI.NAME [PROC.NO] /= NAME DO OD
IF PROC.NO = NO.OF.PERI.PROCS
@BOX 3.1
PERI.SPN [PROC.NO] => PW1 => PW2;
8 => PW3;
@BOX 4.1
END
@BOX 5.1
-33 => PW0;
@END
@TITLE SYSCMD19.3(3,10)
@COL 1S-2T-3R-4F
@FLOW 1-2TRANSFER FAIL-3-4
@FLOW 2OTHER-4
@BOX 1.0
HELD (DEVICE NO, REASON)
@BOX 2.0
CHECK REASON FOR
DEVICE STATE CHANGE
@BOX 3.0
RESTART THE DEVICE
@BOX 4.0
END
@BOX 1.1
PROC HELD (DEV.NO, REASON);
ADDRESS8 HDR;
INTEGER SEG;
@BOX 2.1
IF REASON & %20 /= 0
@BOX 3.1
SYS07.RETURN.DOC (DEV.NO, ^HDR, ^SEG);
RELEASE.SEGMENT (SEG);
SYS07.RESTART (DEV.NO);
@BOX 4.1
END
@END
@TITLE SYSCMD19.4(3,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DISCONNECTED (DEVICE NO, REASON, HEADER, SEGMENT)
@BOX 2.0
RELEASE SEGMENT (SEGMENT)
NO OTHER ACTION IN THIS VERSION
@BOX 3.0
END
@BOX 1.1
PROC DISCONNECTED (DEV.NO, REASON, HEADER, SEGMENT);
@BOX 2.1
RELEASE.SEGMENT (SEGMENT);
@BOX 3.1
END
@END
@TITLE SYSCMD19.5(3,10)

@COL 6R
@COL 1S-2T-3T-4R-5F

@ROW 6-4

@FLOW 1-2PRIVILEGED-3VALID-4-5
@FLOW 2UNPRIVILGED-5
@FLOW 3INVALID-6-5

@BOX 1.0
SET PERIPHERAL (ENTRY NUMBER, PERIPHERAL NAME, SPN)
@BOX 2.0
IS CALLING PROCESS UNPRIVILEGED?
@BOX 3.0
INVALID ENTRY NUMBER?
@BOX 4.0
INSERT ENTRIES
@BOX 5.0
END
@BOX 6.0
SET FAULT STATUS -80
(INVALID SET UP PARAMETER)
@BOX 1.1
PROC SET.PERIPHERAL (ENTRY, P.NAME, SPN);
0 => PW0;
SYS14.CMD.MAP (PAGED.DATA.SEG, PAGED.DATA.MAPPED.SEG);
@BOX 2.1
SYS13.CHECK.PRIV ();
IF PW0 /= 0
@BOX 3.1
IF ENTRY < 0 OR ENTRY >= NO.OF.PERI.PROCS
@BOX 4.1
P.NAME => PERI.NAME [ENTRY];
SPN => PERI.SPN [ENTRY];
@BOX 5.1
END
@BOX 6.1
-80 => PW0;
@END
@TITLE SYSCMD19.6(3,10)

@COL 6R
@COL 1S-2T-3T-4R-5F

@ROW 6-4

@FLOW 1-2PRIVILEGED-3VALID-4-5
@FLOW 2UNPRIVILGED-5
@FLOW 3INVALID-6-5

@BOX 1.0
REROUTE PERI (ENTRY NUMBER, PERIPHERAL CHANNEL, NEW SPN, NEW PID, NEW CHANNEL)
@BOX 2.0
IS CALLING PROCESS UNPRIVILEGED?
@BOX 3.0
INVALID CHANNEL NUMBER?
@BOX 4.0
INSERT ENTRIES
@BOX 5.0
END
@BOX 6.0
SET FAULT STATUS -11
(ILLEGAL CHANNEL NUMBER)
@BOX 1.1
PROC REROUTE.PERI (ENTRY, PERI.CH, NEW.SPN, NEW.PID, NEW.CH);
0 => PW0;
@BOX 2.1
SYS13.CHECK.PRIV ();
IF PW0 /= 0
@BOX 3.1
IF ENTRY < 0 OR ENTRY >= NO.OF.PERI.REROUTES
@BOX 4.1
SELECT REROUTE.INFO [ENTRY];
PERI.CH => DEST.SPN;
NEW.SPN => SPN;
NEW.PID => PID;
NEW.CH => CH;
@BOX 5.1
END
@BOX 6.1
-11 => PW0;
@END
@TITLE SYSCMD19.7(3,10)

@COL 9R
@COL 1S-12T-2T-5T-6T-7T-10R-3R-11N-4F
@COL 14N-8R-13N

@ROW 12-14
@ROW 9-10-8
@ROW 11-13

@FLOW 1-12PRIVILEGED-2I/O MANAGER-5NO-6NO-7NO-10-3-11-4
@FLOW 12UNPRIVILEGED-14-13-11
@FLOW 2OTHERS-9-11
@FLOW 5YES-8-13-11
@FLOW 6YES-8
@FLOW 7YES-8

@BOX 1.0
CONFIG (DEVICE NO, PHYSICAL ID, PAIR DEVICE NO, CHANNEL, LOGICAL MODE,
   DRIVER MODE, LINE PARS )
@BOX 2.0
FIND THE SYSTEM RESPONSIBLE FOR
SERVICING THE DEVICE?
@BOX 3.0
CONFIGURE THE DEVICE IN
@BOX 4.0
END
@BOX 5.0
DEVICE OUT OF RANGE?
@BOX 6.0
WRONG LOGICAL ATTRIBUTES?
@BOX 7.0
WRONG HADWARE ID OR MODE?
@BOX 8.0
RETURN FAULT STATUS -91
(ILLEGAL I/O CONFIGURATION PARAMETER)
@BOX 9.0
OTHERS
@BOX 10.0
DISCONNECT THE DEVICE
@BOX 12.0
IS CALLING PROCESS UNPRIVILEGED?
@BOX 1.1
PROC CONFIG (DEV.NO, PHYSICAL.ID, PAIR.NO, CHANNEL, LOGICAL.MODE,
   PHYSICAL.MODE, PHYSICAL.PARS );
INTEGER DEV.TYPE, TEMP;
0 => PW0;
@BOX 2.1
IF PHYSICAL.ID ->> 8 & %FF => DEV.TYPE < 0 OR DEV.TYPE
   >= NO.OF.P.DEV.TYPES
@BOX 3.1
SYS07.CONNECT (DEV.NO, LOGICAL.MODE, CHANNEL, DEV.NO * PERI.BUFF.SIZE
   => TEMP + PERI.BUFF.VA, TEMP + PERI.BUFF.RA, PHYSICAL.ID
   & %FFFF, PHYSICAL.MODE & %FF, PHYSICAL.PARS & %FFFF, PAIR.NO);
@BOX 4.1
END
@BOX 5.1
IF DEV.NO < 0 OR DEV.NO >= NO.OF.DEVICES OR
   PAIR.NO >= NO.OF.DEVICES
@BOX 6.1
IF %FFFF &> LOGICAL.MODE ->> 8 =>
   TEMP < 0 OR TEMP >= NO.OF.DEVICE.CLASSES OR
   CHANNEL < 0 OR CHANNEL >= NO.OF.PERI.CHANNELS
@BOX 7.1
IF PHYSICAL.ID & %FF => TEMP < 0 OR
   TEMP >= DEVICES.PER.P.DEV.TYPE [DEV.TYPE]
@BOX 8.1
-91 => PW0;
@BOX 9.1
::OTHERS
@BOX 10.1
SYS07.DISCONNECT (DEV.NO);
@BOX 12.1
SYS13.CHECK.PRIV ();
IF PW0 /= 0
@END
@TITLE SYSTSK19.1(3,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
INIT DEV TASK
@BOX 2.0
CONNECT DEVICES USING PARAMETERS FROM
CONFIGURATION TABLE
@BOX 3.0
END
@BOX 1.1
PROC INIT.DEV.TASK;
INTEGER TEMP, DEV.NO;
ADDR [CONFIG.INFO] CONFIG.ADDR;
MAP (PAGED.DATA.SEG, PAGED.DATA.MAPPED.SEG, 0);
@BOX 2.1
MAKE (CONFIG.INFO, NO.OF.PRESET.DEVICES, BYTE (^CONFIG.TABLE))
   => CONFIG.ADDR;
FOR DEV.NO < NO.OF.PRESET.DEVICES DO
   SELECT CONFIG.ADDR^ [DEV.NO];
   SYS07.CONNECT (DEV.NO, LOGICAL.DEV.ID & %FFFF, LOGICAL.DEV.ID ->> 16,
      DEV.NO * PERI.BUFF.SIZE => TEMP + PERI.BUFF.VA, TEMP + PERI.BUFF.RA,
      PHYSICAL.DEV.ID, PHYSICAL.DEV.MODE & %FF, PHYSICAL.DEV.MODE ->> 8,
      PAIR.DEV.NO);
OD
@BOX 3.1
END
@END

