Google
 

Trailing-Edge - PDP-10 Archives - BB-P363B-SM_1985 - mcb/mcbda/mdapcb.bli
There is 1 other file named mdapcb.bli in the archive. Click here to see a list.
MODULE PCBS (					!Display Partition Control Block information
		IDENT = '003010',
		LANGUAGE (BLISS16, BLISS36)
		) =
BEGIN
!
!                    COPYRIGHT (c) 1980, 1981, 1982
!                    DIGITAL EQUIPMENT CORPORATION
!                        Maynard, Massachusetts
!
!     This software is furnished under a license and may  be  used
!     and copied only in accordance with the terms of such license
!     and with the inclusion of the above copyright notice.   This
!     software  or any other copies thereof may not be provided or
!     otherwise made available to any other person.  No  title  to
!     and ownership of the software is hereby transferred.
!
!     The information  in  this  software  is  subject  to  change
!     without  notice  and should not be construed as a commitment
!     by DIGITAL EQUIPMENT CORPORATION.
!
!     DIGITAL assumes no responsibility for the use or reliability
!     of  its  software  on  equipment  which  is  not supplied by
!     DIGITAL.
!

!++
! FACILITY: MCBDA - MCB Crash Dump Analyzer
!
! ABSTRACT:
!
!	Display the Partition Control Blocks in detail.
!
! ENVIRONMENT: ANY
!
! AUTHOR: ALAN D. PECKHAM	, CREATION DATE: 19-MAY-79
!
! MODIFIED BY:
!
! 	Alan D. Peckham, 9-Jul-80: VERSION 3
! 01	- Change RSX symbol references
!--

!
! TABLE OF CONTENTS:
!

FORWARD ROUTINE
    DMPDEV : NOVALUE,				!
    DMPNAM : NOVALUE,				!
    PCBS : NOVALUE,				!Display the PCBs.
    PUT_ATTACHMENTS : NOVALUE,
    PUT_PARTITION : NOVALUE,
    PUT_WAIT_QUEUE : NOVALUE;

!
! INCLUDE FILES:
!

LIBRARY 'MDACOM';				!MDA common definitions.

LIBRARY 'RSXLIB';				!RSX definitions.

!
! MACROS:
!
!	None
!
! EQUATED SYMBOLS:
!
!	None
!
! OWN STORAGE:
!
!
! EXTERNAL REFERENCES:
!

EXTERNAL ROUTINE
    BITLS : NOVALUE,				!IDENTIFY BITS AND EDIT INTO ASCII
    BYTSM : NOVALUE,				!IDENTIFY AND EDIT BYTE INTO ASCII
    SBTTL : NOVALUE,				!SET LIST FILE SUB-TITLE
    GETBYT,					!GET A BYTE FROM THE DUMP FILE
    GETWRD,					!GET A WORD FROM THE DUMP FILE
    VMADMP : NOVALUE,
    SKIP : NOVALUE,				!Skip some lines.
    $C5TA;					!Convert RAD50 to ASCII.

EXTERNAL
    FLAGS : BITVECTOR [M_MAX_BITS];
ROUTINE DMPDEV (BUF_PTR_ADR, PAT_PTR_ADR, PRM_LST_ADR_ADR) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! The next parameters are:
!	UCB_ADDRESS
!
! FORMAL PARAMETERS:
!
!	..BUF_PTR_ADR				!Pointer to output buffer.
!	..PAT_PTR_ADR				!Pointer to pattern string.
!	..PRM_LST_ADR_ADR			!Pointer to next parameter.
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    LOCAL
	PRM_LST : REF VECTOR,
	BUF_PTR_INI,
	UCB_ADDRESS;

    PRM_LST = ..PRM_LST_ADR_ADR;
    UCB_ADDRESS = .PRM_LST [0];
    .PRM_LST_ADR_ADR = PRM_LST [1];
    BUF_PTR_INI = ..BUF_PTR_ADR;

    IF .UCB_ADDRESS NEQ 0
    THEN
	BEGIN

	LOCAL
	    DCB_ADDRESS,
	    UNIT;

	EXTERNAL ROUTINE
	    $CBOMG;

	DCB_ADDRESS = GETWRD (.UCB_ADDRESS + FL$OFFSET (U_DCB));
	CH$WCHAR_A (GETBYT (.DCB_ADDRESS + FL$OFFSET (D_NAM) + 0), .BUF_PTR_ADR);
	CH$WCHAR_A (GETBYT (.DCB_ADDRESS + FL$OFFSET (D_NAM) + 1), .BUF_PTR_ADR);
	UNIT = ((.UCB_ADDRESS - GETWRD (.DCB_ADDRESS + FL$OFFSET (D_UCB)))/GETWRD (.DCB_ADDRESS + FL$OFFSET (
		D_UCBL))) + GETBYT (.DCB_ADDRESS + FL$OFFSET (D_UNIT));
	$CBOMG (.BUF_PTR_ADR, .UNIT, 0);
	END
    ELSE
	.BUF_PTR_ADR = CH$MOVE (4, CH$ASCIZ ('NONE'), ..BUF_PTR_ADR);

    CH$DIFF (..BUF_PTR_ADR, .BUF_PTR_INI)
    END;					!End of DMPDEV
