From: Thomas Leonard <talex5@gmail.com>
To: xen-devel@lists.xenproject.org
Cc: Thomas Leonard <talex5@gmail.com>,
Ian.Campbell@citrix.com, anil@recoil.org,
stefano.stabellini@eu.citrix.com, samuel.thibault@ens-lyon.org,
Dave.Scott@eu.citrix.com
Subject: [PATCH ARM v8 1/4] mini-os: arm: time
Date: Fri, 3 Oct 2014 10:20:48 +0100 [thread overview]
Message-ID: <1412328051-20015-2-git-send-email-talex5@gmail.com> (raw)
In-Reply-To: <1412328051-20015-1-git-send-email-talex5@gmail.com>
Based on an initial patch by Karim Raslan.
Signed-off-by: Karim Allah Ahmed <karim.allah.ahmed@gmail.com>
Signed-off-by: Thomas Leonard <talex5@gmail.com>
---
Changes since v7:
Addressed Ian Campbell's comments:
- removed unnecessary isb
- removed some debug comments
- simplified some of the asm calls
---
| 136 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 136 insertions(+)
create mode 100644 extras/mini-os/arch/arm/time.c
--git a/extras/mini-os/arch/arm/time.c b/extras/mini-os/arch/arm/time.c
new file mode 100644
index 0000000..a088981
--- /dev/null
+++ b/extras/mini-os/arch/arm/time.c
@@ -0,0 +1,136 @@
+#include <mini-os/os.h>
+#include <mini-os/hypervisor.h>
+#include <mini-os/events.h>
+#include <mini-os/traps.h>
+#include <mini-os/types.h>
+#include <mini-os/time.h>
+#include <mini-os/lib.h>
+
+//#define VTIMER_DEBUG
+#ifdef VTIMER_DEBUG
+#define DEBUG(_f, _a...) \
+ printk("MINI_OS(file=vtimer.c, line=%d) " _f , __LINE__, ## _a)
+#else
+#define DEBUG(_f, _a...) ((void)0)
+#endif
+
+/************************************************************************
+ * Time functions
+ *************************************************************************/
+
+static uint64_t cntvct_at_init;
+static uint32_t counter_freq;
+
+/* Compute with 96 bit intermediate result: (a*b)/c */
+uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c)
+{
+ union {
+ uint64_t ll;
+ struct {
+ uint32_t low, high;
+ } l;
+ } u, res;
+ uint64_t rl, rh;
+
+ u.ll = a;
+ rl = (uint64_t)u.l.low * (uint64_t)b;
+ rh = (uint64_t)u.l.high * (uint64_t)b;
+ rh += (rl >> 32);
+ res.l.high = rh / c;
+ res.l.low = (((rh % c) << 32) + (rl & 0xffffffff)) / c;
+ return res.ll;
+}
+
+static inline s_time_t ticks_to_ns(uint64_t ticks)
+{
+ return muldiv64(ticks, SECONDS(1), counter_freq);
+}
+
+static inline uint64_t ns_to_ticks(s_time_t ns)
+{
+ return muldiv64(ns, counter_freq, SECONDS(1));
+}
+
+/* Wall-clock time is not currently available on ARM, so this is always zero for now:
+ * http://wiki.xenproject.org/wiki/Xen_ARM_TODO#Expose_Wallclock_time_to_guests
+ */
+static struct timespec shadow_ts;
+
+static inline uint64_t read_virtual_count(void)
+{
+ uint32_t c_lo, c_hi;
+ __asm__ __volatile__("mrrc p15, 1, %0, %1, c14":"=r"(c_lo), "=r"(c_hi));
+ return (((uint64_t) c_hi) << 32) + c_lo;
+}
+
+/* monotonic_clock(): returns # of nanoseconds passed since time_init()
+ * Note: This function is required to return accurate
+ * time even in the absence of multiple timer ticks.
+ */
+uint64_t monotonic_clock(void)
+{
+ return ticks_to_ns(read_virtual_count() - cntvct_at_init);
+}
+
+int gettimeofday(struct timeval *tv, void *tz)
+{
+ uint64_t nsec = monotonic_clock();
+ nsec += shadow_ts.tv_nsec;
+
+ tv->tv_sec = shadow_ts.tv_sec;
+ tv->tv_sec += NSEC_TO_SEC(nsec);
+ tv->tv_usec = NSEC_TO_USEC(nsec % 1000000000UL);
+
+ return 0;
+}
+
+/* Set the timer and mask. */
+void write_timer_ctl(uint32_t value) {
+ __asm__ __volatile__(
+ "mcr p15, 0, %0, c14, c3, 1\n"
+ "isb"::"r"(value));
+}
+
+void set_vtimer_compare(uint64_t value) {
+ DEBUG("New CompareValue : %llx\n", value);
+
+ __asm__ __volatile__("mcrr p15, 3, %0, %H0, c14"
+ ::"r"(value));
+
+ /* Enable timer and unmask the output signal */
+ write_timer_ctl(1);
+}
+
+void unset_vtimer_compare(void) {
+ /* Disable timer and mask the output signal */
+ write_timer_ctl(2);
+}
+
+void block_domain(s_time_t until)
+{
+ uint64_t until_count = ns_to_ticks(until) + cntvct_at_init;
+ ASSERT(irqs_disabled());
+ if (read_virtual_count() < until_count)
+ {
+ set_vtimer_compare(until_count);
+ __asm__ __volatile__("wfi");
+ unset_vtimer_compare();
+
+ /* Give the IRQ handler a chance to handle whatever woke us up. */
+ local_irq_enable();
+ local_irq_disable();
+ }
+}
+
+void init_time(void)
+{
+ printk("Initialising timer interface\n");
+
+ __asm__ __volatile__("mrc p15, 0, %0, c14, c0, 0":"=r"(counter_freq));
+ cntvct_at_init = read_virtual_count();
+ printk("Virtual Count register is %llx, freq = %d Hz\n", cntvct_at_init, counter_freq);
+}
+
+void fini_time(void)
+{
+}
--
2.1.1
next prev parent reply other threads:[~2014-10-03 9:19 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-03 9:20 [PATCH ARM v8 0/4] mini-os: initial ARM support Thomas Leonard
2014-10-03 9:20 ` Thomas Leonard [this message]
2014-10-21 10:50 ` [PATCH ARM v8 1/4] mini-os: arm: time Ian Campbell
2014-10-21 14:07 ` [PATCH incomplete] xen: arm: wallclock support (incomplete, needs work/refactoring) Ian Campbell
2014-10-26 9:51 ` [PATCH ARM v8 1/4] mini-os: arm: time Thomas Leonard
2014-10-27 10:34 ` Ian Campbell
2014-11-13 16:29 ` Thomas Leonard
2014-11-14 10:29 ` Ian Campbell
2014-11-19 20:57 ` Konrad Rzeszutek Wilk
2015-01-08 15:52 ` Ian Campbell
2015-01-08 15:58 ` Thomas Leonard
2015-01-08 16:04 ` Ian Campbell
2014-10-03 9:20 ` [PATCH ARM v8 2/4] mini-os: arm: interrupt controller Thomas Leonard
2014-10-21 11:00 ` Ian Campbell
2014-10-21 14:26 ` Julien Grall
2014-10-21 15:16 ` Ian Campbell
2014-10-21 15:22 ` Julien Grall
2014-10-21 15:35 ` Ian Campbell
2014-10-21 16:03 ` Julien Grall
2014-10-21 18:14 ` Anil Madhavapeddy
2014-10-21 19:18 ` Ian Campbell
2014-10-21 21:54 ` Samuel Thibault
2014-10-22 9:03 ` Ian Campbell
2014-10-22 13:06 ` Julien Grall
2014-10-22 13:14 ` Samuel Thibault
2014-10-28 15:15 ` Thomas Leonard
2014-10-28 15:25 ` Julien Grall
2014-10-28 15:43 ` Thomas Leonard
2014-10-28 15:51 ` Julien Grall
2014-11-14 10:22 ` Thomas Leonard
2014-11-14 11:33 ` Julien Grall
2014-11-14 11:42 ` Ian Campbell
2014-11-14 11:48 ` Julien Grall
2014-11-14 12:01 ` Ian Campbell
2014-10-03 9:20 ` [PATCH ARM v8 3/4] mini-os: arm: build system Thomas Leonard
2014-10-21 11:44 ` Ian Campbell
2014-10-21 21:50 ` Samuel Thibault
2014-10-22 9:01 ` Ian Campbell
2014-10-22 9:59 ` Samuel Thibault
2014-10-26 9:46 ` Thomas Leonard
2014-10-26 9:55 ` Samuel Thibault
2014-10-26 10:25 ` Thomas Leonard
2014-11-17 11:42 ` Thomas Leonard
2014-11-17 11:45 ` Ian Campbell
2014-11-17 11:47 ` Andrew Cooper
2014-11-17 11:47 ` Samuel Thibault
2014-10-03 9:20 ` [PATCH ARM v8 4/4] mini-os: arm: show registers, stack and exception vector on fault Thomas Leonard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1412328051-20015-2-git-send-email-talex5@gmail.com \
--to=talex5@gmail.com \
--cc=Dave.Scott@eu.citrix.com \
--cc=Ian.Campbell@citrix.com \
--cc=anil@recoil.org \
--cc=samuel.thibault@ens-lyon.org \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).