diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-09-07 14:37:40 +0200 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-09-07 14:59:29 +0200 |
commit | 2b4c03cbc84090174a3cf5d27887bac8fb052b57 (patch) | |
tree | 5765297bc0b861b53526cbed3fb9d2257c456d90 | |
parent | 48b94c74e9817781a1e7a4fdd03fa471953047fb (diff) | |
download | gnumach-2b4c03cbc84090174a3cf5d27887bac8fb052b57.tar.gz gnumach-2b4c03cbc84090174a3cf5d27887bac8fb052b57.tar.bz2 gnumach-2b4c03cbc84090174a3cf5d27887bac8fb052b57.zip |
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.
-rw-r--r-- | kern/mach_clock.c | 6 | ||||
-rw-r--r-- | 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 |