|
|
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.