svn commit: r368342 - in head/sys: kern sys

Konstantin Belousov kib at FreeBSD.org
Fri Dec 4 18:56:45 UTC 2020


Author: kib
Date: Fri Dec  4 18:56:44 2020
New Revision: 368342
URL: https://svnweb.freebsd.org/changeset/base/368342

Log:
  Add kern_ntp_adjtime(9).
  
  Reviewed by:	brooks, cy
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week
  Differential revision:	https://reviews.freebsd.org/D27471

Modified:
  head/sys/kern/kern_ntptime.c
  head/sys/sys/syscallsubr.h

Modified: head/sys/kern/kern_ntptime.c
==============================================================================
--- head/sys/kern/kern_ntptime.c	Fri Dec  4 16:51:59 2020	(r368341)
+++ head/sys/kern/kern_ntptime.c	Fri Dec  4 18:56:44 2020	(r368342)
@@ -338,24 +338,13 @@ SYSCTL_S64(_kern_ntp_pll, OID_AUTO, time_freq, CTLFLAG
  * the timex.constant structure member has a dual purpose to set the time
  * constant and to set the TAI offset.
  */
-#ifndef _SYS_SYSPROTO_H_
-struct ntp_adjtime_args {
-	struct timex *tp;
-};
-#endif
-
 int
-sys_ntp_adjtime(struct thread *td, struct ntp_adjtime_args *uap)
+kern_ntp_adjtime(struct thread *td, struct timex *ntv, int *retvalp)
 {
-	struct timex ntv;	/* temporary structure */
 	long freq;		/* frequency ns/s) */
 	int modes;		/* mode bits from structure */
 	int error, retval;
 
-	error = copyin((caddr_t)uap->tp, (caddr_t)&ntv, sizeof(ntv));
-	if (error)
-		return (error);
-
 	/*
 	 * Update selected clock variables - only the superuser can
 	 * change anything. Note that there is no error checking here on
@@ -365,18 +354,19 @@ sys_ntp_adjtime(struct thread *td, struct ntp_adjtime_
 	 * the STA_PLL bit in the status word is cleared, the state and
 	 * status words are reset to the initial values at boot.
 	 */
-	modes = ntv.modes;
+	modes = ntv->modes;
+	error = 0;
 	if (modes)
 		error = priv_check(td, PRIV_NTP_ADJTIME);
 	if (error != 0)
 		return (error);
 	NTP_LOCK();
 	if (modes & MOD_MAXERROR)
-		time_maxerror = ntv.maxerror;
+		time_maxerror = ntv->maxerror;
 	if (modes & MOD_ESTERROR)
-		time_esterror = ntv.esterror;
+		time_esterror = ntv->esterror;
 	if (modes & MOD_STATUS) {
-		if (time_status & STA_PLL && !(ntv.status & STA_PLL)) {
+		if (time_status & STA_PLL && !(ntv->status & STA_PLL)) {
 			time_state = TIME_OK;
 			time_status = STA_UNSYNC;
 #ifdef PPS_SYNC
@@ -384,28 +374,28 @@ sys_ntp_adjtime(struct thread *td, struct ntp_adjtime_
 #endif /* PPS_SYNC */
 		}
 		time_status &= STA_RONLY;
-		time_status |= ntv.status & ~STA_RONLY;
+		time_status |= ntv->status & ~STA_RONLY;
 	}
 	if (modes & MOD_TIMECONST) {
-		if (ntv.constant < 0)
+		if (ntv->constant < 0)
 			time_constant = 0;
-		else if (ntv.constant > MAXTC)
+		else if (ntv->constant > MAXTC)
 			time_constant = MAXTC;
 		else
-			time_constant = ntv.constant;
+			time_constant = ntv->constant;
 	}
 	if (modes & MOD_TAI) {
-		if (ntv.constant > 0) /* XXX zero & negative numbers ? */
-			time_tai = ntv.constant;
+		if (ntv->constant > 0) /* XXX zero & negative numbers ? */
+			time_tai = ntv->constant;
 	}
 #ifdef PPS_SYNC
 	if (modes & MOD_PPSMAX) {
-		if (ntv.shift < PPS_FAVG)
+		if (ntv->shift < PPS_FAVG)
 			pps_shiftmax = PPS_FAVG;
-		else if (ntv.shift > PPS_FAVGMAX)
+		else if (ntv->shift > PPS_FAVGMAX)
 			pps_shiftmax = PPS_FAVGMAX;
 		else
-			pps_shiftmax = ntv.shift;
+			pps_shiftmax = ntv->shift;
 	}
 #endif /* PPS_SYNC */
 	if (modes & MOD_NANO)
@@ -417,17 +407,17 @@ sys_ntp_adjtime(struct thread *td, struct ntp_adjtime_
 	if (modes & MOD_CLKA)
 		time_status &= ~STA_CLK;
 	if (modes & MOD_FREQUENCY) {
-		freq = (ntv.freq * 1000LL) >> 16;
+		freq = (ntv->freq * 1000LL) >> 16;
 		if (freq > MAXFREQ)
 			L_LINT(time_freq, MAXFREQ);
 		else if (freq < -MAXFREQ)
 			L_LINT(time_freq, -MAXFREQ);
 		else {
 			/*
-			 * ntv.freq is [PPM * 2^16] = [us/s * 2^16]
+			 * ntv->freq is [PPM * 2^16] = [us/s * 2^16]
 			 * time_freq is [ns/s * 2^32]
 			 */
-			time_freq = ntv.freq * 1000LL * 65536LL;
+			time_freq = ntv->freq * 1000LL * 65536LL;
 		}
 #ifdef PPS_SYNC
 		pps_freq = time_freq;
@@ -435,9 +425,9 @@ sys_ntp_adjtime(struct thread *td, struct ntp_adjtime_
 	}
 	if (modes & MOD_OFFSET) {
 		if (time_status & STA_NANO)
-			hardupdate(ntv.offset);
+			hardupdate(ntv->offset);
 		else
-			hardupdate(ntv.offset * 1000);
+			hardupdate(ntv->offset * 1000);
 	}
 
 	/*
@@ -445,38 +435,60 @@ sys_ntp_adjtime(struct thread *td, struct ntp_adjtime_
 	 * returned only by ntp_gettime();
 	 */
 	if (time_status & STA_NANO)
-		ntv.offset = L_GINT(time_offset);
+		ntv->offset = L_GINT(time_offset);
 	else
-		ntv.offset = L_GINT(time_offset) / 1000; /* XXX rounding ? */
-	ntv.freq = L_GINT((time_freq / 1000LL) << 16);
-	ntv.maxerror = time_maxerror;
-	ntv.esterror = time_esterror;
-	ntv.status = time_status;
-	ntv.constant = time_constant;
+		ntv->offset = L_GINT(time_offset) / 1000; /* XXX rounding ? */
+	ntv->freq = L_GINT((time_freq / 1000LL) << 16);
+	ntv->maxerror = time_maxerror;
+	ntv->esterror = time_esterror;
+	ntv->status = time_status;
+	ntv->constant = time_constant;
 	if (time_status & STA_NANO)
-		ntv.precision = time_precision;
+		ntv->precision = time_precision;
 	else
-		ntv.precision = time_precision / 1000;
-	ntv.tolerance = MAXFREQ * SCALE_PPM;
+		ntv->precision = time_precision / 1000;
+	ntv->tolerance = MAXFREQ * SCALE_PPM;
 #ifdef PPS_SYNC
-	ntv.shift = pps_shift;
-	ntv.ppsfreq = L_GINT((pps_freq / 1000LL) << 16);
+	ntv->shift = pps_shift;
+	ntv->ppsfreq = L_GINT((pps_freq / 1000LL) << 16);
 	if (time_status & STA_NANO)
-		ntv.jitter = pps_jitter;
+		ntv->jitter = pps_jitter;
 	else
-		ntv.jitter = pps_jitter / 1000;
-	ntv.stabil = pps_stabil;
-	ntv.calcnt = pps_calcnt;
-	ntv.errcnt = pps_errcnt;
-	ntv.jitcnt = pps_jitcnt;
-	ntv.stbcnt = pps_stbcnt;
+		ntv->jitter = pps_jitter / 1000;
+	ntv->stabil = pps_stabil;
+	ntv->calcnt = pps_calcnt;
+	ntv->errcnt = pps_errcnt;
+	ntv->jitcnt = pps_jitcnt;
+	ntv->stbcnt = pps_stbcnt;
 #endif /* PPS_SYNC */
 	retval = ntp_is_time_error(time_status) ? TIME_ERROR : time_state;
 	NTP_UNLOCK();
 
-	error = copyout((caddr_t)&ntv, (caddr_t)uap->tp, sizeof(ntv));
-	if (error == 0)
-		td->td_retval[0] = retval;
+	*retvalp = retval;
+	return (0);
+}
+
+#ifndef _SYS_SYSPROTO_H_
+struct ntp_adjtime_args {
+	struct timex *tp;
+};
+#endif
+
+int
+sys_ntp_adjtime(struct thread *td, struct ntp_adjtime_args *uap)
+{
+	struct timex ntv;
+	int error, retval;
+
+	error = copyin(uap->tp, &ntv, sizeof(ntv));
+	if (error == 0) {
+		error = kern_ntp_adjtime(td, &ntv, &retval);
+		if (error == 0) {
+			error = copyout(&ntv, uap->tp, sizeof(ntv));
+			if (error == 0)
+				td->td_retval[0] = retval;
+		}
+	}
 	return (error);
 }
 

Modified: head/sys/sys/syscallsubr.h
==============================================================================
--- head/sys/sys/syscallsubr.h	Fri Dec  4 16:51:59 2020	(r368341)
+++ head/sys/sys/syscallsubr.h	Fri Dec  4 18:56:44 2020	(r368342)
@@ -61,6 +61,7 @@ union semun;
 struct sockaddr;
 struct stat;
 struct thr_param;
+struct timex;
 struct uio;
 struct vm_map;
 struct vmspace;
@@ -215,6 +216,7 @@ int	kern_munlock(struct thread *td, uintptr_t addr, si
 int	kern_munmap(struct thread *td, uintptr_t addr, size_t size);
 int     kern_nanosleep(struct thread *td, struct timespec *rqt,
 	    struct timespec *rmt);
+int	kern_ntp_adjtime(struct thread *td, struct timex *ntv, int *retvalp);
 int	kern_ogetdirentries(struct thread *td, struct ogetdirentries_args *uap,
 	    long *ploff);
 int	kern_openat(struct thread *td, int fd, const char *path,


More information about the svn-src-head mailing list