Move immediate.h, marker.h and tracepoint.h to include/ust/
[ust.git] / share / kernelcompat.h
index c5512b8d4c848f4c35ee91c8cc23c9e4f080b3f6..5cc5eaa22e70b963795619b963c1c2f8ed9504da 100644 (file)
@@ -1,9 +1,15 @@
 #ifndef KERNELCOMPAT_H
 #define KERNELCOMPAT_H
 
-#include "compiler.h"
+#include <kcompat.h>
 
 #include <string.h>
+#include <sys/time.h>
+
+/* FIXME: libkcompat must not define arch-specific local ops, as ust *must*
+ * fallback to the normal atomic ops. Fix things so we don't add them and
+ * break things accidentally.
+ */
 
 #define container_of(ptr, type, member) ({                      \
         const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
@@ -38,14 +44,7 @@ static inline long IS_ERR(const void *ptr)
 }
 
 
-/* FIXED SIZE INTEGERS */
-
-#include <stdint.h>
-
-typedef uint8_t u8;
-typedef uint16_t u16;
-typedef uint32_t u32;
-typedef uint64_t u64;
+/* Min / Max */
 
 #define min_t(type, x, y) ({                    \
        type __min1 = (x);                      \
@@ -63,29 +62,24 @@ typedef uint64_t u64;
 #include <pthread.h>
 
 #define DEFINE_MUTEX(m) pthread_mutex_t (m) = PTHREAD_MUTEX_INITIALIZER;
+#define DECLARE_MUTEX(m) extern pthread_mutex_t (m);
 
 #define mutex_lock(m) pthread_mutex_lock(m)
 
 #define mutex_unlock(m) pthread_mutex_unlock(m)
 
-/* SPINLOCKS */
-
-typedef int spinlock_t;
-
-#define spin_lock(a) /* nothing */
-#define spin_unlock(a) /* nothing */
-#define spin_lock_init(a) /* nothing */
-
 
 /* MALLOCATION */
 
 #include <stdlib.h>
 
 #define kmalloc(s, t) malloc(s)
-#define kzalloc(s, t) malloc(s)
+#define kzalloc(s, t) zmalloc(s)
 #define kfree(p) free((void *)p)
 #define kstrdup(s, t) strdup(s)
 
+#define zmalloc(s) calloc(1, s)
+
 #define GFP_KERNEL
 
 /* PRINTK */
@@ -93,133 +87,10 @@ typedef int spinlock_t;
 #include <stdio.h>
 #define printk(fmt, args...) printf(fmt, ## args)
 
-/* MEMORY BARRIERS */
-
-#define smp_rmb() do {} while(0)
-#define smp_wmb() do {} while(0)
-#define smp_mb() do {} while(0)
-#define smp_mb__after_atomic_inc() do {} while(0)
-
-#define read_barrier_depends() do {} while(0)
-#define smp_read_barrier_depends() do {} while(0)
-
-/* RCU */
-
-#define rcu_assign_pointer(a, b) do {} while(0)
-#define call_rcu_sched(a,b) do {} while(0)
-#define rcu_barrier_sched() do {} while(0)
-
-/* ATOMICITY */
-
-#include <signal.h>
-
-typedef struct { sig_atomic_t counter; } atomic_t;
-
-static inline int atomic_dec_and_test(atomic_t *p)
-{
-       (p->counter)--;
-       return !p->counter;
-}
-
-static inline void atomic_set(atomic_t *p, int v)
-{
-       p->counter=v;
-}
-
-static inline void atomic_inc(atomic_t *p)
-{
-       p->counter++;
-}
-
-static int atomic_read(atomic_t *p)
-{
-       return p->counter;
-}
-
-#define atomic_long_t atomic_t
-#define atomic_long_set atomic_set
-#define atomic_long_read atomic_read
-
-#include "asm.h"
-
-#define __xg(x) ((volatile long *)(x))
-
-#define cmpxchg(ptr, o, n)                                             \
-       ((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o),       \
-                                      (unsigned long)(n), sizeof(*(ptr))))
-
-static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
-                                     unsigned long new, int size)
-{
-       unsigned long prev;
-       switch (size) {
-       case 1:
-               asm volatile("lock cmpxchgb %b1,%2"
-                            : "=a"(prev)
-                            : "q"(new), "m"(*__xg(ptr)), "0"(old)
-                            : "memory");
-               return prev;
-       case 2:
-               asm volatile("lock cmpxchgw %w1,%2"
-                            : "=a"(prev)
-                            : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                            : "memory");
-               return prev;
-       case 4:
-               asm volatile("lock cmpxchgl %k1,%2"
-                            : "=a"(prev)
-                            : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                            : "memory");
-               return prev;
-       case 8:
-               asm volatile("lock cmpxchgq %1,%2"
-                            : "=a"(prev)
-                            : "r"(new), "m"(*__xg(ptr)), "0"(old)
-                            : "memory");
-               return prev;
-       }
-       return old;
-}
-
-#define local_cmpxchg cmpxchg
-#define atomic_long_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
-
-
-/* LOCAL OPS */
-
-typedef int local_t;
-
-static inline void local_inc(local_t *a)
-{
-       (*a)++;
-}
-
-static inline void local_set(local_t *a, int v)
-{
-       *a = v;
-}
-
-static inline void local_add(int v, local_t *a)
-{
-       *a += v;
-}
-
-static int local_add_return(int v, local_t *a)
-{
-       return *a += v;
-}
-
-static inline int local_read(local_t *a)
-{
-       return *a;
-}
-
 
 /* ATTRIBUTES */
 
 #define ____cacheline_aligned
