summaryrefslogtreecommitdiffstats
path: root/runtime/sym.c
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/sym.c')
-rw-r--r--runtime/sym.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/runtime/sym.c b/runtime/sym.c
new file mode 100644
index 00000000..523495f2
--- /dev/null
+++ b/runtime/sym.c
@@ -0,0 +1,65 @@
+#ifndef _SYM_C_ /* -*- linux-c -*- */
+#define _SYM_C_
+
+#include "scbuf.c"
+
+/** @file sym.c
+ * @addtogroup sym Symbolic Functions
+ * Symbolic Lookup Functions
+ * @{
+ */
+
+/** Lookup symbol.
+ * This simply calls the kernel function kallsyms_lookup().
+ * That function is not exported, so this workaround is required.
+ * See the kernel source, kernel/kallsyms.c for more information.
+ */
+static const char * (*_stp_kallsyms_lookup)(unsigned long addr,
+ unsigned long *symbolsize,
+ unsigned long *offset,
+ char **modname, char *namebuf)=(void *)KALLSYMS_LOOKUP;
+
+static void __stp_symbol_print (unsigned long address, void (*prtfunc)(const char *fmt, ...))
+{
+ char *modname;
+ const char *name;
+ unsigned long offset, size;
+ char namebuf[KSYM_NAME_LEN+1];
+
+ name = _stp_kallsyms_lookup(address, &size, &offset, &modname, namebuf);
+
+ (*prtfunc)("0x%lx : ", address);
+ if (modname)
+ (*prtfunc)("%s+%#lx/%#lx [%s]", name, offset, size, modname);
+ else
+ (*prtfunc)("%s+%#lx/%#lx", name, offset, size);
+}
+
+/** Print addresses symbolically into a string
+ * @param address The address to lookup.
+ * @note Symbolic lookups should not be done within
+ * a probe because it is too time-consuming. Use at module exit time.
+ * @note Uses scbuf.
+ */
+
+char * _stp_symbol_sprint (unsigned long address)
+{
+ char *ptr = _stp_scbuf_cur();
+ __stp_symbol_print (address, _stp_sprint);
+ return ptr;
+}
+
+
+/** Print addresses symbolically to the trace buffer.
+ * @param address The address to lookup.
+ * @note Symbolic lookups should not be done within
+ * a probe because it is too time-consuming. Use at module exit time.
+ */
+
+void _stp_symbol_print (unsigned long address)
+{
+ __stp_symbol_print (address, _stp_print);
+}
+
+/** @} */
+#endif /* _SYM_C_ */