summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kern/mach_clock.c6
-rw-r--r--kern/macros.h2
2 files changed, 5 insertions, 3 deletions
diff --git a/kern/mach_clock.c b/kern/mach_clock.c
index 655adf40..2bcd2325 100644
--- a/kern/mach_clock.c
+++ b/kern/mach_clock.c
@@ -426,9 +426,9 @@ host_get_time(host, current_time)
return(KERN_INVALID_HOST);
do {
- current_time->seconds = mtime->seconds;
- current_time->microseconds = mtime->microseconds;
- } while (current_time->seconds != mtime->check_seconds);
+ current_time->seconds = access_once(mtime->seconds);
+ current_time->microseconds = access_once(mtime->microseconds);
+ } while (current_time->seconds != access_once(mtime->check_seconds));
return (KERN_SUCCESS);
}
diff --git a/kern/macros.h b/kern/macros.h
index 7cc579d1..c2e8545a 100644
--- a/kern/macros.h
+++ b/kern/macros.h
@@ -52,6 +52,8 @@
#define structof(ptr, type, member) \
((type *)((char *)(ptr) - offsetof(type, member)))
+#define access_once(x) (*(volatile typeof(x) *)&(x))
+
#define alignof(x) __alignof__(x)
#ifndef likely