From 2b4c03cbc84090174a3cf5d27887bac8fb052b57 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Mon, 7 Sep 2015 14:37:40 +0200 Subject: kern: fix loop reading the time value Previously, recent versions of gcc would hoist the loads out of the loop reading the time value. * kern/macros.h (access_once): New macro. * kern/mach_clock.c (host_get_time): Use the new macro to prevent the loads from being hoisted out of the loop. --- kern/mach_clock.c | 6 +++--- kern/macros.h | 2 ++ 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 -- cgit v1.2.3