ROUTINE DMPNAM (BUF_PTR_ADR, PAT_PTR_ADR, PRM_LST_ADR_ADR) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! The next parameters are:
!	UCB_ADDRESS
!
! FORMAL PARAMETERS:
!
!	..BUF_PTR_ADR				!Pointer to output buffer.
!	..PAT_PTR_ADR				!Pointer to pattern string.
!	..PRM_LST_ADR_ADR			!Pointer to next parameter.
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    LOCAL
	BASE_ADDRESS,
	OFFSET,
	PRM_LST : REF VECTOR;

    PRM_LST = ..PRM_LST_ADR_ADR;
    BASE_ADDRESS = .PRM_LST [0];
    OFFSET = .PRM_LST [1];
    .PRM_LST_ADR_ADR = PRM_LST [2];

    IF .BASE_ADDRESS NEQ 0
    THEN
	BEGIN
	$C5TA (.BUF_PTR_ADR, GETWRD (.BASE_ADDRESS + .OFFSET + 0));
	$C5TA (.BUF_PTR_ADR, GETWRD (.BASE_ADDRESS + .OFFSET + 2));
	END
    ELSE
	.BUF_PTR_ADR = CH$MOVE (6, CH$ASCIZ ('      '), ..BUF_PTR_ADR);

    6
    END;					!End of DMPNAM
GLOBAL ROUTINE PCBS : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    LOCAL
	ENTRY_COUNT,
	PCB_ADDRESS;

    SBTTL (CH$ASCIZ ('PARTITION CONTROL BLOCKS'));

    IF NOT SYMBOL_TABLE ('RSX11S') THEN RETURN;

    ENTRY_COUNT = RSX_MAX_PCB;
    PCB_ADDRESS = SYMBOL ($PARHD) - FL$OFFSET (P_LNK);

    WHILE (PCB_ADDRESS = GETWRD (.PCB_ADDRESS + FL$OFFSET (P_LNK))) NEQ 0 DO
	BEGIN

	IF (ENTRY_COUNT = .ENTRY_COUNT - 1) LSS 0
	THEN
	    RETURN PUTLN (1,
		    CH$ASCIZ (WARNING,
			'TOO MANY PARTITION ENTRIES'));

	PUT_PARTITION (.PCB_ADDRESS);

	IF FL$SET (GETWRD (.PCB_ADDRESS + FL$OFFSET (P_STAT)), PS_SYS)
	THEN
	    BEGIN

	    LOCAL
		SUB_ADDRESS;

	    SUB_ADDRESS = .PCB_ADDRESS;

	    WHILE (SUB_ADDRESS = GETWRD (.SUB_ADDRESS + FL$OFFSET (P_SUB))) NEQ 0 DO
		BEGIN

		IF (ENTRY_COUNT = .ENTRY_COUNT - 1) LSS 0
		THEN
		    RETURN PUTLN (1,
			    CH$ASCIZ (WARNING,
				'TOO MANY PARTITION ENTRIES'));

		PUT_PARTITION (.SUB_ADDRESS);
		END;

	    END;

	END;

    END;					!End of PCBS