-#define __init
-#define __exit
 
 /* MATH */
 
@@ -267,7 +138,7 @@ static __inline__ int get_count_order(unsigned int count)
 #define __ALIGN_MASK(x,mask)   (((x)+(mask))&~(mask))
 #define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)
 #define PAGE_SIZE sysconf(_SC_PAGE_SIZE)
-#define PAGE_MASK (PAGE_SIZE-1)
+#define PAGE_MASK (~(PAGE_SIZE-1))
 
 
 
@@ -278,28 +149,58 @@ static __inline__ int get_count_order(unsigned int count)
 
 /* TRACE CLOCK */
 
+/* There are two types of clocks that can be used.
+   - TSC based clock
+   - gettimeofday() clock
+
+   Microbenchmarks on Linux 2.6.30 on Core2 Duo 3GHz (functions are inlined):
+     Calls (100000000) to tsc(): 4004035641 cycles or 40 cycles/call
+     Calls (100000000) to gettimeofday(): 9723158352 cycles or 97 cycles/call
+
+   For merging traces with the kernel, a time source compatible with that of
+   the kernel is necessary.
+
+*/
+
+#if 0
+/* WARNING: Make sure to set frequency and scaling functions that will not
+ * result in lttv timestamps (sec.nsec) with seconds greater than 2**32-1.
+ */
 static inline u64 trace_clock_read64(void)
 {
-       return 0LL;
-}
+       uint32_t low;
+       uint32_t high;
+       uint64_t retval;
+       __asm__ volatile ("rdtsc\n" : "=a" (low), "=d" (high));
 
-static inline unsigned int trace_clock_frequency(void)
-{
-       return 0LL;
+       retval = high;
+       retval <<= 32;
+       return retval | low;
 }
+#endif
 
-static inline u32 trace_clock_freq_scale(void)
+static inline u64 trace_clock_read64(void)
 {
-       return 0;
-}
+       struct timeval tv;
+       u64 retval;
 
+       gettimeofday(&tv, NULL);
+       retval = tv.tv_sec;
+       retval *= 1000000;
+       retval += tv.tv_usec;
 
-/* LISTS */
+       return retval;
+}
 
-#define list_add_rcu list_add
-#define list_for_each_entry_rcu list_for_each_entry
+static inline u64 trace_clock_frequency(void)
+{
+       return 1000000LL;
+}
 
+static inline u32 trace_clock_freq_scale(void)
+{
+       return 1;
+}
 
-#define EXPORT_SYMBOL_GPL(a) /*nothing*/
 
 #endif /* KERNELCOMPAT_H */
This page took 0.025877 seconds and 4 git commands to generate.