summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.base/kretprobe-vars.stp
blob: b932e202dc806c877b5651c0b6eb75eb7ac68d8e (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
# Check that implicitly-saved $target variables have the same
# value as those manually saved on entry.


# saved individual parameters
global read_file
global read_file_mode
global read_buf
global read_count
global read_pos

# the saved string $$parms
global read_parms

# error count
global errors

probe begin
{
  println("systemtap starting probe")
}

function check_num(name, ent, ret)
{
  if (ent != ret) {
    printf("%s mismatch, entry:%#x vs. return:%#x\n", name, ent, ret)
    errors++
  }
}
function check_str(name, ent, ret)
{
  if (ent != ret) {
    printf("%s mismatch, entry:'%s' vs. return:'%s'\n", name, ent, ret)
    errors++
  }
}

probe kernel.function("vfs_read").call
{
  if (tid() != target())
    next

  read_file = $file
  read_file_mode = $file->f_mode
  read_buf = $buf
  read_count = $count
  read_pos = $pos

  read_parms = $$parms
}

probe kernel.function("vfs_read").return
{
  if (tid() != target())
    next

  println("systemtap ending probe")

  check_num("file", read_file, $file)
  check_num("file->f_mode", read_file_mode, $file->f_mode)
  check_num("buf", read_buf, $buf)
  check_num("count", read_count, $count)
  check_num("pos", read_pos, $pos)

  check_str("parms", read_parms, $$parms)

  if (!errors)
    println("systemtap test success")
  exit()
}