Annotation of 43BSD/sys/vax/ka630.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *     @(#)ka630.c     7.1 (Berkeley) 6/5/86
        !             3:  */
        !             4: #if defined(VAX630)
        !             5: /* ka630.c routines for the ka630 clock chip... */
        !             6: #include "param.h"
        !             7: #include "time.h"
        !             8: #include "kernel.h"
        !             9: #include "vmmac.h"
        !            10: 
        !            11: #include "mtpr.h"
        !            12: #include "cpu.h"
        !            13: #include "clock.h"
        !            14: #include "pte.h"
        !            15: #include "ka630.h"
        !            16: 
        !            17: /*
        !            18:  * These two fuctions handle the tod clock
        !            19:  * This code is defunct at the end of the century.
        !            20:  * Will Unix still be here then??
        !            21:  */
        !            22: 
        !            23: struct cldevice cldevice;
        !            24: struct ka630cpu ka630cpu;
        !            25: 
        !            26: short dayyr[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, };
        !            27: /* Starts the tod clock. Called from clkstart... */
        !            28: ka630tod(base)
        !            29:        time_t base;
        !            30: {
        !            31:        register int tmp1, tmp2;
        !            32:        struct pte *pte = &Clockmap[0];
        !            33:        register struct cldevice *claddr = &cldevice;
        !            34:        struct ka630cpu *ka630addr = &ka630cpu;
        !            35: 
        !            36:        /* Enable system page for registers */
        !            37:        *(int *)pte = PG_V|PG_KW|btop(0x200b8000);
        !            38:        pte = &Ka630map[0];
        !            39:        *(int *)pte = PG_V|PG_KW|btop(0x20080000);
        !            40:        mtpr(TBIA, 0);
        !            41:        /*
        !            42:         * Clear restart and boot in progress flags in the CPMBX. This has
        !            43:         * nothing to do with the clock except that it the CPMBX reg. is a
        !            44:         * byte in the clock's ram.
        !            45:         */
        !            46:        claddr->cpmbx=(u_short)((claddr->cpmbx&KA630CLK_LANG)|KA630CLK_REBOOT);
        !            47:        /*
        !            48:         * Enable memory parity error detection. again nothing to do with the
        !            49:         * tod clock except for being a convenient place.
        !            50:         */
        !            51:        ka630addr->ka630_mser = KA630MSER_PAREN;
        !            52:        claddr->csr1 = KA630CLK_SET;
        !            53:        while ((claddr->csr0 & KA630CLK_UIP) != 0)
        !            54:                ;
        !            55:        /* If the clock is valid, use it. */
        !            56:        if ((claddr->csr3 & KA630CLK_VRT) != 0 &&
        !            57:            (claddr->csr1 & KA630CLK_ENABLE) == KA630CLK_ENABLE) {
        !            58:                /* Convert yr,mon,day,hr,min,sec to sec past Jan.1, 1970. */
        !            59:                tmp2 = 0;
        !            60:                for (tmp1 = 70; tmp1 < claddr->yr; tmp1++) {
        !            61:                        tmp2 += 365;
        !            62:                        /* I just luv leap years... */
        !            63:                        if (LEAPYEAR(tmp1))
        !            64:                                tmp2++;
        !            65:                }
        !            66:                tmp2 += (dayyr[claddr->mon-1]+claddr->day-1);
        !            67:                if (LEAPYEAR(claddr->yr) && claddr->mon > 2)
        !            68:                        tmp2++;
        !            69:                /* Finally got days past Jan. 1,1970. the rest is easy.. */
        !            70:                time.tv_sec = tmp2*SECDAY+claddr->hr*HRSEC+
        !            71:                        claddr->min*MINSEC+claddr->sec;
        !            72:                tmp1 = claddr->csr2;
        !            73:                claddr->csr0 = KA630CLK_RATE;
        !            74:                claddr->csr1 = KA630CLK_ENABLE;
        !            75:        } else if (base < 5*SECYR) {
        !            76:                printf("WARNING: preposterous time in file system\n");
        !            77:                time.tv_sec = 6*SECYR+186*SECDAY+SECDAY/2;
        !            78:                ka630stod();
        !            79:        } else {
        !            80:                printf("WARNING: Time set via file system\n");
        !            81:                time.tv_sec = base;
        !            82:                ka630stod();
        !            83:        }
        !            84: }
        !            85: /* Set the time of day clock, called via. stime system call.. */
        !            86: ka630stod()
        !            87: {
        !            88:        register int tmp1, tmp3;
        !            89:        register struct cldevice *claddr = &cldevice;
        !            90:        long tmp2, tmp4;
        !            91: 
        !            92:        claddr->csr1 = KA630CLK_SET;
        !            93:        while ((claddr->csr0 & KA630CLK_UIP) != 0)
        !            94:                ;
        !            95:        /* The reverse of above, sec. past Jan. 1,1970 to yr, mon... */
        !            96:        tmp2 = time.tv_sec/HRSEC;
        !            97:        tmp4 = tmp2 = tmp2/24;
        !            98:        tmp1 = 69;
        !            99:        while (tmp2 >= 0) {
        !           100:                tmp3 = tmp2;
        !           101:                tmp2 -= 365;
        !           102:                tmp1++;
        !           103:                if (LEAPYEAR(tmp1))
        !           104:                        tmp2--;
        !           105:        }
        !           106:        /* Got the year... */
        !           107:        claddr->yr = tmp1;
        !           108:        tmp1 = -1;
        !           109:        do {
        !           110:                tmp2 = tmp3-dayyr[++tmp1];
        !           111:                if (LEAPYEAR(claddr->yr) && tmp1 > 1)
        !           112:                        tmp2--;
        !           113:        } while (tmp2 >= 0);
        !           114:        /* Finally, got the rest... */
        !           115:        claddr->mon = tmp1;
        !           116:        claddr->day = tmp3-dayyr[tmp1-1]+1;
        !           117:        if (LEAPYEAR(claddr->yr) && tmp1 > 2)
        !           118:                claddr->day--;
        !           119:        tmp2 = time.tv_sec-(tmp4*SECDAY);
        !           120:        claddr->hr = tmp2/HRSEC;
        !           121:        tmp2 = tmp2%HRSEC;
        !           122:        claddr->min = tmp2/MINSEC;
        !           123:        tmp2 = tmp2%MINSEC;
        !           124:        claddr->sec = tmp2;
        !           125:        tmp1 = claddr->csr2;
        !           126:        tmp1 = claddr->csr3;
        !           127:        claddr->csr0 = KA630CLK_RATE;
        !           128:        claddr->csr1 = KA630CLK_ENABLE;
        !           129: }
        !           130: #endif

unix.superglobalmegacorp.com

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