#   Copyright 1997-2017 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


# This program tests the 'catch syscall' functionality.
#
# It was written by Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
# on September/2008.

standard_testfile

if  { [prepare_for_testing "failed to prepare" $testfile ${testfile}.c] } {
     return -1
}

# Check target supports catch syscall or not.
clean_restart $binfile
if ![runto_main] then {
    fail "can't run to main"
    return
}

set test "catch syscall"
gdb_test_multiple $test $test {
    -re "The feature \'catch syscall\' is not supported.*\r\n$gdb_prompt $" {
	unsupported "catch syscall isn't supported"
	return -1
    }
    -re ".*$gdb_prompt $" {
	pass $test
    }
}

set test "check catch syscall"
gdb_test_multiple "continue" $test {
    -re ".*Your system does not support this type\r\nof catchpoint.*$gdb_prompt $" {
	unsupported "catch syscall isn't supported"
	return -1
    }
    -re ".*Catchpoint.*$gdb_prompt $" {
      pass $test
    }
}

# All (but the last) syscalls from the example code.  It is filled in
# proc setup_all_syscalls.
set all_syscalls { }
set all_syscalls_numbers { }

# The last syscall (exit()) does not return, so
# we cannot expect the catchpoint to be triggered
# twice.  It is a special case.
set last_syscall "exit_group"
set last_syscall_number { }

set vfork_syscalls "(vfork|clone2?)"

set unknown_syscall_number { }

# Internal procedure used to check if, after issuing a 'catch syscall'
# command (without arguments), the 'info breakpoints' command displays
# that '"any syscall"' is to be caught.
proc check_info_bp_any_syscall {} {
    # Verifying that the catchpoint appears in the 'info breakpoints'
    # command, but with "<any syscall>".
    set thistest "catch syscall appears in 'info breakpoints'"
    gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscall \"<any syscall>\".*" $thistest
}

# Internal procedure used to check if, after issuing a 'catch syscall X'
# command (with arguments), the 'info breakpoints' command displays
# that the syscall 'X' is to be caught.
proc check_info_bp_specific_syscall { syscall } {
    set thistest "syscall(s) $syscall appears in 'info breakpoints'"
    gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscall(\[(\]s\[)\])? (.)?${syscall}(.)?.*" $thistest
}

# Internal procedure used to check if, after issuing a 'catch syscall X'
# command (with many arguments), the 'info breakpoints' command displays
# that the syscalls 'X' are to be caught.
proc check_info_bp_many_syscalls { syscalls } {
    set filter_str ""

    foreach name $syscalls {
      set filter_str "${filter_str}${name}, "
    }

    set filter_str [ string trimright $filter_str ", " ]

    set thistest "syscalls $filter_str appears in 'info breakpoints'"
    gdb_test "info breakpoints" ".*catchpoint.*keep y.*syscalls (.)?${filter_str}(.)?.*" $thistest
}

# This procedure checks if there was a call to a syscall.  The optional
# pattern can match syscalls that vary in implementation, like vfork.
proc check_call_to_syscall { syscall { pattern "" } } {
    global decimal

    if { $pattern eq "" } {
      set pattern "${syscall}"
    }

    set thistest "program has called $syscall"
    gdb_test "continue" "Catchpoint $decimal \\(call to syscall .?${pattern}.?\\).*" $thistest
}

# This procedure checks if the syscall returned.  The optional pattern
# can match syscalls that vary in implementation, like vfork.
proc check_return_from_syscall { syscall { pattern "" } } {
    global decimal

    if { $pattern eq "" } {
      set pattern "${syscall}"
    }

    set thistest "syscall $syscall has returned"
    gdb_test "continue" "Catchpoint $decimal \\(returned from syscall ${pattern}\\).*" $thistest
}

# Internal procedure that performs two 'continue' commands and checks if
# a syscall call AND return occur.  The optional pattern can match
# syscalls that vary in implementation, like vfork.
proc check_continue { syscall { pattern "" } } {
    # Testing if the 'continue' stops at the
    # specified syscall_name.  If it does, then it should
    # first print that the infeior has called the syscall,
    # and after print that the syscall has returned.

    # Testing if the inferior has called the syscall.
    check_call_to_syscall $syscall $pattern
    # And now, that the syscall has returned.
    check_return_from_syscall $syscall $pattern
}

