Google
 

Trailing-Edge - PDP-10 Archives - BB-P363B-SM_1985 - mcb/mcbda/mdanml.bli
There is 1 other file named mdanml.bli in the archive. Click here to see a list.
MODULE MDANML (					!Display the NML data bases
		IDENT = '001020',
		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 NML data bases
!
! ENVIRONMENT: ANY
!
! AUTHOR: ALAN D. PECKHAM	, CREATION DATE: 1-Oct-81
!
! MODIFIED BY:
!
! 	, : VERSION
! 01	- Creation.
! 02    - Analyze running condition of NML through the TCB.
!         Data base analysis:
!           Current task
!           Task list
!           Memory pool
!--

!
! TABLE OF CONTENTS:
!

FORWARD ROUTINE
    NMLMCB : NOVALUE;				!

!
! INCLUDE FILES:
!

LIBRARY 'MDACOM';				!MDA common definitions.

LIBRARY 'RSXLIB';				!RSX definitions.

LIBRARY 'MCBLIB';				!MCB definitions.

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

EXTERNAL ROUTINE
    BITLS : NOVALUE,				!IDENTIFY BITS AND EDIT INTO ASCII
    BYTSM : NOVALUE,				!IDENTIFY AND EDIT BYTE INTO ASCII
    GETWRD,
    GETBYT,
    MAPKNL : NOVALUE,				!Map to kernel space.
    MAPTSK,					!Map to given task.
    MAPUSR : novalue,
    SBTTL : NOVALUE,				!
    SKIP : novalue,
    VMADMP : novalue,
    WINDOW : novalue;

EXTERNAL
    FLAGS : BITVECTOR [M_MAX_BITS];
GLOBAL ROUTINE NMLMCB : NOVALUE =

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

    BEGIN

    LOCAL
	ADR;

    SBTTL (CH$ASCIZ ('NML DATA BASE'));

    IF NOT SYMBOL_TABLE ('RSX11S') THEN RETURN;

    !+
    ! Find NMLMCB's TCB address and map to its task image.
    !-

    BEGIN

    LOCAL
	ENTRY_COUNT,
	TCB_ADDRESS;

    MAPKNL ();
    ADR = FALSE;
    ENTRY_COUNT = RSX_MAX_STD;
    TCB_ADDRESS = SYMBOL ($TSKHD) - FL$OFFSET (T_TCBL);

    WHILE GETWRD ((TCB_ADDRESS = GETWRD (.TCB_ADDRESS + FL$OFFSET (T_TCBL))) + FL$OFFSET (T_TCBL)) NEQ 0 DO
	BEGIN

	IF (ENTRY_COUNT = .ENTRY_COUNT - 1) LSS 0
	THEN
	    RETURN PUTLN (1,
		    CH$ASCIZ (WARNING,
			'TCB LIST TOO LONG'));

	IF (GETWRD (.TCB_ADDRESS + FL$OFFSET (T_NAM) + 0) eql RAD50_WORD ('NML'))
            AND (GETWRD (.TCB_ADDRESS + FL$OFFSET (T_NAM) + 2) EQL RAD50_WORD ('MCB'))
	THEN
	    EXITLOOP (ADR = TRUE);

	END;

    IF NOT .ADR THEN RETURN;

    IF FL$SET (GETWRD (.TCB_ADDRESS + FL$OFFSET (T_STAT)), TS_OUT)
    THEN
	RETURN (PUTLN (1,
		CH$ASCIZ (FATAL,
		    'TASK "NMLMCB" IS NOT IN MEMORY')));

    IF NOT MAPTSK (.TCB_ADDRESS)
    THEN
	RETURN (MAPKNL ();
	    PUTLN (1,
		CH$ASCIZ (FATAL,
		    'CANNOT MAP TO TASK "NMLMCB"')));

    IF NOT SYMBOL_TABLE ('RSX11S', 'CEXCOM', 'NML') THEN RETURN;

    MAPKNL ();
    begin                               ! Display Task information

    local
        R : vector [9];

    bind
        PC = R [6],
        PS = R [7],
        R0 = R [0],
        R1 = R [1],
        R2 = R [2],
        R3 = R [3],
        R4 = R [4],
        R5 = R [5],
        SP = R [8];

    !
    ! Find the registers, etc.
    !

    if (GETWRD (SYMBOL ('$HEADR')) neq 0) and
       (GETWRD (SYMBOL ('$TKTCB')) eql .TCB_ADDRESS)
    then
        begin
        SP = GETWRD (SYMBOL ('.USRSP'));
        ADR = SYMBOL ('$STACK');
        end
    else
        begin
        ADR = GETWRD (GETWRD (.TCB_ADDRESS + FL$OFFSET (T_PCB)) + SYMBOL ('P.HDR'));
        SP = GETWRD (.ADR);
        ADR = GETWRD (.ADR + FL$OFFSET (H_GARD));
        end;

    decr I from 7 to 0 do
        R [.I] = GETWRD (ADR = .ADR - 2);

    if FL$SET (GETWRD (.TCB_ADDRESS + FL$OFFSET (T_STAT)), TS_EXE)
    then
        PUTLN (1, CH$ASCIZ (WARNING, 'THE NMLMCB TASK IS HALTED'));

    !
    ! Display the registers.
    !

    PUTLN (2, CH$ASCIZ ('VOLATILE REGISTERS:'));
    PUTLN (1, CH$ASCIZ ('%4SPC = %P  PS = %P  SP = %P'), .PC, .PS, .SP);
    PUTLN (1, CH$ASCIZ ('%4SR0 = %P  R1 = %P  R2 = %P  R3 = %P  R4 = %P  R5 = %P'),
           .R0, .R1, .R2, .R3, .R4, .R5);

    MAPUSR ();
    PUTLN (2, CH$ASCIZ ('PC CONTEXT:'));
    WINDOW ((if .PC lssu 80 then 0 else ((.PC - 80) and not 15)), ((.PC + 80) and not 15));

    end;

    !
    ! Which task is running?
    !

    if (ADR = GETWRD (SYMBOL ('CURTSK'))) neq 0
    then
        begin

        local
            PTR,
            TMP,
            TNAM : CH$SEQUENCE (16);

        PTR = ch$ptr (TNAM);
        TMP = 0;

        do
            begin

            local
                CHR;

            if (CHR = GETBYT (.ADR + SYMBOL ('TB.NAM') + .TMP)) eql 0
            then exitloop;

            ch$wchar_a (.CHR, PTR);
            TMP = .TMP + 1;
            end
        while .TMP lss 16;

        PUTLN (2, CH$ASCIZ ('CURRENT TASK: %P  NAME: %#A'),
               .ADR, .TMP, ch$ptr (TNAM));
        end;

    !
    ! Display the task list
    !

    begin

    bind                                ! the list head is
        MEMBOT = SYMBOL (MEMBOT),       ! not in dynamic memory.
        TB_TASK_QUEUE = SYMBOL ('TB.QUE');

    ! find the beginning of the task list.

    do (ADR = GETWRD (.ADR + TB_TASK_QUEUE) - TB_TASK_QUEUE) until lss16 (.ADR, MEMBOT);

    PUTLN (2, CH$ASCIZ ('NML TASK LIST:'));

    while gtr16 ((ADR = GETWRD (.ADR + TB_TASK_QUEUE) - TB_TASK_QUEUE), MEMBOT) do
        begin
        begin

        local
            PTR,
            TMP,
            TNAM : CH$SEQUENCE (16);

        PTR = ch$ptr (TNAM);
        ch$fill (%c' ', 16, .PTR);
        TMP = 0;

        do
            begin

            local
                CHR;

            if (CHR = GETBYT (.ADR + SYMBOL ('TB.NAM') + .TMP)) eql 0
            then exitloop;

            ch$wchar_a (.CHR, PTR);
            TMP = .TMP + 1;
            end
        while .TMP lss 16;

        PUTLN (1, CH$ASCIZ ('  TASK: %16A  ADDRESS: %P'),
               ch$ptr (TNAM), .ADR);
        end;
        PUTLN (0, CH$ASCIZ ('%4SSTART ADDRESS: %P  ABORT ADDRESS: %P'),
               GETWRD (.ADR + SYMBOL ('TB.STR')), GETWRD (.ADR + SYMBOL ('TB.ABT')));
        PUTLN (0, CH$ASCIZ ('%4SLAST SP: %P'), GETWRD (.ADR + SYMBOL ('TB.CTX')));
        end;

    end;

    !
    ! Display the memory pool
    !

    begin

    field
        MB_QUEUE_INFO = [0, 0, 16, 0],
        MB_INDEX = [3, 0, 16, 0],
        MB_TAG = [4, 0, 1, 0],
        MB_SELF = [4, 1, 1, 0],
        MB_PARENT = [4, 2, 1, 0],
        MB_TASK = [5, 0, 16, 0],
        MB_LIMIT = [6, 0, 16, 0],
        MB_ALLOCATION = [7, 0, 16, 0],
        MB_DATA = [8, 0, 16, 0];

    literal
        MB_AVAILABLE = 0,
        MB_LEFT = 0,
        MB_LENGTH = 9;

    local
        ASL_LST,
        BUDDY_INDEX,
        SIZE,
        SIZES;

    SIZE = SYMBOL ('BLKSIZ');
    BUDDY_INDEX = SYMBOL ('BLKBDY');
    ASL_LST = SYMBOL ('BLKLST');
    SIZES = (.BUDDY_INDEX - .SIZE)^-1;

    !
    ! Go through the memory pool and isolate the blocks
    !

    begin

    local
        MEM_ADR,
        MEM_TOP;

    MEM_ADR = SYMBOL ('MEMBOT');
    ADR = SYMBOL ('MEMTOP');
    MEM_TOP = GETWRD (.ADR);
    PUTLN (2, CH$ASCIZ ('MEMORY POOL FROM %P TO %P, USED TO %P'),
           .MEM_ADR, .ADR, .MEM_TOP);
    PUTLN (2, CH$ASCIZ ('MEMORY BLOCKS:'));

    if GEQ16 (.MEM_TOP, .ADR) then MEM_TOP = .ADR;

    while LSS16 (.MEM_ADR, .MEM_TOP) do
        begin

        bind
            MBL = CH$ASCII ('L'),
            MBR = CH$ASCII ('R');

        local
            CNT;

        CNT = GETWRD (.SIZE + GETBYT (.MEM_ADR + FL$OFFSET (MB_INDEX))^1);
        ADR = GETWRD (.MEM_ADR + FL$OFFSET (MB_TAG));

        PUTLN (1, (if FL$SET (.ADR, MB_TAG)
                   then CH$ASCIZ ('  BLOCK ADDRESS: %P  LENGTH: %O  ALLOCATED')
                   else CH$ASCIZ ('  BLOCK ADDRESS: %P  LENGTH: %O  AVAILABLE')), .MEM_ADR, .CNT);
!       PUTLN (0, CH$ASCIZ ('%4SSELF: %1A  PARENT: %1A'),
!              (if FL$SET (.ADR, MB_SELF) then MBR else MBL),
!              (if FL$SET (.ADR, MB_PARENT) then MBR else MBL));

        if (ADR = GETWRD (.MEM_ADR + FL$OFFSET (MB_TASK))) neq 0
        then
            begin

            local
                PTR,
                TMP,
                TNAM : CH$SEQUENCE (16);

            PTR = ch$ptr (TNAM);
            ch$fill (%c' ', 16, .PTR);
            TMP = 0;

            do
                begin

                local
                    CHR;

                if (CHR = GETBYT (.ADR + SYMBOL ('TB.NAM') + .TMP)) eql 0
                then exitloop;

                ch$wchar_a (.CHR, PTR);
                TMP = .TMP + 1;
                end
            while .TMP lss 16;

            PUTLN (0, CH$ASCIZ ('%4STASK: %16A  ADDRESS: %P'), ch$ptr (TNAM), .ADR);
            end
        else

            if FL$SET (GETWRD (.MEM_ADR + FL$OFFSET (MB_TAG)), MB_TAG)
            then
                PUTLN (0, CH$ASCIZ ('%4SSYSTEM BLOCK            ADDRESS: %P'), .ADR);

        PUTLN (0, CH$ASCIZ ('%4SDATA ADDRESS: %P  LENGTH: %O'),
               (.MEM_ADR + FL$OFFSET (MB_DATA)), GETWRD (.MEM_ADR + FL$OFFSET (MB_ALLOCATION)));

        if .FLAGS [M_CEX_DUMP]
        then
            begin
            SKIP (1);
            VMADMP (.MEM_ADR, .MEM_ADR, .MEM_ADR + .CNT);
            end;

        MEM_ADR = .MEM_ADR + .CNT;
        end;

    end;
    end;
    MAPKNL ();
    END;
    END;					!Of routine NMLMCB

END						!Of MODULE

ELUDOM