|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.