# Inserts a syscall catchpoint with an argument.
proc insert_catch_syscall_with_arg { syscall } {
    global decimal

    # Trying to set the catchpoint
    set thistest "catch syscall with arguments ($syscall)"
    gdb_test "catch syscall $syscall" "Catchpoint $decimal \\(syscall \'?${syscall}\'?( \[${decimal}\])?\\)" $thistest

    check_info_bp_specific_syscall $syscall
}

# Inserts a syscall catchpoint with many arguments.
proc insert_catch_syscall_with_many_args { syscalls numbers } {
    global decimal

    set catch [ join $syscalls " " ]
    set filter_str ""

    foreach name $syscalls number $numbers {
      set filter_str "${filter_str}'${name}' \\\[${number}\\\] "
    }

    set filter_str [ string trimright $filter_str " " ]

    # Trying to set the catchpoint
    set thistest "catch syscall with arguments ($filter_str)"
    gdb_test "catch syscall $catch" "Catchpoint $decimal \\(syscalls ${filter_str}\\).*" $thistest

    check_info_bp_many_syscalls $syscalls
}

proc check_for_program_end {} {
    # Deleting the catchpoints
    delete_breakpoints

    gdb_continue_to_end
}

proc test_catch_syscall_without_args {} {
    global all_syscalls last_syscall vfork_syscalls unknown_syscall_number decimal

    with_test_prefix "without arguments" {
	# Trying to set the syscall.
	gdb_test "catch syscall" "Catchpoint $decimal \\(any syscall\\)"

	check_info_bp_any_syscall

	# We have to check every syscall.
	foreach name $all_syscalls {
	    check_continue $name
	}

	check_continue "vfork" $vfork_syscalls

	with_test_prefix "ENOSYS" {
	    check_continue $unknown_syscall_number
	}

	# At last but not least, we check if the inferior has called
	# the last (exit) syscall.
	check_call_to_syscall $last_syscall

	# Now let's see if the inferior correctly finishes.
	check_for_program_end
    }
}

proc test_catch_syscall_with_args {} {
    with_test_prefix "with arguments" {
	set syscall_name "close"
	insert_catch_syscall_with_arg $syscall_name

	# Can we continue until we catch the syscall?
	check_continue $syscall_name

	# Now let's see if the inferior correctly finishes.
	check_for_program_end
    }
}

proc test_catch_syscall_with_many_args {} {
    with_test_prefix "with many arguments" {
	global all_syscalls all_syscalls_numbers

	insert_catch_syscall_with_many_args $all_syscalls $all_syscalls_numbers

	# Can we continue until we catch the syscalls?
	foreach name $all_syscalls {
	    check_continue $name
	}

	# Now let's see if the inferior correctly finishes.
	check_for_program_end
    }
}

proc test_catch_syscall_with_wrong_args {} {
    with_test_prefix "wrong args" {
	# mlock is not called from the source
	set syscall_name "mlock"
	insert_catch_syscall_with_arg $syscall_name

	# Now, we must verify if the program stops with a continue.
	# If it doesn't, everything is right (since we don't have
	# a syscall named "mlock" in it).  Otherwise, this is a failure.
	set thistest "catch syscall with unused syscall ($syscall_name)"
	gdb_continue_to_end $thistest
    }
}

proc test_catch_syscall_restarting_inferior {} {
    with_test_prefix "restarting inferior" {
	set syscall_name "chroot"

	with_test_prefix "entry" {
	    insert_catch_syscall_with_arg $syscall_name

	    # Let's first reach the entry of the syscall.
	    check_call_to_syscall $syscall_name
	}

	with_test_prefix "entry/return" {
	    # Now, restart the program.
	    rerun_to_main

	    # And check for entry/return.
	    check_continue $syscall_name

	    # Can we finish?
	    check_for_program_end
	}
    }
}

proc test_catch_syscall_skipping_return {} {
    with_test_prefix "skipping return" {
	with_test_prefix "entry" {
	    set syscall_name "write"

	    insert_catch_syscall_with_arg $syscall_name

	    # Let's first reach the entry of the syscall.
	    check_call_to_syscall $syscall_name

	    # Now purposely skip the syscall return.
	    delete_breakpoints
	    gdb_test "stepi" ".*" "step over syscall return"
	}

	# With a naive entry/return toggle, gdb will still think
	# the target is due for a syscall return.

	with_test_prefix "entry/return" {
	    set syscall_name "read"

	    insert_catch_syscall_with_arg $syscall_name

	    # Check for entry first, then return.
	    check_continue $syscall_name

	    # Can we finish?
	    check_for_program_end
	}
    }
}