ROUTINE PUT_ATTACHMENTS (PCB_ADDRESS) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    LITERAL
	FE_PLA = 1^4;

    LOCAL
	ADR,
	ATT_ADDRESS;

    IF BIT_SET (GETWRD (SYMBOL ($FMASK)), FE_PLA) AND (GETWRD (.PCB_ADDRESS + FL$OFFSET (P_BLKS)) NEQ 0) AND ((
	ATT_ADDRESS = GETWRD (.PCB_ADDRESS + (ADR = SYMBOL ('P.ATT')))) NEQ 0) AND (GETWRD (.PCB_ADDRESS +
	    .ADR + 2) NEQ 0)
    THEN
	BEGIN

	LOCAL
	    ENTRY_COUNT;

	BIND
	    A_STAT_BITS = FIELDS_LIST ('AS.DEL', 'AS.EXT', 'AS.WRT', 'AS.RED');

	ENTRY_COUNT = RSX_MAX_ATD;
	PUTLN (2, CH$ASCIZ ('%6SATTACHMENT DESCRIPTORS:'));

	DO
	    BEGIN

	    IF (ENTRY_COUNT = .ENTRY_COUNT - 1) LSS 0
	    THEN
		RETURN PUTLN (1,
			CH$ASCIZ (WARNING,
			    'TOO MANY ATTACHMENT DESCRIPTORS'));

	    PUTLN (1,
		CH$ASCIZ ('%6SADDRESS   PARTITION   ATT TASK   A.PCBL   A.TCBL   PRI   IOC   MAP COUNT'));
	    PUTLN (0,
		CH$ASCIZ ('%6S-------   ---------   --------   ------   ------   ---   ---   ---------'));
	    PUTLN (0, CH$ASCIZ ('%6S%P     %@      %@    %P   %P   %D.   %D.      %D.'), .ATT_ADDRESS,
		DMPNAM, GETWRD (.ATT_ADDRESS + FL$OFFSET (A_PCB)), FL$OFFSET (P_NAM), DMPNAM,
		GETWRD (.ATT_ADDRESS + FL$OFFSET (A_TCB)), FL$OFFSET (T_NAM),
		GETWRD (.ATT_ADDRESS + FL$OFFSET (A_PCBL)), GETWRD (.ATT_ADDRESS + FL$OFFSET (A_TCBL)),
		GETBYT (.ATT_ADDRESS + FL$OFFSET (A_PRI)), GETBYT (.ATT_ADDRESS + FL$OFFSET (A_IOC)),
		GETBYT (.ATT_ADDRESS + FL$OFFSET (A_MPCT)));
	    PUTLN (1, CH$ASCIZ ('%6SSTATUS: %@'), BITLS, A_STAT_BITS,
		GETWRD (.ATT_ADDRESS + FL$OFFSET (A_STAT)));

	    IF .FLAGS [M_RSX_DUMP]
	    THEN
		BEGIN
		SKIP (1);
		VMADMP (0, .ATT_ADDRESS, .ATT_ADDRESS + A_LGTH^1);
		END;

	    END
	WHILE (ATT_ADDRESS = GETWRD (.ATT_ADDRESS + FL$OFFSET (A_PCBL))) NEQ 0;

	END;

    END;					!End of PUT_ATTACHMENTS
