if (time_offset < 0) txc->offset = -(-time_offset >> SHIFT_UPDATE); else txc->offset = time_offset >> SHIFT_UPDATE; 
txc->offset = shift_right(time_offset, SHIFT_UPDATE); 
int do_adjtimex(struct timex *txc){        long ltemp, mtemp, save_adjust;	int result;	/* In order to modify anything, you gotta be super-user! */	if (txc->modes && !capable(CAP_SYS_TIME))		return -EPERM;			/* Now we validate the data before disabling interrupts */	if ((txc->modes & ADJ_OFFSET_SINGLESHOT) == ADJ_OFFSET_SINGLESHOT)	  /* singleshot must not be used with any other mode bits */		if (txc->modes != ADJ_OFFSET_SINGLESHOT)			return -EINVAL;	if (txc->modes != ADJ_OFFSET_SINGLESHOT && (txc->modes & ADJ_OFFSET))	  /* adjustment Offset limited to +- .512 seconds */		if (txc->offset <= - MAXPHASE || txc->offset >= MAXPHASE )			return -EINVAL;		/* if the quartz is off by more than 10% something is VERY wrong ! */	if (txc->modes & ADJ_TICK)		if (txc->tick <  900000/USER_HZ ||		    txc->tick > 1100000/USER_HZ)			return -EINVAL;	write_seqlock_irq(&xtime_lock);	result = time_state;	/* mostly `TIME_OK' */	/* Save for later - semantics of adjtime is to return old value */	save_adjust = time_next_adjust ? time_next_adjust : time_adjust;#if 0	/* STA_CLOCKERR is never set yet */	time_status &= ~STA_CLOCKERR;		/* reset STA_CLOCKERR */#endif	/* If there are input parameters, then process them */	if (txc->modes)	{	    if (txc->modes & ADJ_STATUS)	/* only set allowed bits */		time_status =  (txc->status & ~STA_RONLY) |			      (time_status & STA_RONLY);	    if (txc->modes & ADJ_FREQUENCY) {	/* p. 22 */		if (txc->freq > MAXFREQ || txc->freq < -MAXFREQ) {		    result = -EINVAL;		    goto leave;		}		time_freq = txc->freq - pps_freq;	    }	    if (txc->modes & ADJ_MAXERROR) {		if (txc->maxerror < 0 || txc->maxerror >= NTP_PHASE_LIMIT) {		    result = -EINVAL;		    goto leave;		}		time_maxerror = txc->maxerror;	    }	    if (txc->modes & ADJ_ESTERROR) {		if (txc->esterror < 0 || txc->esterror >= NTP_PHASE_LIMIT) {		    result = -EINVAL;		    goto leave;		}		time_esterror = txc->esterror;	    }	    if (txc->modes & ADJ_TIMECONST) {	/* p. 24 */		if (txc->constant < 0) {	/* NTP v4 uses values > 6 */		    result = -EINVAL;		    goto leave;		}		time_constant = txc->constant;	    }	    if (txc->modes & ADJ_OFFSET) {	/* values checked earlier */		if (txc->modes == ADJ_OFFSET_SINGLESHOT) {		    /* adjtime() is independent from ntp_adjtime() */		    if ((time_next_adjust = txc->offset) == 0)			 time_adjust = 0;		}		else if ( time_status & (STA_PLL | STA_PPSTIME) ) {		    ltemp = (time_status & (STA_PPSTIME | STA_PPSSIGNAL)) ==		            (STA_PPSTIME | STA_PPSSIGNAL) ?		            pps_offset : txc->offset;		    /*		     * Scale the phase adjustment and		     * clamp to the operating range.		     */		    if (ltemp > MAXPHASE)		        time_offset = MAXPHASE << SHIFT_UPDATE;		    else if (ltemp < -MAXPHASE)			time_offset = -(MAXPHASE << SHIFT_UPDATE);		    else		        time_offset = ltemp << SHIFT_UPDATE;		    /*		     * Select whether the frequency is to be controlled		     * and in which mode (PLL or FLL). Clamp to the operating		     * range. Ugly multiply/divide should be replaced someday.		     */		    if (time_status & STA_FREQHOLD || time_reftime == 0)		        time_reftime = xtime.tv_sec;		    mtemp = xtime.tv_sec - time_reftime;		    time_reftime = xtime.tv_sec;		    if (time_status & STA_FLL) {		        if (mtemp >= MINSEC) {			    ltemp = (time_offset / mtemp) << (SHIFT_USEC -							      SHIFT_UPDATE);			    if (ltemp < 0)			        time_freq -= -ltemp >> SHIFT_KH;			    else			        time_freq += ltemp >> SHIFT_KH;			} else /* calibration interval too short (p. 12) */				result = TIME_ERROR;		    } else {	/* PLL mode */		        if (mtemp < MAXSEC) {			    ltemp *= mtemp;			    if (ltemp < 0)			        time_freq -= -ltemp >> (time_constant +							time_constant +							SHIFT_KF - SHIFT_USEC);			    else			        time_freq += ltemp >> (time_constant +						       time_constant +						       SHIFT_KF - SHIFT_USEC);			} else /* calibration interval too long (p. 12) */				result = TIME_ERROR;		    }		    if (time_freq > time_tolerance)		        time_freq = time_tolerance;		    else if (time_freq < -time_tolerance)		        time_freq = -time_tolerance;		} /* STA_PLL || STA_PPSTIME */	    } /* txc->modes & ADJ_OFFSET */	    if (txc->modes & ADJ_TICK) {		tick_usec = txc->tick;		tick_nsec = TICK_USEC_TO_NSEC(tick_usec);	    }	} /* txc->modes */leave:	if ((time_status & (STA_UNSYNC|STA_CLOCKERR)) != 0	    || ((time_status & (STA_PPSFREQ|STA_PPSTIME)) != 0		&& (time_status & STA_PPSSIGNAL) == 0)	    /* p. 24, (b) */	    || ((time_status & (STA_PPSTIME|STA_PPSJITTER))		== (STA_PPSTIME|STA_PPSJITTER))	    /* p. 24, (c) */	    || ((time_status & STA_PPSFREQ) != 0		&& (time_status & (STA_PPSWANDER|STA_PPSERROR)) != 0))	    /* p. 24, (d) */		result = TIME_ERROR;		if ((txc->modes & ADJ_OFFSET_SINGLESHOT) == ADJ_OFFSET_SINGLESHOT)	    txc->offset	   = save_adjust;	else {	    if (time_offset < 0)		txc->offset = -(-time_offset >> SHIFT_UPDATE);	    else		txc->offset = time_offset >> SHIFT_UPDATE;	}	txc->freq	   = time_freq + pps_freq;	txc->maxerror	   = time_maxerror;	txc->esterror	   = time_esterror;	txc->status	   = time_status;	txc->constant	   = time_constant;	txc->precision	   = time_precision;	txc->tolerance	   = time_tolerance;	txc->tick	   = tick_usec;	txc->ppsfreq	   = pps_freq;	txc->jitter	   = pps_jitter >> PPS_AVG;	txc->shift	   = pps_shift;	txc->stabil	   = pps_stabil;	txc->jitcnt	   = pps_jitcnt;	txc->calcnt	   = pps_calcnt;	txc->errcnt	   = pps_errcnt;	txc->stbcnt	   = pps_stbcnt;	write_sequnlock_irq(&xtime_lock);	do_gettimeofday(&txc->time);	notify_arch_cmos_timer();	return(result);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/1bb34a412750291e4e5e9f1d0fe7ae1b7e976098/time.c/clean/kernel/time.c