Annotation of 43BSD/sys/vax/ka630.c, revision 1.1.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.