Annotation of xinu/sys/sizmem.s, revision 1.1

1.1     ! root        1: /* sizmem.s - sizmem */
        !             2: 
        !             3: #include <procreg.h>
        !             4: #include <conf.h>
        !             5: #include <mach.h>
        !             6: 
        !             7: /*----------------------------------------------------------------------------
        !             8:  *  sizmem  -- size memory, place highest valid address of an int in _maxaddr
        !             9:  *             assumption: executing on kernel stack, interrupts disabled
        !            10:  *----------------------------------------------------------------------------
        !            11: */
        !            12: 
        !            13: #define        HIGHADDR 0x20000000             /* highest address of int on VAX*/
        !            14:                                        /* (below device csr addresses) */
        !            15: #define        CONSDB  0x2000                  /* sizeof UVAXII console database */
        !            16:        .text
        !            17:        .align  1
        !            18:        .globl  sizmem
        !            19: sizmem:
        !            20:        .word   0x4                     /* save register 2              */
        !            21:        tstl    -(sp)                   /* allocate local for disable   */
        !            22:        pushal  -4(fp)                  /* address of local             */
        !            23:        calls   $1, _disable            /* disable interrupts           */
        !            24:        movl    lowcore+4, -(sp)        /* push old exception vector    */
        !            25:        bisl3   $1, $siztrap, lowcore+4 /* set exception vector to      */
        !            26:                                        /* catch memory exceptions      */
        !            27:                                        /* (with memory mapping         */
        !            28:                                        /* disabled, the VAX takes a    */
        !            29:                                        /* machine check exception)     */
        !            30:                                        /* NOTE: must handle mach. chk. */
        !            31:                                        /* on interrupt stack           */
        !            32:                                        /* (hence bits<1,0> == 01)      */
        !            33:        calls   $0, _ovfloff            /* disable int oflow exceptions */
        !            34:        clrl    r0                      /* r0 holds low address         */
        !            35:        movl    $HIGHADDR, r1           /* r1 = highest addr of an int  */
        !            36: sizloop:
        !            37:        cmpl    r0, r1                  /* see if low > high            */
        !            38:        jgtru   setsize                 /* yes: restore & return        */
        !            39:        addl3   r0, r1, r2              /* calculate midpoint           */
        !            40:        jcc     rotate                  /* if carry set, set low bit,   */
        !            41:        bisl2   $1, r2                  /* soon to be high bit          */
        !            42: rotate:
        !            43:        rotl    $-1, r2, r2             /* div by 2 by shifting right 1 */
        !            44:        bicl2   $3, r2                  /* address is multiple of 4     */
        !            45:        tstl    (r2)+                   /* reference what r2 points to  */
        !            46:                                        /* note: if exception taken, r2 */
        !            47:                                        /* is not incremented           */ 
        !            48:        movl    r2, r0                  /* mid caused no exception --   */
        !            49:                                        /* set low to mid address + 4   */
        !            50:        jbr     sizloop
        !            51: setsize:
        !            52:        mfpr    $SID, r3                /* get system id register value */
        !            53:        bicl2   $SYSTYPE, r3            /* mask off system id           */
        !            54:        cmpl    r3, $UVAXIISID          /* compare with UVAXII sid value*/
        !            55:        jneq    uimax                   /* if MicroVAX II, reserve 8K   */
        !            56:        subl3   $CONSDB, r1, _maxaddr   /* high mem for console database*/
        !            57:        jmp     rest
        !            58: uimax: movl    r1, _maxaddr            /* store result                 */
        !            59: rest:  movl    (sp)+, lowcore+4        /* restore exception vector     */
        !            60:        pushal  -4(fp)                  /* argument to restore          */
        !            61:        calls   $1, _restore            /* restore interrupts           */
        !            62:        ret                             /* return to caller             */
        !            63:        .align  2                       /* align on longword boundary   */
        !            64: siztrap:
        !            65:                                        /* machine chk--on intrrpt stk  */
        !            66:        subl3   $4, r2, r1              /* midpt caused exception, set  */
        !            67:                                        /* high address to mid - 4      */
        !            68:        addl2   (sp)+, sp               /* pop error data from exception*/
        !            69:                                        /* erase machine check history: */
        !            70: #if defined(VAX780) || defined(VAX785)
        !            71:        mtpr    $SBIFSCLR, $SBIFS       /* clear SBI history of machchk */
        !            72: #endif VAX78X
        !            73: #if    defined(UVAX) || defined(VAX750) || \
        !            74:        defined(VAX730) || defined(VAX725)
        !            75:        mtpr    $MCESRCLR, $MCESR       /* clear machine check history  */
        !            76: #endif UVAXX || VAX750 || VAX730 || VAX725
        !            77: #if    defined(VAX8600)
        !            78:        mtpr    $0, $EHSR
        !            79: #endif VAX8600
        !            80:        moval   sizloop, (sp)           /* go back to sizloop on rei    */
        !            81:        rei                             /* back on kernel stack again   */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.