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
|
set test "atomic"
if {![installtest_p]} {untested $test; return}
set script_template {
probe begin {
print("systemtap starting probe\n")
exit()
}
probe end {
print("systemtap ending probe\n")
printf("%%d\n", atomic_long_read(%s))
}
}
# First try reading from address 0, which should fail.
set test "atomic1"
set error {kernel read fault at 0x[^\r]+}
set script [format $script_template "0"]
stap_run_error $test 1 $error "" -e $script
# Try reading from address -1 (top of memory), which should fail.
set test "atomic2"
set script [format $script_template "-1"]
stap_run_error $test 1 $error "" -e $script
# Try reading from address 3, which should fail (if nothing else
# because it isn't aligned properly).
set test "atomic3"
set script [format $script_template "3"]
stap_run_error $test 1 $error "" -e $script
# Since we want to fail semi-gracefully (no compile errors), if we
# don't have atomic_long_t support on this kernel (no
# ATOMIC_LONG_INIT) the testcase will compile, but fail.
set script_module_template {
%%{
#include <asm/atomic.h>
#ifdef ATOMIC_LONG_INIT
struct {
ulong barrier1;
atomic_long_t a;
ulong barrier2;
} stp_atomic_struct = { ULONG_MAX, ATOMIC_LONG_INIT(5), ULONG_MAX };
#else
struct {
ulong barrier1;
long a;
ulong barrier2;
} stp_atomic_struct = { ULONG_MAX, 5, ULONG_MAX };
#endif
%%}
function get_atomic_addr:long()
%%{
THIS->__retvalue = (long)&stp_atomic_struct.a;
%%}
probe begin {
print("systemtap starting probe\n")
exit()
}
probe end {
print("systemtap ending probe\n")
printf("%%d\n", atomic_long_read(get_atomic_addr() + %s))
}
}
set test "atomic4"
set script [format $script_module_template "0"]
stap_run_error $test 0 $error "5\r\n" -ge $script
# We should be able to check for trying to read the atomic_long_t with
# bad alignment here, but it succeeds on {x86, x86_64} and fails on
# ia64. Since it doesn't fail consistently, we'll comment this out.
#set test "atomic5"
#set script [format $script_module_template "3"]
#stap_run_error $test 1 $error "" -ge $script
|