|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)clock.c 7.1 (Berkeley) 6/5/86 ! 7: */ ! 8: ! 9: #include "param.h" ! 10: #include "time.h" ! 11: #include "kernel.h" ! 12: ! 13: #include "mtpr.h" ! 14: #include "clock.h" ! 15: #include "cpu.h" ! 16: ! 17: /* ! 18: * Machine-dependent clock routines. ! 19: * ! 20: * Startrtclock restarts the real-time clock, which provides ! 21: * hardclock interrupts to kern_clock.c. ! 22: * ! 23: * Inittodr initializes the time of day hardware which provides ! 24: * date functions. Its primary function is to use some file ! 25: * system information in case the hardare clock lost state. ! 26: * ! 27: * Resettodr restores the time of day hardware after a time change. ! 28: */ ! 29: ! 30: /* ! 31: * Start the real-time clock. ! 32: */ ! 33: startrtclock() ! 34: { ! 35: #ifdef VAX630 ! 36: if (cpu == VAX_630) { ! 37: mtpr(ICCS, ICCS_IE); ! 38: } else { ! 39: #endif ! 40: mtpr(NICR, -1000000/hz); ! 41: mtpr(ICCS, ICCS_RUN+ICCS_IE+ICCS_TRANS+ICCS_INT+ICCS_ERR); ! 42: #ifdef VAX630 ! 43: } ! 44: #endif ! 45: } ! 46: ! 47: /* ! 48: * Initialze the time of day register, based on the time base which is, e.g. ! 49: * from a filesystem. Base provides the time to within six months, ! 50: * and the time of year clock provides the rest. ! 51: */ ! 52: inittodr(base) ! 53: time_t base; ! 54: { ! 55: register u_int todr = mfpr(TODR); ! 56: long deltat; ! 57: int year = YRREF; ! 58: #if VAX630 ! 59: /* ! 60: * If this is a Ka630, call ka630tod to handle the funny tod clock. ! 61: */ ! 62: if (cpu == VAX_630) { ! 63: ka630tod(base); ! 64: return; ! 65: } ! 66: #endif ! 67: if (base < 5*SECYR) { ! 68: printf("WARNING: preposterous time in file system"); ! 69: time.tv_sec = 6*SECYR + 186*SECDAY + SECDAY/2; ! 70: resettodr(); ! 71: goto check; ! 72: } ! 73: /* ! 74: * TODRZERO is base used by VMS, which runs on local time. ! 75: */ ! 76: if (todr < TODRZERO) { ! 77: printf("WARNING: todr too small"); ! 78: time.tv_sec = base; ! 79: /* ! 80: * Believe the time in the file system for lack of ! 81: * anything better, resetting the TODR. ! 82: */ ! 83: resettodr(); ! 84: goto check; ! 85: } ! 86: ! 87: /* ! 88: * Sneak to within 6 month of the time in the filesystem, ! 89: * by starting with the time of the year suggested by the TODR, ! 90: * and advancing through succesive years. Adding the number of ! 91: * seconds in the current year takes us to the end of the current year ! 92: * and then around into the next year to the same position. ! 93: */ ! 94: time.tv_sec = (todr-TODRZERO)/100; ! 95: while (time.tv_sec < base-SECYR/2) { ! 96: if (LEAPYEAR(year)) ! 97: time.tv_sec += SECDAY; ! 98: year++; ! 99: time.tv_sec += SECYR; ! 100: } ! 101: ! 102: /* ! 103: * See if we gained/lost two or more days; ! 104: * if so, assume something is amiss. ! 105: */ ! 106: deltat = time.tv_sec - base; ! 107: if (deltat < 0) ! 108: deltat = -deltat; ! 109: if (deltat < 2*SECDAY) ! 110: return; ! 111: printf("WARNING: clock %s %d days", ! 112: time.tv_sec < base ? "lost" : "gained", deltat / SECDAY); ! 113: check: ! 114: printf(" -- CHECK AND RESET THE DATE!\n"); ! 115: } ! 116: ! 117: /* ! 118: * Reset the TODR based on the time value; used when the TODR ! 119: * has a preposterous value and also when the time is reset ! 120: * by the stime system call. Also called when the TODR goes past ! 121: * TODRZERO + 100*(SECYEAR+2*SECDAY) (e.g. on Jan 2 just after midnight) ! 122: * to wrap the TODR around. ! 123: */ ! 124: resettodr() ! 125: { ! 126: int year = YRREF; ! 127: u_int secyr; ! 128: u_int yrtime = time.tv_sec; ! 129: ! 130: #if VAX630 ! 131: /* ! 132: * If this is a ka630, call ka630stod to set the funny tod clock. ! 133: */ ! 134: if (cpu == VAX_630) { ! 135: ka630stod(); ! 136: return; ! 137: } ! 138: #endif ! 139: ! 140: /* ! 141: * Whittle the time down to an offset in the current year, ! 142: * by subtracting off whole years as long as possible. ! 143: */ ! 144: for (;;) { ! 145: secyr = SECYR; ! 146: if (LEAPYEAR(year)) ! 147: secyr += SECDAY; ! 148: if (yrtime < secyr) ! 149: break; ! 150: yrtime -= secyr; ! 151: year++; ! 152: } ! 153: mtpr(TODR, TODRZERO + yrtime*100); ! 154: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.