diff options
author | hunt <hunt> | 2007-01-31 20:13:02 +0000 |
---|---|---|
committer | hunt <hunt> | 2007-01-31 20:13:02 +0000 |
commit | 1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b (patch) | |
tree | 09dddc7115d2691e05ee392c2316c0793013a709 /runtime/stack.c | |
parent | dcc4fec4fbb6caddbc82c758f57c014cfc37d088 (diff) | |
download | systemtap-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.c | 91 |
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_ */ |