summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/patches/clock_boottime0001-yyy-clock_boottime.patch190
-rw-r--r--debian/patches/series1
2 files changed, 191 insertions, 0 deletions
diff --git a/debian/patches/clock_boottime0001-yyy-clock_boottime.patch b/debian/patches/clock_boottime0001-yyy-clock_boottime.patch
new file mode 100644
index 0000000..5e4e3cf
--- /dev/null
+++ b/debian/patches/clock_boottime0001-yyy-clock_boottime.patch
@@ -0,0 +1,190 @@
+From 8f9c75cd7470e1c4ff93f0a60b4a32a207471209 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Sat, 25 Jul 2015 18:23:10 +0200
+Subject: [PATCH gnumach] yyy clock_boottime
+
+---
+ include/mach/time_value.h | 40 ++++++++++++++++++++++++++++++++--------
+ kern/mach_clock.c | 36 +++++++++++++++++++++++++++++++++++-
+ kern/mach_clock.h | 11 ++++++++++-
+ kern/task.c | 3 ++-
+ kern/thread.c | 3 ++-
+ 5 files changed, 81 insertions(+), 12 deletions(-)
+
+diff --git a/include/mach/time_value.h b/include/mach/time_value.h
+index 2a2f091..fdfd2dc 100644
+--- a/include/mach/time_value.h
++++ b/include/mach/time_value.h
+@@ -45,22 +45,46 @@ typedef struct time_value time_value_t;
+ */
+ #define TIME_MICROS_MAX (1000000)
+
++#define time_value_assert(val) \
++ assert(0 <= (val)->microseconds && (val)->microseconds < TIME_MICROS_MAX);
++
+ #define time_value_add_usec(val, micros) { \
++ time_value_assert(val); \
+ if (((val)->microseconds += (micros)) \
+ >= TIME_MICROS_MAX) { \
+ (val)->microseconds -= TIME_MICROS_MAX; \
+ (val)->seconds++; \
+ } \
++ time_value_assert(val); \
+ }
+
+-#define time_value_add(result, addend) { \
+- (result)->microseconds += (addend)->microseconds; \
+- (result)->seconds += (addend)->seconds; \
+- if ((result)->microseconds >= TIME_MICROS_MAX) { \
+- (result)->microseconds -= TIME_MICROS_MAX; \
+- (result)->seconds++; \
+- } \
+-}
++/* XXX */
++#define abs(x) ((x) < 0? -(x): (x))
++
++#define time_value_add_sub(val, signum, operand) { \
++ time_value_assert(val); \
++ time_value_assert(operand); \
++ (val)->seconds += (signum) * abs((operand)->seconds); \
++ (val)->microseconds += (signum) * (operand)->microseconds; \
++ if ((val)->microseconds >= TIME_MICROS_MAX) { \
++ (val)->microseconds -= TIME_MICROS_MAX; \
++ (val)->seconds++; \
++ } else \
++ if ((val)->microseconds < 0) { \
++ (val)->microseconds += TIME_MICROS_MAX; \
++ (val)->seconds--; \
++ } \
++ time_value_assert(val); \
++ }
++
++/* XXX */
++#define sgn(x) ((x) < 0? -1: ((x) > 0? 1: 0))
++
++#define time_value_add(result, addend) \
++ time_value_add_sub(result, sgn((addend)->seconds), addend)
++
++#define time_value_sub(result, subtrahend) \
++ time_value_add_sub(result, -1 * sgn((subtrahend)->seconds), subtrahend)
+
+ /*
+ * Time value available through the mapped-time interface.
+diff --git a/kern/mach_clock.c b/kern/mach_clock.c
+index b627b89..655adf4 100644
+--- a/kern/mach_clock.c
++++ b/kern/mach_clock.c
+@@ -367,9 +367,30 @@ void init_timeout(void)
+
+ elapsed_ticks = 0;
+ }
++
++/*
++ * We record timestamps using the boot-time clock. We keep track of
++ * the boot-time clock by storing the difference to the real-time
++ * clock.
++ */
++struct time_value clock_boottime_offset;
++
++/*
++ * Update the offset of the boot-time clock from the real-time clock.
++ * This function must be called when the real-time clock is updated.
++ * This function must be called at SPLHIGH.
++ */
++void
++clock_boottime_update(struct time_value *new_time)
++{
++ struct time_value delta = time;
++ time_value_sub(&delta, new_time);
++ time_value_add(&clock_boottime_offset, &delta);
++}
+
+ /*
+- * Record a timestamp in STAMP.
++ * Record a timestamp in STAMP. Records values in the boot-time clock
++ * frame.
+ */
+ void
+ record_time_stamp (time_value_t *stamp)
+@@ -378,6 +399,18 @@ record_time_stamp (time_value_t *stamp)
+ stamp->seconds = mtime->seconds;
+ stamp->microseconds = mtime->microseconds;
+ } while (stamp->seconds != mtime->check_seconds);
++ time_value_add(stamp, &clock_boottime_offset);
++}
++
++/*
++ * Read a timestamp in STAMP into RESULT. Returns values in the
++ * real-time clock frame.
++ */
++void
++read_time_stamp (time_value_t *stamp, time_value_t *result)
++{
++ *result = *stamp;
++ time_value_sub(result, &clock_boottime_offset);
+ }
+
+
+@@ -423,6 +456,7 @@ host_set_time(host, new_time)
+ #endif /* NCPUS > 1 */
+
+ s = splhigh();
++ clock_boottime_update(&new_time);
+ time = new_time;
+ update_mapped_time(&time);
+ resettodr();
+diff --git a/kern/mach_clock.h b/kern/mach_clock.h
+index 89fd335..1af0cda 100644
+--- a/kern/mach_clock.h
++++ b/kern/mach_clock.h
+@@ -86,9 +86,18 @@ extern boolean_t reset_timeout(timer_elt_t telt);
+
+ extern void init_timeout (void);
+
+-/* Read the current time into STAMP. */
++/*
++ * Record a timestamp in STAMP. Records values in the boot-time clock
++ * frame.
++ */
+ extern void record_time_stamp (time_value_t *stamp);
+
++/*
++ * Read a timestamp in STAMP into RESULT. Returns values in the
++ * real-time clock frame.
++ */
++extern void read_time_stamp (time_value_t *stamp, time_value_t *result);
++
+ extern kern_return_t host_get_time(
+ host_t host,
+ time_value_t *current_time);
+diff --git a/kern/task.c b/kern/task.c
+index b384347..9a3d848 100644
+--- a/kern/task.c
++++ b/kern/task.c
+@@ -783,7 +783,8 @@ kern_return_t task_info(
+ = task->total_system_time.seconds;
+ basic_info->system_time.microseconds
+ = task->total_system_time.microseconds;
+- basic_info->creation_time = task->creation_time;
++ read_time_stamp(&task->creation_time,
++ &basic_info->creation_time);
+ task_unlock(task);
+
+ if (*task_info_count > TASK_BASIC_INFO_COUNT)
+diff --git a/kern/thread.c b/kern/thread.c
+index 1f47553..865a1cc 100644
+--- a/kern/thread.c
++++ b/kern/thread.c
+@@ -1503,7 +1503,8 @@ kern_return_t thread_info(
+ &basic_info->system_time);
+ basic_info->base_priority = thread->priority;
+ basic_info->cur_priority = thread->sched_pri;
+- basic_info->creation_time = thread->creation_time;
++ read_time_stamp(&thread->creation_time,
++ &basic_info->creation_time);
+
+ /*
+ * To calculate cpu_usage, first correct for timer rate,
+--
+2.1.4
+
diff --git a/debian/patches/series b/debian/patches/series
index 029e46a..25d8cf2 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -13,3 +13,4 @@ sysenter0001-yyy-sysenter-prototype.patch
vm-cache-policy0001-VM-cache-policy-change.patch
vm-cache-policy0002-vm-keep-track-of-clean-pages.patch
vm-cache-policy0003-vm-evict-clean-pages-first.patch
+clock_boottime0001-yyy-clock_boottime.patch