proc test_catch_syscall_mid_vfork {} {
    global gdb_prompt decimal vfork_syscalls

    with_test_prefix "mid-vfork" {
	# Verify that the system supports "catch vfork".
	gdb_test "catch vfork" "Catchpoint $decimal \\(vfork\\)" "insert first vfork catchpoint"
	gdb_test_multiple "continue" "continue to first vfork catchpoint" {
	    -re ".*Your system does not support this type\r\nof catchpoint.*$gdb_prompt $" {
		unsupported "continue to first vfork catchpoint"
		return
	    }
	    -re ".*Catchpoint $decimal \\(vforked process $decimal\\).*$gdb_prompt $" {
		pass "continue to first vfork catchpoint"
	    }
	}

	# Check that we now reach vfork return only.
	# (The actual syscall used varies by architecture.)
	gdb_test "catch syscall" "Catchpoint $decimal \\(any syscall\\)"
	check_return_from_syscall "vfork" $vfork_syscalls

	# Can we finish?
	check_for_program_end
    }
}

proc test_catch_syscall_execve {} {
    global gdb_prompt decimal

    with_test_prefix "execve" {

	# Tell the test program we want an execve.
	gdb_test_no_output "set do_execve = 1"

	# Check for entry/return across the execve, making sure that the
	# syscall_state isn't lost when turning into a new process.
	insert_catch_syscall_with_arg "execve"
	check_continue "execve"

	# Continue to main so extended-remote can read files as needed.
	# (Otherwise that "Reading" output confuses gdb_continue_to_end.)
	gdb_continue "main"

	# Now can we finish?
	check_for_program_end
    }
}

proc test_catch_syscall_fail_nodatadir {} {
    with_test_prefix "fail no datadir" {
	# Sanitizing.
	delete_breakpoints

	# Make sure GDB doesn't load the syscalls xml from the system
	# data directory.
	gdb_test "set data-directory /the/path/to/nowhere" \
	    "Warning: /the/path/to/nowhere: .*"

	# Testing to see if we receive a warning when calling "catch
	# syscall" without XML support (without datadir).
	set thistest "catch syscall displays a warning when there is no XML support"
	gdb_test "catch syscall" \
	    "warning: Could not load the syscall XML file.*warning: GDB will not be able to display syscall names nor to verify if.*any provided syscall numbers are valid.*Catchpoint .*(syscall).*" \
	    $thistest

	# Since the catchpoint was set, we must check if it's present
	# in "info breakpoints" output.
	check_info_bp_any_syscall

	# Sanitizing.
	delete_breakpoints
    }
}

proc test_catch_syscall_group {} {
    global decimal

    set sysnum "\\\[${decimal}\\\]"

    gdb_test "catch syscall g:process" \
	"Catchpoint $decimal \\(syscalls (\'(clone|fork|execve|exit)\' $sysnum)+.*" \
	"set catchpoint on a group of syscalls"

    gdb_test "catch syscall group:process read" \
	"Catchpoint $decimal \\(syscalls (\'(clone|fork|execve|exit)\' $sysnum)+.*read.*\\)" \
	"set catchpoints on a group of syscalls and on a single syscall"

    gdb_test "catch syscall group:" \
	"Unknown syscall group ''\." \
	"set catchpoints on an invalid group"

    gdb_test "catch syscall g:junk" \
	"Unknown syscall group 'junk'\." \
	"set catchpoints on an unknown group."

    gdb_test "complete catch syscall g:proc" \
	"catch syscall g:process" \
	"complete catch syscall group with 'g:' prefix"

    gdb_test "complete catch syscall group:proc" \
	"catch syscall group:process" \
	"complete catch syscall group with 'group:' prefix"

    gdb_test_sequence "complete catch syscall g" \
	"complete catch syscall group suggests 'group:' prefix" {
	    "group:descriptor" "group:file" "group:ipc" "group:memory"
	    "group:network" "group:process" "group:signal"
	}
}

