summaryrefslogtreecommitdiffstats
path: root/runtime/stack.c
diff options
context:
space:
mode:
authorhunt <hunt>2007-01-31 20:13:02 +0000
committerhunt <hunt>2007-01-31 20:13:02 +0000
commit1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b (patch)
tree09dddc7115d2691e05ee392c2316c0793013a709 /runtime/stack.c
parentdcc4fec4fbb6caddbc82c758f57c014cfc37d088 (diff)
downloadsystemtap-steved-1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b.tar.gz
systemtap-steved-1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b.tar.xz
systemtap-steved-1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b.zip
2007-01-31 Martin Hunt <hunt@redhat.com>
* string.c (_stp_string_init): Deleted. (_stp_sprintf): Deleted. (_stp_vsprintf): Deleted. (_stp_string_cat_cstr): Deleted. (_stp_string_cat_string): Deleted. (_stp_string_cat_char): Deleted. (_stp_string_ptr): Deleted. (_stp_string_cat): Deleted. (_stp_snprintf): Moved from vsprintf.c. (_stp_vscnprintf): Moved from vsprintf.c. * string.h (STP_STRING_SIZE): Deleted. (STP_NUM_STRINGS): Deleted. Remove all references to type "String". * vsprintf.c (_stp_vscnprintf): Moved to string.c. (_stp_snprintf): Moved to string.c * sym.c (_stp_symbol_sprint): Replaced with _stp_symbol_print, which writes to the print buffer. (_stp_symbol_sprint_basic): Replaced with _stp_symbol_snprint. * runtime.h: Include io.c. * stat-common.c: Use new _stp_print* functions. * stat.c: Ditto. * regs.c: Renamed to regs-ia64.c. * current.c: Renamed regs.c. * regs-ia64.c: New file (renamed from regs.c). * stack.c (_stp_stack_sprint): Renamed _stp_stack_print and now just prints to the print buffer. Calls __stp_stack_print instead of __stp_stack_sprint. (_stp_stack_snprint): New function. Calls _stp_stack_print and then copies the print buffer into a string. (_stp_stack_printj): Deleted. (_stp_ustack_sprint): Deleted. * stack-*.c: Rewritten to print instead of writing to strings. Uses new _stp_print* functions. * print.c (_stp_printf): Create new function instead of macro. (_stp_print): Ditto. (_stp_print_char): New function. * map.c: Use _stp_print() and _stp_print_char() instead of _stp_print_cstr(). * io.c (_stp_vlog): Use _stp_print() instead of _stp_string_cat_cstr(). * copy.c (_stp_string_from_user): Deleted.
Diffstat (limited to 'runtime/stack.c')
-rw-r--r--runtime/stack.c91
1 files changed, 36 insertions, 55 deletions
diff --git a/runtime/stack.c b/runtime/stack.c
index 72a57e19..dfc7f0d3 100644
--- a/runtime/stack.c
+++ b/runtime/stack.c
@@ -1,6 +1,6 @@
/* -*- linux-c -*-
* Stack tracing functions
- * Copyright (C) 2005, 2006 Red Hat Inc.
+ * Copyright (C) 2005, 2006, 2007 Red Hat Inc.
* Copyright (C) 2005 Intel Corporation.
*
* This file is part of systemtap, and is free software. You can
@@ -12,7 +12,6 @@
#ifndef _STACK_C_
#define _STACK_C_
-
/** @file stack.c
* @brief Stack Tracing Functions
*/
@@ -64,80 +63,62 @@ static int _stp_kta(unsigned long addr)
return 0;
}
-/** Writes stack backtrace to a String
- *
- * @param str String
+/** Prints the stack backtrace
* @param regs A pointer to the struct pt_regs.
- * @returns Same String as was input with trace info appended,
*/
-String _stp_stack_sprint (String str, struct pt_regs *regs, int verbose, struct kretprobe_instance *pi)
+
+void _stp_stack_print(struct pt_regs *regs, int verbose, struct kretprobe_instance *pi)
{
if (verbose) {
/* print the current address */
if (pi) {
- _stp_string_cat(str, "Returning from: ");
- _stp_symbol_sprint(str, (unsigned long)_stp_probe_addr_r(pi));
- _stp_string_cat(str, "\nReturning to: ");
- _stp_symbol_sprint(str, (unsigned long)_stp_ret_addr_r(pi));
- } else
- _stp_symbol_sprint (str, REG_IP(regs));
- _stp_string_cat(str, "\n");
+ _stp_print("Returning from: ");
+ _stp_symbol_print((unsigned long)_stp_probe_addr_r(pi));
+ _stp_print("\nReturning to : ");
+ _stp_symbol_print((unsigned long)_stp_ret_addr_r(pi));
+ } else {
+ _stp_print_char(' ');
+ _stp_symbol_print (REG_IP(regs));
+ }
+ _stp_print_char('\n');
} else
- _stp_sprintf (str, "%lx ", REG_IP(regs));
- __stp_stack_sprint (str, regs, verbose, 0);
- return str;
+ _stp_printf ("%p ", REG_IP(regs));
+ __stp_stack_print (regs, verbose, 0);
}
-/** Prints the stack backtrace
+/** Writes stack backtrace to a string
+ *
+ * @param str string
* @param regs A pointer to the struct pt_regs.
+ * @returns void
*/
-
-#define _stp_stack_print(regs,pi) (void)_stp_stack_sprint(_stp_stdout,regs,1,pi)
-
-/** Writes stack backtrace to a String.
- * Use this when calling from a jprobe.
- * @param str String
- * @returns Same String as was input with trace info appended,
- * @sa _stp_stack_sprint()
- */
-String _stp_stack_sprintj(String str)
+void _stp_stack_snprint (char *str, int size, struct pt_regs *regs, int verbose, struct kretprobe_instance *pi)
{
- unsigned long stack;
- _stp_sprintf (str, "trace for %d (%s)\n", current->pid, current->comm);
-/* __stp_stack_sprint (str, &stack, 1, 0); */
- return str;
+ /* To get a string, we use a simple trick. First flush the print buffer, */
+ /* then call _stp_stack_print, then copy the result into the output string */
+ /* and clear the print buffer. */
+ _stp_pbuf *pb = per_cpu_ptr(Stp_pbuf, smp_processor_id());
+ _stp_print_flush();
+ _stp_stack_print(regs, verbose, pi);
+ strlcpy(str, pb->buf, size < pb->len ? size : pb->len);
+ pb->len = 0;
}
-/** Prints the stack backtrace.
- * Use this when calling from a jprobe.
- * @sa _stp_stack_print()
- */
-#define _stp_stack_printj() (void)_stp_stack_sprintj(_stp_stdout)
-/** Writes the user stack backtrace to a String
- * @param str String
- * @returns Same String as was input with trace info appended,
+/** Prints the user stack backtrace
+ * @param str string
+ * @returns Same string as was input with trace info appended,
* @note Currently limited to a depth of two. Works from jprobes and kprobes.
*/
-String _stp_ustack_sprint (String str)
+#if 0
+void _stp_ustack_print (char *str)
{
struct pt_regs *nregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) current->thread_info)) - 1;
-#if BITS_PER_LONG == 64
- _stp_sprintf (str, " 0x%016lx : [user]\n", REG_IP(nregs));
+ _stp_printf ("%p : [user]\n", REG_IP(nregs));
if (REG_SP(nregs))
- _stp_sprintf (str, " 0x%016lx : [user]\n", *(unsigned long *)REG_SP(nregs));
-#else
- _stp_sprintf (str, " 0x%08lx : [user]\n", REG_IP(nregs));
- if (REG_SP(nregs))
- _stp_sprintf (str, " 0x%08lx : [user]\n", *(unsigned long *)REG_SP(nregs));
-#endif
- return str;
+ _stp_printf ("%p : [user]\n", *(unsigned long *)REG_SP(nregs));
}
-
-/** Prints the user stack backtrace
- * @note Currently limited to a depth of two. Works from jprobes and kprobes.
- */
-#define _stp_ustack_print() (void)_stp_ustack_sprint(_stp_stdout)
+#endif /* 0 */
/** @} */
#endif /* _STACK_C_ */