Reworks MCS-PDR locks to avoid preempt storms
[akaros.git] / user / parlib / timing.c
1 #include <ros/common.h>
2 #include <ros/procinfo.h>
3 #include <arch/arch.h>
4 #include <stdio.h>
5 #include <tsc-compat.h>
6
7 void udelay(uint64_t usec)
8 {
9         uint64_t start, end, now;
10
11         start = read_tsc();
12     end = start + (get_tsc_freq() * usec) / 1000000;
13         do {
14         cpu_relax();
15         now = read_tsc();
16         } while (now < end || (now > start && end < start));
17 }
18
19 /* Not super accurate, due to overheads of reading tsc and looping */
20 void ndelay(uint64_t nsec)
21 {
22         uint64_t start, end, now;
23
24         start = read_tsc();
25     end = start + (get_tsc_freq() * nsec) / 1000000000;
26         do {
27         cpu_relax();
28         now = read_tsc();
29         } while (now < end || (now > start && end < start));
30 }
31
32 /* Difference between the ticks in microseconds */
33 uint64_t udiff(uint64_t begin, uint64_t end)
34 {
35         return (end - begin) * 1000000 /  __procinfo.tsc_freq;
36 }
37
38 /* Difference between the ticks in nanoseconds */
39 uint64_t ndiff(uint64_t begin, uint64_t end)
40 {
41         return (end - begin) * 1000000000 /  __procinfo.tsc_freq;
42 }