#ifndef KERNELCOMPAT_H
#define KERNELCOMPAT_H
+#include <compiler.h>
#include <kcompat.h>
-#include "compiler.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); \
(type *)( (char *)__mptr - offsetof(type,member) );})
}
-/* 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); \
#include <stdio.h>
#define printk(fmt, args...) printf(fmt, ## args)
-/* MEMORY BARRIERS */
-
-//#define smp_mb__after_atomic_inc() do {} while(0)
-
-///* RCU */
-//
-//#include "urcu.h"
-//#define call_rcu_sched(a,b) b(a); synchronize_rcu()
-//#define rcu_barrier_sched() do {} while(0) /* this nop is ok if call_rcu_sched does a synchronize_rcu() */
-//#define rcu_read_lock_sched_notrace() rcu_read_lock()
-//#define rcu_read_unlock_sched_notrace() rcu_read_unlock()
-
-/* ATOMICITY */
-
-//#include <signal.h>
-//
-//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
-
-//#define __xg(x) ((volatile long *)(x))
-
-//#define cmpxchg(ptr, o, n) \
-// ((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \
- (unsigned long)(n), sizeof(*(ptr))))
-
-//#define local_cmpxchg cmpxchg
-//#define local_cmpxchg(l, o, n) (cmpxchg(&((l)->a.counter), (o), (n)))
-
-//#define atomic_long_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
-
-
-/* LOCAL OPS */
-
-//typedef int local_t;
-//typedef struct
-//{
-// atomic_long_t a;
-//} local_t;
-//
-//
-//static inline void local_inc(local_t *l)
-//{
-// (l->a.counter)++;
-//}
-//
-//static inline void local_set(local_t *l, int v)
-//{
-// l->a.counter = v;
-//}
-//
-//static inline void local_add(int v, local_t *l)
-//{
-// l->a.counter += v;
-//}
-//
-//static int local_add_return(int v, local_t *l)
-//{
-// return l->a.counter += v;
-//}
-//
-//static inline int local_read(local_t *l)
-//{
-// return l->a.counter;
-//}
-
/* ATTRIBUTES */
#define ____cacheline_aligned
-#define __init
-#define __exit
/* MATH */
#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))
/* TRACE CLOCK */
-//ust// static inline u64 trace_clock_read64(void)
-//ust// {
-//ust// uint32_t low;
-//ust// uint32_t high;
-//ust// uint64_t retval;
-//ust// __asm__ volatile ("rdtsc\n" : "=a" (low), "=d" (high));
-//ust//
-//ust// retval = high;
-//ust// retval <<= 32;
-//ust// return retval | low;
-//ust// }
-
static inline u64 trace_clock_read64(void)
{
- struct timeval tv;
- u64 retval;
-
- gettimeofday(&tv, NULL);
- retval = tv.tv_sec;
- retval *= 1000000;
- retval += tv.tv_usec;
-
- return retval;
+ uint32_t low;
+ uint32_t high;
+ uint64_t retval;
+ __asm__ volatile ("rdtsc\n" : "=a" (low), "=d" (high));
+
+ retval = high;
+ retval <<= 32;
+ return retval | low;
}
+//static inline u64 trace_clock_read64(void)
+//{
+// struct timeval tv;
+// u64 retval;
+//
+// gettimeofday(&tv, NULL);
+// retval = tv.tv_sec;
+// retval *= 1000000;
+// retval += tv.tv_usec;
+//
+// return retval;
+//}
+
static inline u64 trace_clock_frequency(void)
{
return 1000000LL;
}
-/* LISTS */
-
-#define list_add_rcu list_add
-#define list_for_each_entry_rcu list_for_each_entry
-
-
-#define EXPORT_SYMBOL_GPL(a) /*nothing*/
-
-#define smp_processor_id() (-1)
-
#endif /* KERNELCOMPAT_H */