# 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()
}
