File: num_args.stp

package info (click to toggle)
systemtap 5.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 47,556 kB
  • sloc: cpp: 81,117; ansic: 54,933; xml: 49,795; exp: 43,595; sh: 11,526; python: 5,003; perl: 2,252; tcl: 1,312; makefile: 1,006; javascript: 149; lisp: 105; awk: 101; asm: 91; java: 70; sed: 16
file content (74 lines) | stat: -rw-r--r-- 2,917 bytes parent folder | download | duplicates (6)
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
%( arch == "i386" %? global ir = "eax", lr = "eax" %)
%( arch == "x86_64" %? global ir = "eax", lr = "rax" %)
%( arch == "powerpc" %? global ir = "r3", lr = "r3" %)
%( arch == "s390" %? global ir = "r2", lr = "r2" %)
%( arch == "arm" %? global ir = "r0", lr = "r0" %)
%( arch == "arm64" %? global ir = "x0", lr = "x0" %)
%( arch == "mips" %? global ir = "v0", lr = "v0" %)

# On s390/s390x, when in a syscall, the 1st argument is in the
# orig_gpr2 register. If you aren't in a syscall, the 1st argument is
# in r2. The s390 *_arg() function assumes we're in a syscall. Since
# we aren't in the testcase, it returns the wrong value. So instead,
# grab the value from r2.

probe module("systemtap-test-module2").function("yyy_int") {
	printf("yyy_int %d %d %d\n",
	       %( arch == "s390" %? register("r2") %: int_arg(1) %),
	      int_arg(2), int_arg(3))
}
probe module("systemtap-test-module2").function("yyy_int").return {
	printf("yyy_int returns %d\n", register(ir))
}
probe module("systemtap-test-module2").function("yyy_uint") {
	printf("yyy_uint %d %d %d\n",
	       %( arch == "s390" %? u_register("r2") %: uint_arg(1) %),
	       uint_arg(2), uint_arg(3))
}
probe module("systemtap-test-module2").function("yyy_uint").return {
	printf("yyy_uint returns %d\n", u_register(ir))
}
probe module("systemtap-test-module2").function("yyy_long") {
	printf("yyy_long %d %d %d\n",
	       %( arch == "s390" %? register("r2") %: long_arg(1) %),
	       long_arg(2), long_arg(3))
}
probe module("systemtap_test-module2").function("yyy_long").return {
	printf("yyy_long returns %d\n", register(lr))
}
probe module("systemtap-test_module2").function("yyy_int64") {
# On i386, kernel is built with -mregparm=3.  The first arg occupies the
# first two registers.  The 2nd arg is not split between the 3rd register
# and the stack, but rather passed entirely on the stack.
	printf("yyy_int64 %d %d %d\n",
%( arch == "i386" %?
	       s64_arg(1), s64_arg(4), s64_arg(6)
%:
	       %( arch == "s390" %? register("r2") %: s64_arg(1) %),
	       s64_arg(2), s64_arg(3)
%)
					)
}
probe module("systemtap_test_module2").function("yyy_int64").return {
	printf("yyy_int64 returns %d\n", register(ir))
}
probe module("systemtap_test_module2").function("yyy_char") {
	printf("yyy_char %1b %1b %1b\n",
	       %( arch == "s390" %? register("r2") %: int_arg(1) %),
	       int_arg(2), int_arg(3))
}
probe module("systemtap_test_module2").function("yyy_char").return {
	printf("yyy_char returns %1b\n", register(ir))
}
probe module("systemtap_test_module2").function("yyy_str") {
	printf("yyy_str %s-%s-%s\n",
	       kernel_string(%( arch == "s390" %? u_register("r2")
				%: pointer_arg(1) %)),
	       kernel_string(pointer_arg(2)), kernel_string(pointer_arg(3)))
}
probe module("systemtap_test_module2").function("yyy_str").return {
	printf("yyy_str returns %s\n", kernel_string(register(lr)))
}
probe begin {
	printf("READY\n")
}