nobase_include_HEADERS = \
ust/immediate.h \
- ust/kernelcompat.h \
ust/marker.h \
ust/tracepoint.h \
ust/processor.h \
--- /dev/null
+/* Copyright (C) 2010 Pierre-Marc Fournier
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef UST_CLOCK_H
+#define UST_CLOCK_H
+
+#include <sys/time.h>
+#include <ust/kcompat/kcompat.h>
+
+/* 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.
+
+*/
+
+#define TRACE_CLOCK_GENERIC
+#ifdef TRACE_CLOCK_GENERIC
+
+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;
+}
+
+#else
+
+#if __i386 || __x86_64
+
+/* 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)
+{
+ uint32_t low;
+ uint32_t high;
+ uint64_t retval;
+ __asm__ volatile ("rdtsc\n" : "=a" (low), "=d" (high));
+
+ retval = high;
+ retval <<= 32;
+ return retval | low;
+}
+
+#endif /* __i386 || __x86_64 */
+
+#ifdef __PPC__
+
+static __inline__ u64 trace_clock_read64(void)
+{
+ unsigned long tb_l;
+ unsigned long tb_h;
+ unsigned long tb_h2;
+ u64 tb;
+
+ __asm__ (
+ "1:\n\t"
+ "mftbu %[rhigh]\n\t"
+ "mftb %[rlow]\n\t"
+ "mftbu %[rhigh2]\n\t"
+ "cmpw %[rhigh],%[rhigh2]\n\t"
+ "bne 1b\n\t"
+ : [rhigh] "=r" (tb_h), [rhigh2] "=r" (tb_h2), [rlow] "=r" (tb_l));
+
+ tb = tb_h;
+ tb <<= 32;
+ tb |= tb_l;
+
+ return tb;
+}
+
+#endif /* __PPC__ */
+
+#endif /* ! UST_TRACE_CLOCK_GENERIC */
+
+static __inline__ u64 trace_clock_frequency(void)
+{
+ return 1000000LL;
+}
+
+static __inline__ u32 trace_clock_freq_scale(void)
+{
+ return 1;
+}
+
+#endif /* UST_CLOCK_H */
+/* Copyright (C) 2010 Pierre-Marc Fournier
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
#ifndef UST_CORE_H
#define UST_CORE_H
+#include <sys/types.h>
+
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+
#if defined(CONFIG_LTT) && defined(CONFIG_LTT_ALIGNMENT)
/*
}
#endif /* defined(CONFIG_LTT) && defined(CONFIG_LTT_ALIGNMENT) */
+
+/* ARRAYS */
+
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+
+/* ALIGNMENT SHORTCUTS */
+
+#include <unistd.h>
+
+#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
+#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))
+
+/* ERROR OPS */
+#define MAX_ERRNO 4095
+
+#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
+
+static inline void *ERR_PTR(long error)
+{
+ return (void *) error;
+}
+
+static inline long PTR_ERR(const void *ptr)
+{
+ return (long) ptr;
+}
+
+static inline long IS_ERR(const void *ptr)
+{
+ return IS_ERR_VALUE((unsigned long)ptr);
+}
+
+
+/* Min / Max */
+
+#define min_t(type, x, y) ({ \
+ type __min1 = (x); \
+ type __min2 = (y); \
+ __min1 < __min2 ? __min1: __min2; })
+
+#define max_t(type, x, y) ({ \
+ type __max1 = (x); \
+ type __max2 = (y); \
+ __max1 > __max2 ? __max1: __max2; })
+
+
+/* MUTEXES */
+
+#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)
+
+
+/* MALLOCATION */
+
+#define zmalloc(s) calloc(1, s)
+
+/* ATTRIBUTES */
+
+/* FIXME: define this */
+#define ____cacheline_aligned
+
+/* MATH */
+
+#include <ust/processor.h>
+static inline unsigned int hweight32(unsigned int w)
+{
+ unsigned int res = w - ((w >> 1) & 0x55555555);
+ res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
+ res = (res + (res >> 4)) & 0x0F0F0F0F;
+ res = res + (res >> 8);
+ return (res + (res >> 16)) & 0x000000FF;
+}
+
+static __inline__ int get_count_order(unsigned int count)
+{
+ int order;
+
+ order = fls(count) - 1;
+ if (count & (count - 1))
+ order++;
+ return order;
+}
+
+#define container_of(ptr, type, member) ({ \
+ const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+ (type *)( (char *)__mptr - offsetof(type,member) );})
+
#endif /* UST_CORE_H */
+++ /dev/null
-/* Copyright (C) 2009 Pierre-Marc Fournier
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef KERNELCOMPAT_H
-#define KERNELCOMPAT_H
-
-#include <ust/kcompat/kcompat.h>
-#include <urcu/list.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) );})
-
-/* ERROR OPS */
-#define MAX_ERRNO 4095
-
-#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
-
-static inline void *ERR_PTR(long error)
-{
- return (void *) error;
-}
-
-static inline long PTR_ERR(const void *ptr)
-{
- return (long) ptr;
-}
-
-static inline long IS_ERR(const void *ptr)
-{
- return IS_ERR_VALUE((unsigned long)ptr);
-}
-
-
-/* Min / Max */
-
-#define min_t(type, x, y) ({ \
- type __min1 = (x); \
- type __min2 = (y); \
- __min1 < __min2 ? __min1: __min2; })
-
-#define max_t(type, x, y) ({ \
- type __max1 = (x); \
- type __max2 = (y); \
- __max1 > __max2 ? __max1: __max2; })
-
-
-/* MUTEXES */
-
-#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)
-
-
-/* MALLOCATION */
-
-#define zmalloc(s) calloc(1, s)
-
-/* ATTRIBUTES */
-
-/* FIXME: define this */
-#define ____cacheline_aligned
-
-/* MATH */
-
-#include <ust/processor.h>
-static inline unsigned int hweight32(unsigned int w)
-{
- unsigned int res = w - ((w >> 1) & 0x55555555);
- res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
- res = (res + (res >> 4)) & 0x0F0F0F0F;
- res = res + (res >> 8);
- return (res + (res >> 16)) & 0x000000FF;
-}
-
-static __inline__ int get_count_order(unsigned int count)
-{
- int order;
-
- order = fls(count) - 1;
- if (count & (count - 1))
- order++;
- return order;
-}
-
-
-
-
-#include <unistd.h>
-
-#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
-#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))
-
-
-
-
-/* ARRAYS */
-
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
-
-/* 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)
-{
- uint32_t low;
- uint32_t high;
- uint64_t retval;
- __asm__ volatile ("rdtsc\n" : "=a" (low), "=d" (high));
-
- retval = high;
- retval <<= 32;
- return retval | low;
-}
-#endif
-
-#include <sys/time.h>
-
-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;
-}
-
-static inline u32 trace_clock_freq_scale(void)
-{
- return 1;
-}
-
-#endif /* KERNELCOMPAT_H */
#include <stdarg.h>
#include <ust/immediate.h>
-#include <ust/kernelcompat.h>
+#include <ust/core.h>
#include <urcu/list.h>
#include <ust/processor.h>
+#include <ust/kcompat/kcompat.h>
#include <bits/wordsize.h>
* Ported to userspace by Pierre-Marc Fournier.
*/
-//#include <linux/immediate.h>
-//#include <linux/types.h>
-//#include <linux/rcupdate.h>
-
#define _LGPL_SOURCE
#include <urcu-bp.h>
-
#include <ust/immediate.h>
-#include <ust/kernelcompat.h>
+#include <ust/core.h>
struct module;
struct tracepoint;
#define UST_H
#include <ust/immediate.h>
-#include <ust/kernelcompat.h>
#include <ust/marker.h>
#include <ust/processor.h>
#include <ust/tracepoint.h>
#include <stdarg.h>
#include <stdio.h>
+#include <ust/core.h>
+
#include "share.h"
#ifndef UST_COMPONENT
#include <sys/ipc.h>
#include <sys/shm.h>
#include <fcntl.h>
-#include <ust/kernelcompat.h>
#include <stdlib.h>
+
+#include <ust/clock.h>
+
#include "buffers.h"
#include "channels.h"
#include "tracer.h"
#define _UST_BUFFERS_H
#include <assert.h>
-#include <ust/kernelcompat.h>
+
+#include <ust/core.h>
+
#include "usterr.h"
#include "channels.h"
#include "tracerconst.h"
*/
#include <stdlib.h>
-#include <ust/kernelcompat.h>
#include <ust/marker.h>
#include "channels.h"
#include "usterr.h"
#include <linux/limits.h>
#include <errno.h>
-
-#include <ust/kernelcompat.h>
+#include <ust/kcompat/kcompat.h>
+#include <urcu/list.h>
+#include <ust/core.h>
#define EVENTS_PER_CHANNEL 65536
#define MAX_CPUS 32
#include <ctype.h>
#include <stdlib.h>
-#include <ust/kernelcompat.h>
#include "tracer.h"
#include "usterr.h"
#include <urcu-bp.h>
#include <urcu/rculist.h>
-#include <ust/kernelcompat.h>
+#include <ust/core.h>
#include <ust/marker.h>
#include "usterr.h"
#include <urcu-bp.h>
#include <urcu/rculist.h>
-#include <ust/kernelcompat.h>
#include <ust/core.h>
+#include <ust/clock.h>
#include "buffers.h"
#include "tracer.h"
-//#include "list.h"
#include "usterr.h"
#include "ust_snprintf.h"
*/
#include <errno.h>
-
-#include <ust/kernelcompat.h>
#include <ust/tracepoint.h>
+#include <ust/core.h>
+#include <ust/kcompat/kcompat.h>
#include "usterr.h"
#define _LGPL_SOURCE
#include <urcu-bp.h>
#include <urcu/rculist.h>
-#include <ust/kernelcompat.h>
+#include <ust/clock.h>
+
#include "tracercore.h"
#include "tracer.h"
#include "usterr.h"
#include <sys/types.h>
#include <stdarg.h>
-#include <ust/kernelcompat.h>
+#include <ust/marker.h>
+#include <ust/probe.h>
+#include <ust/core.h>
#include "channels.h"
#include "tracercore.h"
#include "tracerconst.h"
-#include <ust/marker.h>
-#include <ust/probe.h>
#include "buffers.h"
/* Number of bytes to log with a read/write event */
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <ust/kernelcompat.h>
#include "tracercore.h"
/* Traces structures */
#ifndef UST_TRACERCORE_H
#define UST_TRACERCORE_H
-#include <ust/kernelcompat.h>
-//ust// #include <linux/percpu.h>
-
-/* ltt's root dir in debugfs */
-#define LTT_ROOT "ltt"
+#include <ust/kcompat/kcompat.h>
+#include <ust/core.h>
+#include <urcu/list.h>
/*
* All modifications of ltt_traces must be done by ltt-tracer.c, while holding
#include <urcu/rculist.h>
#include <ust/type-serializer.h>
#include <ust/core.h>
+#include <ust/clock.h>
#include "tracer.h"
notrace