ROUTINE PUT_PARTITION (PCB_ADDRESS) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    LOCAL
	ADR;

    BIND
	P_STAT_BITS = FIELDS_LIST ('PS.OUT', 'PS.CKP', 'PS.CKR', 'PS.CHK', 'PS.FXD', 'PS.PER', 'PS.LIO',
		'PS.NSF', 'PS.COM', 'PS.PIC', 'PS.SYS', 'PS.DRV', 'PS.DEL');

    PUTLN (2, CH$ASCIZ ('PARTITION  ADDRESS  TYPE   MAIN    BASE    SIZE    TCB     PRO    PRI  IOC'));
    PUTLN (0, CH$ASCIZ ('---------  -------  ----  ------  ------  ------  ------  ------  ---  ---'));
    PUTLN (0, CH$ASCIZ (' %2R%12T%P   %4A  %2R%35T%P  %P  %P  %P  %D.%72T%D.'),
	GETWRD (.PCB_ADDRESS + FL$OFFSET (P_NAM) + 0), GETWRD (.PCB_ADDRESS + FL$OFFSET (P_NAM) + 2),
	.PCB_ADDRESS,
	(IF (ADR = GETWRD (.PCB_ADDRESS + FL$OFFSET (P_MAIN))) EQL .PCB_ADDRESS THEN CH$ASCII ('MAIN') ELSE
	    CH$ASCII ('SUB ')), GETWRD (.ADR + FL$OFFSET (P_NAM) + 0), GETWRD (.ADR + FL$OFFSET (P_NAM) + 2),
	GETWRD (.PCB_ADDRESS + FL$OFFSET (P_REL)), GETWRD (.PCB_ADDRESS + FL$OFFSET (P_BLKS)),
	GETWRD (.PCB_ADDRESS + FL$OFFSET (P_TCB)),
	(IF (ADR = SYMBOL ('P.PRO')) LSS SYMBOL ('P.LGTH') THEN GETWRD (.PCB_ADDRESS + .ADR) ELSE 0),
	GETBYT (.PCB_ADDRESS + FL$OFFSET (P_PRI)), GETBYT (.PCB_ADDRESS + FL$OFFSET (P_IOC)));
    PUTLN (1, CH$ASCIZ ('%4SSTATUS: %@'), BITLS, P_STAT_BITS, GETWRD (.PCB_ADDRESS + FL$OFFSET (P_STAT)));

    IF .FLAGS [M_RSX_DUMP]
    THEN
	BEGIN
	SKIP (1);
	VMADMP (0, .PCB_ADDRESS, .PCB_ADDRESS + SYMBOL ('P.LGTH'));
	END;

    IF .PCB_ADDRESS EQL GETWRD (.PCB_ADDRESS + FL$OFFSET (P_MAIN)) THEN PUT_WAIT_QUEUE (.PCB_ADDRESS);

    PUT_ATTACHMENTS (.PCB_ADDRESS);
    END;					!End of PUT_PARTITION
ROUTINE PUT_WAIT_QUEUE (PCB_ADDRESS) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    LOCAL
	ADR,
	TCB_ADDRESS;

    BIND
	T_ST2_BITS = FIELDS_LIST ('T2.AST', 'T2.DST', 'T2.CHK', 'T2.CKD', 'T2.BFX', 'T2.FXD', 'T2.TIO',
		'T2.CAF', 'T2.HLT', 'T2.ABO', 'T2.STP', 'T2.SPN', 'T2.WFR');

    IF ((TCB_ADDRESS = GETWRD (.PCB_ADDRESS + FL$OFFSET (P_WAIT))) NEQ 0) AND (GETWRD (.PCB_ADDRESS +
	    FL$OFFSET (P_WAIT) + 2) NEQ 0)
    THEN
	BEGIN

	LOCAL
	    ENTRY_COUNT;

	ENTRY_COUNT = RSX_MAX_WTQ;
	PUTLN (2, CH$ASCIZ ('%6SWAIT QUEUE:'));
	PUTLN (1, CH$ASCIZ ('%7STASK    TCB ADR    TI    T.PRI    STATE'));
	PUTLN (0, CH$ASCIZ ('%7S----    -------    --    -----    -----'));

	DO
	    BEGIN

	    IF (ENTRY_COUNT = .ENTRY_COUNT - 1) LSS 0
	    THEN
		RETURN PUTLN (1,
			CH$ASCIZ (WARNING,
			    'TOO MANY WAITING TASKS'));

	    PUTLN (0, CH$ASCIZ ('%6S%@   %P     %@ %D.        %@'), DMPNAM, .TCB_ADDRESS, FL$OFFSET (T_NAM),
		.TCB_ADDRESS, DMPDEV, GETWRD (.TCB_ADDRESS + FL$OFFSET (T_UCB)),
		GETBYT (.TCB_ADDRESS + FL$OFFSET (T_PRI)), BITLS, T_ST2_BITS,
		GETWRD (.TCB_ADDRESS + FL$OFFSET (T_ST2)));
	    END
	WHILE (TCB_ADDRESS = GETWRD (.TCB_ADDRESS + FL$OFFSET (T_LNK))) NEQ 0;

	END;

    END;					!End of PUT_WAIT_QUEUE
END						!End of module

ELUDOM