summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cpukit/score/include/sys/timetc.h14
-rw-r--r--cpukit/score/src/kern_tc.c19
2 files changed, 28 insertions, 5 deletions
diff --git a/cpukit/score/include/sys/timetc.h b/cpukit/score/include/sys/timetc.h
index 73e63f7333..361535c0c8 100644
--- a/cpukit/score/include/sys/timetc.h
+++ b/cpukit/score/include/sys/timetc.h
@@ -30,8 +30,18 @@
*/
struct timecounter;
+struct vdso_timehands;
+struct vdso_timehands32;
+#ifndef __rtems__
+typedef u_int timecounter_get_t(struct timecounter *);
+#else /* __rtems__ */
typedef uint32_t timecounter_get_t(struct timecounter *);
+#endif /* __rtems__ */
typedef void timecounter_pps_t(struct timecounter *);
+typedef uint32_t timecounter_fill_vdso_timehands_t(struct vdso_timehands *,
+ struct timecounter *);
+typedef uint32_t timecounter_fill_vdso_timehands32_t(struct vdso_timehands32 *,
+ struct timecounter *);
struct timecounter {
timecounter_get_t *tc_get_timecount;
@@ -70,6 +80,10 @@ struct timecounter {
/* Pointer to the timecounter's private parts. */
struct timecounter *tc_next;
/* Pointer to the next timecounter. */
+#ifndef __rtems__
+ timecounter_fill_vdso_timehands_t *tc_fill_vdso_timehands;
+ timecounter_fill_vdso_timehands32_t *tc_fill_vdso_timehands32;
+#endif /* __rtems__ */
};
extern struct timecounter *timecounter;
diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c
index 78e1308188..272461d9b4 100644
--- a/cpukit/score/src/kern_tc.c
+++ b/cpukit/score/src/kern_tc.c
@@ -6,11 +6,14 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * Copyright (c) 2011 The FreeBSD Foundation
+ * Copyright (c) 2011, 2015, 2016 The FreeBSD Foundation
* All rights reserved.
*
* Portions of this software were developed by Julien Ridoux at the University
* of Melbourne under sponsorship from the FreeBSD Foundation.
+ *
+ * Portions of this software were developed by Konstantin Belousov
+ * under sponsorship from the FreeBSD Foundation.
*/
#ifdef __rtems__
@@ -2388,13 +2391,16 @@ tc_fill_vdso_timehands(struct vdso_timehands *vdso_th)
uint32_t enabled;
th = timehands;
- vdso_th->th_algo = VDSO_TH_ALGO_1;
vdso_th->th_scale = th->th_scale;
vdso_th->th_offset_count = th->th_offset_count;
vdso_th->th_counter_mask = th->th_counter->tc_counter_mask;
vdso_th->th_offset = th->th_offset;
vdso_th->th_boottime = th->th_boottime;
- enabled = cpu_fill_vdso_timehands(vdso_th, th->th_counter);
+ if (th->th_counter->tc_fill_vdso_timehands != NULL) {
+ enabled = th->th_counter->tc_fill_vdso_timehands(vdso_th,
+ th->th_counter);
+ } else
+ enabled = 0;
if (!vdso_th_enable)
enabled = 0;
return (enabled);
@@ -2409,7 +2415,6 @@ tc_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32)
uint32_t enabled;
th = timehands;
- vdso_th32->th_algo = VDSO_TH_ALGO_1;
*(uint64_t *)&vdso_th32->th_scale[0] = th->th_scale;
vdso_th32->th_offset_count = th->th_offset_count;
vdso_th32->th_counter_mask = th->th_counter->tc_counter_mask;
@@ -2417,7 +2422,11 @@ tc_fill_vdso_timehands32(struct vdso_timehands32 *vdso_th32)
*(uint64_t *)&vdso_th32->th_offset.frac[0] = th->th_offset.frac;
vdso_th32->th_boottime.sec = th->th_boottime.sec;
*(uint64_t *)&vdso_th32->th_boottime.frac[0] = th->th_boottime.frac;
- enabled = cpu_fill_vdso_timehands32(vdso_th32, th->th_counter);
+ if (th->th_counter->tc_fill_vdso_timehands32 != NULL) {
+ enabled = th->th_counter->tc_fill_vdso_timehands32(vdso_th32,
+ th->th_counter);
+ } else
+ enabled = 0;
if (!vdso_th_enable)
enabled = 0;
return (enabled);