summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2003-02-03 19:49:35 +0000
committerphk <phk@FreeBSD.org>2003-02-03 19:49:35 +0000
commit3692879cc82e12c56c011d2bf97d1c02bd3d66c5 (patch)
tree7251be2a86087b08495da120d84f24f25ed673c8
parentdb8a973d3ddfc686520b7766d7464f5140726cd9 (diff)
downloadFreeBSD-src-3692879cc82e12c56c011d2bf97d1c02bd3d66c5.zip
FreeBSD-src-3692879cc82e12c56c011d2bf97d1c02bd3d66c5.tar.gz
Split the global timezone structure into two integer fields to
prevent the compiler from optimizing assignments into byte-copy operations which might make access to the individual fields non-atomic. Use the individual fields throughout, and don't bother locking them with Giant: it is no longer needed. Inspired by: tjr
-rw-r--r--sys/amd64/amd64/tsc.c4
-rw-r--r--sys/amd64/isa/clock.c4
-rw-r--r--sys/fs/msdosfs/msdosfs_conv.c4
-rw-r--r--sys/fs/nwfs/nwfs_subr.c4
-rw-r--r--sys/fs/smbfs/smbfs_subr.c4
-rw-r--r--sys/i386/i386/tsc.c4
-rw-r--r--sys/i386/ibcs2/ibcs2_xenix.c4
-rw-r--r--sys/i386/isa/clock.c4
-rw-r--r--sys/isa/atrtc.c4
-rw-r--r--sys/kern/kern_time.c13
-rw-r--r--sys/kern/subr_clock.c4
-rw-r--r--sys/kern/subr_rtc.c4
-rw-r--r--sys/pc98/cbus/clock.c6
-rw-r--r--sys/pc98/cbus/pcrtc.c6
-rw-r--r--sys/pc98/pc98/clock.c6
-rw-r--r--sys/sys/kernel.h5
16 files changed, 40 insertions, 40 deletions
diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c
index 8e812a1..ec9b23a 100644
--- a/sys/amd64/amd64/tsc.c
+++ b/sys/amd64/amd64/tsc.c
@@ -908,7 +908,7 @@ inittodr(time_t base)
/* sec now contains the number of seconds, since Jan 1 1970,
in the local time zone */
- sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
y = time_second - sec;
if (y <= -2 || y >= 2) {
@@ -946,7 +946,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
diff --git a/sys/amd64/isa/clock.c b/sys/amd64/isa/clock.c
index 8e812a1..ec9b23a 100644
--- a/sys/amd64/isa/clock.c
+++ b/sys/amd64/isa/clock.c
@@ -908,7 +908,7 @@ inittodr(time_t base)
/* sec now contains the number of seconds, since Jan 1 1970,
in the local time zone */
- sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
y = time_second - sec;
if (y <= -2 || y >= 2) {
@@ -946,7 +946,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
diff --git a/sys/fs/msdosfs/msdosfs_conv.c b/sys/fs/msdosfs/msdosfs_conv.c
index 7b3591e..d135bfa 100644
--- a/sys/fs/msdosfs/msdosfs_conv.c
+++ b/sys/fs/msdosfs/msdosfs_conv.c
@@ -112,7 +112,7 @@ unix2dostime(tsp, ddp, dtp, dhp)
* If the time from the last conversion is the same as now, then
* skip the computations and use the saved result.
*/
- t = tsp->tv_sec - (tz.tz_minuteswest * 60)
+ t = tsp->tv_sec - (tz_minuteswest * 60)
- (wall_cmos_clock ? adjkerntz : 0);
/* - daylight savings time correction */
t &= ~1;
@@ -224,7 +224,7 @@ dos2unixtime(dd, dt, dh, tsp)
days += ((dd & DD_DAY_MASK) >> DD_DAY_SHIFT) - 1;
lastseconds = (days * 24 * 60 * 60) + SECONDSTO1980;
}
- tsp->tv_sec = seconds + lastseconds + (tz.tz_minuteswest * 60)
+ tsp->tv_sec = seconds + lastseconds + (tz_minuteswest * 60)
+ adjkerntz;
/* + daylight savings time correction */
tsp->tv_nsec = (dh % 100) * 10000000;
diff --git a/sys/fs/nwfs/nwfs_subr.c b/sys/fs/nwfs/nwfs_subr.c
index ad6009c..10d9647 100644
--- a/sys/fs/nwfs/nwfs_subr.c
+++ b/sys/fs/nwfs/nwfs_subr.c
@@ -596,7 +596,7 @@ ncp_unix2dostime(tsp, tzoff, ddp, dtp, dhp)
* If the time from the last conversion is the same as now, then
* skip the computations and use the saved result.
*/
- t = tsp->tv_sec - tzoff * 60 - tz.tz_minuteswest * 60 -
+ t = tsp->tv_sec - tzoff * 60 - tz_minuteswest * 60 -
(wall_cmos_clock ? adjkerntz : 0);
t &= ~1;
if (lasttime != t) {
@@ -706,7 +706,7 @@ ncp_dos2unixtime(dd, dt, dh, tzoff, tsp)
days += ((dd & DD_DAY_MASK) >> DD_DAY_SHIFT) - 1;
lastseconds = (days * 24 * 60 * 60) + SECONDSTO1980;
}
- tsp->tv_sec = seconds + lastseconds + tz.tz_minuteswest * 60 +
+ tsp->tv_sec = seconds + lastseconds + tz_minuteswest * 60 +
tzoff * 60 + (wall_cmos_clock ? adjkerntz : 0);
tsp->tv_nsec = (dh % 100) * 10000000;
}
diff --git a/sys/fs/smbfs/smbfs_subr.c b/sys/fs/smbfs/smbfs_subr.c
index 16e4bf2..f8d2eec 100644
--- a/sys/fs/smbfs/smbfs_subr.c
+++ b/sys/fs/smbfs/smbfs_subr.c
@@ -108,7 +108,7 @@ static u_short lastdtime;
void
smb_time_local2server(struct timespec *tsp, int tzoff, u_long *seconds)
{
- *seconds = tsp->tv_sec - tzoff * 60 /*- tz.tz_minuteswest * 60 -
+ *seconds = tsp->tv_sec - tzoff * 60 /*- tz_minuteswest * 60 -
(wall_cmos_clock ? adjkerntz : 0)*/;
}
@@ -116,7 +116,7 @@ void
smb_time_server2local(u_long seconds, int tzoff, struct timespec *tsp)
{
tsp->tv_sec = seconds + tzoff * 60;
- /*+ tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0)*/;
+ /*+ tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0)*/;
}
/*
diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c
index 8e812a1..ec9b23a 100644
--- a/sys/i386/i386/tsc.c
+++ b/sys/i386/i386/tsc.c
@@ -908,7 +908,7 @@ inittodr(time_t base)
/* sec now contains the number of seconds, since Jan 1 1970,
in the local time zone */
- sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
y = time_second - sec;
if (y <= -2 || y >= 2) {
@@ -946,7 +946,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
diff --git a/sys/i386/ibcs2/ibcs2_xenix.c b/sys/i386/ibcs2/ibcs2_xenix.c
index 9aea547..da4f085 100644
--- a/sys/i386/ibcs2/ibcs2_xenix.c
+++ b/sys/i386/ibcs2/ibcs2_xenix.c
@@ -120,8 +120,8 @@ xenix_ftime(td, uap)
microtime(&tv);
itb.time = tv.tv_sec;
itb.millitm = (tv.tv_usec / 1000);
- itb.timezone = tz.tz_minuteswest;
- itb.dstflag = tz.tz_dsttime != DST_NONE;
+ itb.timezone = tz_minuteswest;
+ itb.dstflag = tz_dsttime != DST_NONE;
return copyout((caddr_t)&itb, (caddr_t)uap->tp,
sizeof(struct ibcs2_timeb));
diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c
index 8e812a1..ec9b23a 100644
--- a/sys/i386/isa/clock.c
+++ b/sys/i386/isa/clock.c
@@ -908,7 +908,7 @@ inittodr(time_t base)
/* sec now contains the number of seconds, since Jan 1 1970,
in the local time zone */
- sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
y = time_second - sec;
if (y <= -2 || y >= 2) {
@@ -946,7 +946,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
diff --git a/sys/isa/atrtc.c b/sys/isa/atrtc.c
index 8e812a1..ec9b23a 100644
--- a/sys/isa/atrtc.c
+++ b/sys/isa/atrtc.c
@@ -908,7 +908,7 @@ inittodr(time_t base)
/* sec now contains the number of seconds, since Jan 1 1970,
in the local time zone */
- sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
y = time_second - sec;
if (y <= -2 || y >= 2) {
@@ -946,7 +946,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
index 325ecec..405e930 100644
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -55,7 +55,8 @@
#include <vm/vm.h>
#include <vm/vm_extern.h>
-struct timezone tz;
+int tz_minuteswest;
+int tz_dsttime;
/*
* Time of day and interval timer support.
@@ -327,9 +328,8 @@ gettimeofday(struct thread *td, struct gettimeofday_args *uap)
error = copyout(&atv, uap->tp, sizeof (atv));
}
if (error == 0 && uap->tzp != NULL) {
- mtx_lock(&Giant);
- rtz = tz;
- mtx_unlock(&Giant);
+ rtz.tz_minuteswest = tz_minuteswest;
+ rtz.tz_dsttime = tz_dsttime;
error = copyout(&rtz, uap->tzp, sizeof (rtz));
}
return (error);
@@ -373,9 +373,8 @@ settimeofday(struct thread *td, struct settimeofday_args *uap)
if (uap->tv && (error = settime(td, &atv)))
return (error);
if (uap->tzp) {
- mtx_lock(&Giant);
- tz = atz;
- mtx_unlock(&Giant);
+ tz_minuteswest = atz.tz_minuteswest;
+ tz_dsttime = atz.tz_dsttime;
}
return (error);
}
diff --git a/sys/kern/subr_clock.c b/sys/kern/subr_clock.c
index e573463..19df90d 100644
--- a/sys/kern/subr_clock.c
+++ b/sys/kern/subr_clock.c
@@ -281,7 +281,7 @@ inittodr(time_t base)
printf("Check and reset the date immediately!\n");
}
- ts.tv_sec += tz.tz_minuteswest * 60 +
+ ts.tv_sec += tz_minuteswest * 60 +
(wall_cmos_clock ? adjkerntz : 0);
if (timespeccmp(&ref, &ts, >)) {
@@ -310,7 +310,7 @@ resettodr()
return;
getnanotime(&ts);
- ts.tv_sec -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ ts.tv_sec -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
if ((error = CLOCK_SETTIME(clock_dev, &ts)) != 0) {
printf("warning: clock_settime failed (%d), time-of-day clock "
"not adjusted to system time\n", error);
diff --git a/sys/kern/subr_rtc.c b/sys/kern/subr_rtc.c
index e573463..19df90d 100644
--- a/sys/kern/subr_rtc.c
+++ b/sys/kern/subr_rtc.c
@@ -281,7 +281,7 @@ inittodr(time_t base)
printf("Check and reset the date immediately!\n");
}
- ts.tv_sec += tz.tz_minuteswest * 60 +
+ ts.tv_sec += tz_minuteswest * 60 +
(wall_cmos_clock ? adjkerntz : 0);
if (timespeccmp(&ref, &ts, >)) {
@@ -310,7 +310,7 @@ resettodr()
return;
getnanotime(&ts);
- ts.tv_sec -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ ts.tv_sec -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
if ((error = CLOCK_SETTIME(clock_dev, &ts)) != 0) {
printf("warning: clock_settime failed (%d), time-of-day clock "
"not adjusted to system time\n", error);
diff --git a/sys/pc98/cbus/clock.c b/sys/pc98/cbus/clock.c
index 8e2dc97..9a247a9 100644
--- a/sys/pc98/cbus/clock.c
+++ b/sys/pc98/cbus/clock.c
@@ -1200,7 +1200,7 @@ inittodr(time_t base)
in the local time zone */
#endif
- sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
y = time_second - sec;
if (y <= -2 || y >= 2) {
@@ -1241,7 +1241,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
@@ -1279,7 +1279,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
diff --git a/sys/pc98/cbus/pcrtc.c b/sys/pc98/cbus/pcrtc.c
index 8e2dc97..9a247a9 100644
--- a/sys/pc98/cbus/pcrtc.c
+++ b/sys/pc98/cbus/pcrtc.c
@@ -1200,7 +1200,7 @@ inittodr(time_t base)
in the local time zone */
#endif
- sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
y = time_second - sec;
if (y <= -2 || y >= 2) {
@@ -1241,7 +1241,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
@@ -1279,7 +1279,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
diff --git a/sys/pc98/pc98/clock.c b/sys/pc98/pc98/clock.c
index 8e2dc97..9a247a9 100644
--- a/sys/pc98/pc98/clock.c
+++ b/sys/pc98/pc98/clock.c
@@ -1200,7 +1200,7 @@ inittodr(time_t base)
in the local time zone */
#endif
- sec += tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
y = time_second - sec;
if (y <= -2 || y >= 2) {
@@ -1241,7 +1241,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
rtc_outb(bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
@@ -1279,7 +1279,7 @@ resettodr()
/* Calculate local time to put in RTC */
- tm -= tz.tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
+ tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h
index ba486a9..0d3b7b2 100644
--- a/sys/sys/kernel.h
+++ b/sys/sys/kernel.h
@@ -68,8 +68,6 @@ extern char kernelname[MAXPATHLEN];
/* 1.2 */
extern struct timeval boottime;
-extern struct timezone tz; /* XXX */
-
extern int tick; /* usec per tick (1000000 / hz) */
extern int hz; /* system clock's frequency */
extern int psratio; /* ratio: prof / stat */
@@ -79,6 +77,9 @@ extern int profprocs; /* number of process's profiling */
extern int ticks;
extern int lbolt; /* once a second sleep address */
+extern int tz_minuteswest;
+extern int tz_dsttime;
+
#endif /* _KERNEL */
/*
OpenPOWER on IntegriCloud