diff options
Diffstat (limited to 'debian/patches/try-fence0002-kern-fix-loop-reading-the-time-value.patch')
-rw-r--r-- | debian/patches/try-fence0002-kern-fix-loop-reading-the-time-value.patch | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/debian/patches/try-fence0002-kern-fix-loop-reading-the-time-value.patch b/debian/patches/try-fence0002-kern-fix-loop-reading-the-time-value.patch new file mode 100644 index 0000000..4305819 --- /dev/null +++ b/debian/patches/try-fence0002-kern-fix-loop-reading-the-time-value.patch @@ -0,0 +1,49 @@ +From 5b02c9e8a6f5e41ed4da7f79ddee60a0d0941201 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: [PATCH gnumach 2/2] 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 aab7010..0757f6c 100644 +--- a/kern/mach_clock.c ++++ b/kern/mach_clock.c +@@ -428,9 +428,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 7cc579d..c2e8545 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 +-- +2.1.4 + |