diff --git a/src/gds/awgtpman/awg.c b/src/gds/awgtpman/awg.c
index 18a068833ef8f54aa1f395ea326298b308e745fc..941cc3b9b1ab56cf84f02127a687d9a137c851db 100644
--- a/src/gds/awgtpman/awg.c
+++ b/src/gds/awgtpman/awg.c
@@ -920,7 +920,7 @@ Organization of generating waveforms:
       for (i = 0, p = buf->buf; i < MAX_NUM_AWG; i++, p++) {
          /* test whether valid test point channel */
 
-         AWG_DATA_PAGE *target_page;
+         volatile AWG_DATA_PAGE *target_page;
          switch (p->otype) 
          {
             case awgLSCtp:
diff --git a/src/gds/awgtpman/shared_memory.h b/src/gds/awgtpman/shared_memory.h
index 37ae79f493ce58941cc3af2a114c6f64df685188..8fb2fe4710a41a1c33fbc5a246a405d29b5b25cd 100644
--- a/src/gds/awgtpman/shared_memory.h
+++ b/src/gds/awgtpman/shared_memory.h
@@ -18,4 +18,29 @@ extern volatile AWG_DATA *shmemAwgData;
  */
 int OpenAwgDataSharedMemory(const char *model_name);
 
+
+// helper functions for volatile pointers
+
+/**
+ * Copy to a volatile pointer from a regular pointer.
+ * Works the same as memcpy()
+ * @param dest The destination pointer.  Should be volatile.
+ * @param src The source pointer.
+ * @param len Number of bytes to copy.
+ * @return The destination pointer.
+ */
+volatile void * memcpy_to_vol(volatile void *dest, const void *src, size_t len);
+
+/**
+ *
+ * @param dest
+ * @param src
+ * @param len
+ * @return
+ */
+void * memcpy_from_vol(void *dest, const volatile void *src, size_t len);
+
+volatile void * memcpy_vol_to_vol(volatile void *dest, const volatile void *src, size_t len);
+
+
 #endif // DAQD_TRUNK_SHARED_MEMORY_H