Annotation of researchv10no/cmd/adb/seq/mchsys.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * system-mode mapping
        !             3:  * 32032/sequent version
        !             4:  */
        !             5: 
        !             6: #include "defs.h"
        !             7: #include "machine.h"
        !             8: #include "space.h"
        !             9: #include <machine/pte.h>
        !            10: #include <machine/param.h>
        !            11: 
        !            12: static long sysptb, usrptb;
        !            13: static int kmode;
        !            14: 
        !            15: #define        KOFF    0
        !            16: #define        KSYS    1
        !            17: #define        KUSR    2
        !            18: 
        !            19: printkm()
        !            20: {
        !            21: 
        !            22:        printf("%R$k\n%R$u\n", sysptb, usrptb);
        !            23:        if (kmode == KSYS)
        !            24:                printf("sys\n");
        !            25:        else if (kmode == KUSR)
        !            26:                printf("user\n");
        !            27:        else
        !            28:                printf("off\n");
        !            29: }
        !            30: 
        !            31: kmsys()
        !            32: {
        !            33: 
        !            34:        if (adrflg) {
        !            35:                sysptb = dot;
        !            36:                kmode = KSYS;
        !            37:                return;
        !            38:        }
        !            39:        if (expr(0)) {
        !            40:                if (expv)
        !            41:                        kmode = KSYS;
        !            42:                else
        !            43:                        kmode = KUSR;
        !            44:                return;
        !            45:        }
        !            46:        printkm();
        !            47: }
        !            48: 
        !            49: kmproc()
        !            50: {
        !            51: 
        !            52:        if (adrflg) {
        !            53:                sysptb = dot;
        !            54:                kmode = KUSR;
        !            55:                return;
        !            56:        }
        !            57:        if (expr(0)) {
        !            58:                if (expv)
        !            59:                        kmode = KUSR;
        !            60:                else
        !            61:                        kmode = KSYS;
        !            62:                return;
        !            63:        }
        !            64:        printkm();
        !            65: }
        !            66: 
        !            67: /*
        !            68:  * map a kernel address to a physical address
        !            69:  * arg is a pointer to be filled in
        !            70:  * returns nonzero if address is valid
        !            71:  */
        !            72: 
        !            73: int
        !            74: kmap(paddr, sp)
        !            75: ADDR *paddr;
        !            76: {
        !            77:        switch (kmode) {
        !            78:        case KUSR:
        !            79:                return (transl(paddr, sp, usrptb));
        !            80: 
        !            81:        case KSYS:
        !            82:                return (transl(paddr, sp, sysptb));
        !            83: 
        !            84:        default:
        !            85:                return (1);
        !            86:        }
        !            87: }
        !            88: 
        !            89: /*
        !            90:  * virtual -> physical addr, given the right pt base
        !            91:  */
        !            92: static long
        !            93: transl(ap, sp, ptb)
        !            94: register long *ap;
        !            95: int sp;
        !            96: long ptb;
        !            97: {
        !            98:        long pt;
        !            99: 
        !           100:        pt = ltow(lget((ADDR)(ptb + L1IDX(*ap) * sizeof(struct pte)), sp|RAWADDR));
        !           101:        if (errflg)
        !           102:                return (0);
        !           103:        if ((pt & PG_V) == 0)
        !           104:                return (0);
        !           105:        pt = PTETOPHYS(pt) + L2IDX(*ap) * sizeof(struct pte);
        !           106:        pt = ltow(lget((ADDR)pt, sp|RAWADDR));
        !           107:        if (errflg)
        !           108:                return (0);
        !           109:        *ap = (*ap & PGOFSET) + PTETOPHYS(pt);
        !           110:        return (1);
        !           111: }

unix.superglobalmegacorp.com

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