summaryrefslogtreecommitdiffstats
path: root/tapset/context-unwind.stp
blob: 8f35a783ae89220739f303b9591abbcaa76553db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// context-unwind tapset
// Copyright (C) 2005-2008 Red Hat Inc.
// Copyright (C) 2006 Intel Corporation.
//
// This file is part of systemtap, and is free software.  You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.
// <tapsetdescription>
// Context functions provide additional information about where an event occurred. These functions can 
//provide information such as a backtrace to where the event occurred and the current register values for the 
//processor.
// </tapsetdescription>
%{
#ifndef STP_NEED_UNWIND_DATA
#define STP_NEED_UNWIND_DATA 1
#endif
#ifndef STP_NEED_SYMBOL_DATA
#define STP_NEED_SYMBOL_DATA 1
#endif
%}

/**
 * sfunction print_backtrace - Print stack back trace
 *
 *  Equivalent to print_stack(backtrace()), 
 *  except that deeper stack nesting may be supported.  Return nothing.
 */
function print_backtrace () %{
	if (CONTEXT->regs) {
		_stp_stack_print(CONTEXT->regs, 1, CONTEXT->pi, MAXTRACE, NULL, NULL);
	} else {
		_stp_printf("Systemtap probe: %s\n", CONTEXT->probe_point);
	}
%}

/**
 * sfunction backtrace - Hex backtrace of current stack
 *
 *  Return a string of hex addresses that are a backtrace of the 
 *  stack.  Output may be truncated as per maximum string length.
 */
function backtrace:string () %{ /* pure */
	if (CONTEXT->regs)
		_stp_stack_snprint (THIS->__retvalue, MAXSTRINGLEN, CONTEXT->regs, 0, CONTEXT->pi, MAXTRACE, NULL, NULL);
	else 
		strlcpy (THIS->__retvalue, "", MAXSTRINGLEN);
%}

/**
 * sfunction task_backtrace - Hex backtrace of an arbitrary task
 * @task: pointer to task_struct
 *
 *  Return a string of hex addresses that are a backtrace of the 
 *  stack of a particular task.  Output may be truncated as per
 *  maximum string length.
 */
function task_backtrace:string (task:long) %{ /* pure */
	 _stp_stack_snprint_tsk(THIS->__retvalue, MAXSTRINGLEN,
		(struct task_struct *)(unsigned long)THIS->task, 0, MAXTRACE);
%}

/**
 * sfunction caller - Return name and address of calling function
 *
 *  Return the address and name of the calling function. 
 *  This is equivalent to calling:
 *  sprintf("%s 0x%x", symname(caller_addr(), caller_addr()))
 *  Works only for return probes at this time.
 */
function caller:string() {
	return sprintf("%s 0x%x", symname(caller_addr()), caller_addr());
}

/**
 * sfunction caller_addr -  Return caller address
 *
 *  Return the address of the calling function. 
 *  Works only for return probes at this time.
 */
function caller_addr:long () %{ /* pure */
        if (CONTEXT->pi)
		THIS->__retvalue = (int64_t)(long)_stp_ret_addr_r(CONTEXT->pi);
        else
		THIS->__retvalue = 0;
%}