proc do_syscall_tests {} {
    # NOTE: We don't have to point gdb at the correct data-directory.
    # For the build tree that is handled by INTERNAL_GDBFLAGS.

    # Verify that the 'catch syscall' help is available
    set thistest "help catch syscall"
    gdb_test "help catch syscall" "Catch system calls.*" $thistest

    # Try to set a catchpoint to a nonsense syscall
    set thistest "catch syscall to a nonsense syscall is prohibited"
    gdb_test "catch syscall nonsense_syscall" "Unknown syscall name .*" $thistest

    # Regression test for syscall completer bug.
    gdb_test "complete catch syscall close chroo" \
	"catch syscall close chroot" \
	"complete catch syscall with multiple words"

    # Testing the 'catch syscall' command without arguments.
    # This test should catch any syscalls.
    if [runto_main] then { test_catch_syscall_without_args }

    # Testing the 'catch syscall' command with arguments.
    # This test should only catch the specified syscall.
    if [runto_main] then { test_catch_syscall_with_args }

    # Testing the 'catch syscall' command with many arguments.
    # This test should catch $all_syscalls.
    if [runto_main] then { test_catch_syscall_with_many_args }

    # Testing the 'catch syscall' command with WRONG arguments.
    # This test should not trigger any catchpoints.
    if [runto_main] then { test_catch_syscall_with_wrong_args }

    # Testing the 'catch syscall' command during a restart of
    # the inferior.
    if [runto_main] then { test_catch_syscall_restarting_inferior }

    # Testing the 'catch syscall' command toggling off past a
    # syscall return, then resuming entry/return as normal.
    if [runto_main] then { test_catch_syscall_skipping_return }

    # Testing the 'catch syscall' command starting mid-vfork.
    if [runto_main] then { test_catch_syscall_mid_vfork }

    # Testing that 'catch syscall' entry/return tracks across execve.
    if [runto_main] then { test_catch_syscall_execve }

    # Testing if the 'catch syscall' command works when switching to
    # different architectures on-the-fly (PR gdb/10737).
    if [runto_main] then { test_catch_syscall_multi_arch }

    # Testing the 'catch' syscall command for a group of syscalls.
    if [runto_main] then { test_catch_syscall_group }
}

proc test_catch_syscall_without_args_noxml {} {
    with_test_prefix "without args noxml" {
	# We will need the syscall names even not using it because we
	# need to know know many syscalls are in the example file.
	global decimal all_syscalls last_syscall_number unknown_syscall_number all_syscalls_numbers

	delete_breakpoints

	gdb_test "catch syscall" "Catchpoint .*(syscall).*"

	# Now, we should be able to set a catchpoint, and GDB shall
	# not display the warning anymore.
	foreach name $all_syscalls number $all_syscalls_numbers {
	    with_test_prefix "$name" {
		check_continue $number
	    }
	}

	check_continue "vfork" $decimal

	with_test_prefix "ENOSYS" {
	    check_continue $unknown_syscall_number
	}

	# At last but not least, we check if the inferior has called
	# the last (exit) syscall.
	check_call_to_syscall $last_syscall_number

	delete_breakpoints
    }
}

proc test_catch_syscall_with_args_noxml {} {
    with_test_prefix "with args noxml" {
	global all_syscalls_numbers

	delete_breakpoints

	# Inserting all syscalls numbers to be caught
	foreach syscall_number $all_syscalls_numbers {
	    insert_catch_syscall_with_arg $syscall_number
	}

	# Checking that all syscalls are caught.
	foreach syscall_number $all_syscalls_numbers {
	    check_continue $syscall_number
	}

	delete_breakpoints
    }
}

proc test_catch_syscall_with_wrong_args_noxml {} {
    with_test_prefix "with wrong args noxml" {
	delete_breakpoints

	# Even without XML support, GDB should not accept unknown
	# syscall names for the catchpoint.
	gdb_test "catch syscall nonsense_syscall" \
	    "Unknown syscall name .nonsense_syscall.*"

	delete_breakpoints
    }
}

