Blob Blame History Raw
--- valgrind-3.5.0/include/vki/vki-linux.h	(revision 10968)
+++ valgrind-3.5.0/include/vki/vki-linux.h	(revision 10969)
@@ -283,8 +283,11 @@ struct vki_timex {
 #define VKI_ADJ_ESTERROR		0x0008	/* estimated time error */
 #define VKI_ADJ_STATUS			0x0010	/* clock status */
 #define VKI_ADJ_TIMECONST		0x0020	/* pll time constant */
+#define VKI_ADJ_TAI			0x0080	/* set TAI offset */
 #define VKI_ADJ_TICK			0x4000	/* tick value */
+#define VKI_ADJ_ADJTIME			0x8000	/* switch between adjtime/adjtimex modes */
 //#define VKI_ADJ_OFFSET_SINGLESHOT	0x8001	/* old-fashioned adjtime */
+#define VKI_ADJ_OFFSET_READONLY		0x2000	/* read-only adjtime */
 
 //----------------------------------------------------------------------
 // From linux-2.6.8.1/include/linux/times.h
--- valgrind-3.5.0/coregrind/m_syswrap/syswrap-linux.c	(revision 10968)
+++ valgrind-3.5.0/coregrind/m_syswrap/syswrap-linux.c	(revision 10969)
@@ -623,18 +623,23 @@ PRE(sys_adjtimex)
    PRE_REG_READ1(long, "adjtimex", struct timex *, buf);
    PRE_MEM_READ( "adjtimex(timex->modes)", ARG1, sizeof(tx->modes));
 
-#define ADJX(bit,field) 				\
-   if (tx->modes & bit)					\
+#define ADJX(bits,field) 				\
+   if (tx->modes & (bits))                              \
       PRE_MEM_READ( "adjtimex(timex->"#field")",	\
 		    (Addr)&tx->field, sizeof(tx->field))
 
-   ADJX(VKI_ADJ_OFFSET, offset);
-   ADJX(VKI_ADJ_FREQUENCY, freq);
-   ADJX(VKI_ADJ_MAXERROR, maxerror);
-   ADJX(VKI_ADJ_ESTERROR, esterror);
-   ADJX(VKI_ADJ_STATUS, status);
-   ADJX(VKI_ADJ_TIMECONST, constant);
-   ADJX(VKI_ADJ_TICK, tick);
+   if (tx->modes & VKI_ADJ_ADJTIME) {
+      if (!(tx->modes & VKI_ADJ_OFFSET_READONLY))
+         PRE_MEM_READ( "adjtimex(timex->offset)", (Addr)&tx->offset, sizeof(tx->offset));
+   } else {
+      ADJX(VKI_ADJ_OFFSET, offset);
+      ADJX(VKI_ADJ_FREQUENCY, freq);
+      ADJX(VKI_ADJ_MAXERROR, maxerror);
+      ADJX(VKI_ADJ_ESTERROR, esterror);
+      ADJX(VKI_ADJ_STATUS, status);
+      ADJX(VKI_ADJ_TIMECONST|VKI_ADJ_TAI, constant);
+      ADJX(VKI_ADJ_TICK, tick);
+   }
 #undef ADJX
 
    PRE_MEM_WRITE( "adjtimex(timex)", ARG1, sizeof(struct vki_timex));