#define _LINUX_TRACEPOINT_H
/*
- * Kernel Tracepoint API.
+ * Copyright (C) 2008 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+ * Copyright (C) 2009 Pierre-Marc Fournier
*
- * See Documentation/tracepoint.txt.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
*
- * (C) Copyright 2008 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Heavily inspired from the Linux Kernel Markers.
*
- * This file is released under the GPLv2.
- * See the file COPYING for more details.
+ * Ported to userspace by Pierre-Marc Fournier.
*/
-#include <linux/immediate.h>
-#include <linux/types.h>
-#include <linux/rcupdate.h>
+//#include <linux/immediate.h>
+//#include <linux/types.h>
+//#include <linux/rcupdate.h>
+
+#include "immediate.h"
+#include "kernelcompat.h"
struct module;
struct tracepoint;
#define TPPROTO(args...) args
#define TPARGS(args...) args
-#ifdef CONFIG_TRACEPOINTS
+//ust// #ifdef CONFIG_TRACEPOINTS
/*
* it_func[0] is never NULL because there is at least one element in the array
extern void tracepoint_update_probe_range(struct tracepoint *begin,
struct tracepoint *end);
-#else /* !CONFIG_TRACEPOINTS */
-#define DECLARE_TRACE(name, proto, args) \
- static inline void trace_##name(proto) \
- { } \
- static inline void _trace_##name(proto) \
- { } \
- static inline int register_trace_##name(void (*probe)(proto)) \
- { \
- return -ENOSYS; \
- } \
- static inline int unregister_trace_##name(void (*probe)(proto)) \
- { \
- return -ENOSYS; \
- }
-
-#define DEFINE_TRACE(name)
-#define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
-#define EXPORT_TRACEPOINT_SYMBOL(name)
-
-static inline void tracepoint_update_probe_range(struct tracepoint *begin,
- struct tracepoint *end)
-{ }
-#endif /* CONFIG_TRACEPOINTS */
+//ust// #else /* !CONFIG_TRACEPOINTS */
+//ust// #define DECLARE_TRACE(name, proto, args) \
+//ust// static inline void trace_##name(proto) \
+//ust// { } \
+//ust// static inline void _trace_##name(proto) \
+//ust// { } \
+//ust// static inline int register_trace_##name(void (*probe)(proto)) \
+//ust// { \
+//ust// return -ENOSYS; \
+//ust// } \
+//ust// static inline int unregister_trace_##name(void (*probe)(proto)) \
+//ust// { \
+//ust// return -ENOSYS; \
+//ust// }
+//ust//
+//ust// #define DEFINE_TRACE(name)
+//ust// #define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
+//ust// #define EXPORT_TRACEPOINT_SYMBOL(name)
+//ust//
+//ust// static inline void tracepoint_update_probe_range(struct tracepoint *begin,
+//ust// struct tracepoint *end)
+//ust// { }
+//ust// #endif /* CONFIG_TRACEPOINTS */
/*
* Connect a probe to a tracepoint.
extern void tracepoint_probe_update_all(void);
struct tracepoint_iter {
- struct module *module;
+//ust// struct module *module;
+ struct tracepoint_lib *lib;
struct tracepoint *tracepoint;
};
synchronize_sched();
}
+struct tracepoint_lib {
+ struct tracepoint *tracepoints_start;
+ int tracepoints_count;
+ struct list_head list;
+};
+
+#define TRACEPOINT_LIB \
+extern struct tracepoint __start___tracepoints[] __attribute__((visibility("hidden"))); \
+extern struct tracepoint __stop___tracepoints[] __attribute__((visibility("hidden"))); \
+ \
+static void __attribute__((constructor)) __tracepoints__init(void) \
+{ \
+ tracepoint_register_lib(__start___tracepoints, (((long)__stop___tracepoints)-((long)__start___tracepoints))/sizeof(struct tracepoint));\
+}
#endif