proc test_catch_syscall_multi_arch {} {
    global decimal binfile

    if { [istarget "i*86-*-*"] || [istarget "x86_64-*-*"] } {
	set arch1 "i386"
	set arch2 "i386:x86-64"
	set syscall1_name "exit"
	set syscall2_name "write"
	set syscall_number 1
    } elseif { [istarget "powerpc-*-linux*"] \
		   || [istarget "powerpc64-*-linux*"] } {
	set arch1 "powerpc:common"
	set arch2 "powerpc:common64"
	set syscall1_name "openat"
	set syscall2_name "unlinkat"
	set syscall_number 286
    } elseif { [istarget "sparc-*-linux*"] \
		   || [istarget "sparc64-*-linux*"] } {
	set arch1 "sparc"
	set arch2 "sparc:v9"
	set syscall1_name "setresuid32"
	set syscall2_name "setresuid"
	set syscall_number 108
    } elseif { [istarget "mips*-linux*"] } {
	# MIPS does not use the same numbers for syscalls on 32 and 64
	# bits.
	verbose "Not testing MIPS for multi-arch syscall support"
	return
    } elseif { [istarget "arm*-linux*"] } {
	# catch syscall supports only 32-bit ARM for now.
	verbose "Not testing ARM for multi-arch syscall support"
	return
    } elseif { [istarget "aarch64*-linux*"] } {
	set arch1 "aarch64"
	set arch2 "arm"
	set syscall1_name "reboot"
	set syscall2_name "_newselect"
	set syscall_number 142
    } elseif { [istarget "s390*-linux*"] } {
	set arch1 "s390:31-bit"
	set arch2 "s390:64-bit"
	set syscall1_name "_newselect"
	set syscall2_name "select"
	set syscall_number 142
    }

    with_test_prefix "multiple targets" {
	# We are not interested in loading any binary here, and in
	# some systems (PowerPC, for example), if we load a binary
	# there is no way to set other architecture.
	gdb_exit
	gdb_start

	gdb_test "set architecture $arch1" \
	    "The target architecture is assumed to be $arch1" \
	    "set arch to $arch1"

	gdb_test "catch syscall $syscall_number" \
	    "Catchpoint $decimal \\(syscall .${syscall1_name}. \\\[${syscall_number}\\\]\\)" \
	    "insert catch syscall on syscall $syscall_number -- $syscall1_name on $arch1"

	gdb_test "set architecture $arch2" \
	    "The target architecture is assumed to be $arch2" \
	    "set arch to $arch2"

	gdb_test "catch syscall $syscall_number" \
	    "Catchpoint $decimal \\(syscall .${syscall2_name}. \\\[${syscall_number}\\\]\\)" \
	    "insert catch syscall on syscall $syscall_number -- $syscall2_name on $arch2"

	clean_restart $binfile
    }
}

proc do_syscall_tests_without_xml {} {
    # Make sure GDB doesn't load the syscalls xml from the system data
    # directory.
    gdb_test "set data-directory /the/path/to/nowhere" \
	"Warning: /the/path/to/nowhere: .*"

    # Let's test if we can catch syscalls without XML support.
    # We should succeed, but GDB is not supposed to print syscall names.
    if [runto_main] then { test_catch_syscall_without_args_noxml }

    # The only valid argument "catch syscall" should accept is the
    # syscall number, and not the name (since it can't translate a
    # name to a number).
    if [runto_main] then { test_catch_syscall_with_args_noxml }

    # Now, we'll try to provide a syscall name (valid or not) to the command,
    # and expect it to fail.
    if [runto_main] then { test_catch_syscall_with_wrong_args_noxml }
}

# This procedure fills the vector "all_syscalls_numbers" with the proper
# numbers for the used syscalls according to the architecture.
proc fill_all_syscalls_numbers {} {
    global all_syscalls_numbers last_syscall_number unknown_syscall_number all_syscalls

    foreach syscall $all_syscalls {
	lappend all_syscalls_numbers [get_integer_valueof "${syscall}_syscall" -1]
    }

    set last_syscall_number [get_integer_valueof "exit_group_syscall" -1]
    set unknown_syscall_number [get_integer_valueof "unknown_syscall" -1]
}

# Set up the vector all_syscalls.

proc setup_all_syscalls {} {
    global all_syscalls
    global gdb_prompt

    # They are ordered according to the file, so do not change this.
    lappend all_syscalls "close"
    lappend all_syscalls "chroot"

    # SYS_pipe doesn't exist on aarch64 kernel.
    set test "check SYS_pipe"
    gdb_test_multiple "p pipe_syscall" $test {
	-re " = .*$gdb_prompt $" {
	    pass $test
	    lappend all_syscalls "pipe"
	}
	-re "No symbol .*$gdb_prompt $" {
	    pass $test
	    # SYS_pipe isn't defined, use SYS_pipe2 instead.
	    lappend all_syscalls "pipe2"
	}
    }

    lappend all_syscalls "write"
    lappend all_syscalls "read"
}

setup_all_syscalls

# Fill all the syscalls numbers before starting anything.
fill_all_syscalls_numbers

# Execute the tests, using XML support
gdb_exit
if { ![gdb_skip_xml_test] } {
  clean_restart $binfile
  do_syscall_tests

  # Now, we have to see if GDB displays a warning when we
  # don't set the data-directory but try to use catch syscall
  # anyway.  For that, we must restart GDB first.
  clean_restart $binfile
  test_catch_syscall_fail_nodatadir
}

# Restart gdb
clean_restart $binfile

# Execute the tests, without XML support.  In this case, GDB will
# only display syscall numbers, and not syscall names.
do_syscall_tests_without_xml
