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