#   Copyright 1997, 1999, 2007, 2008 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.

if { [is_remote target] || ![isnative] } then {
    continue
}

set prms_id 0
set bug_id 0

global srcfile
set testfile "catch-syscall"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# All (but the last) syscalls from the example code
# They are ordered according to the file, so do not change this.
set all_syscalls { "close" "chroot" }
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"

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested catch-syscall.exp
     return -1
}

# Until "catch syscall" is implemented on other targets...
if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then {
    continue
}

# This shall be updated whenever 'catch syscall' is implemented
# on some architecture.
#if { ![istarget "i\[34567\]86-*-linux*"]
if { ![istarget "x86_64-*-linux*"] && ![istarget "i\[34567\]86-*-linux*"]
     && ![istarget "powerpc-*-linux*"] && ![istarget "powerpc64-*-linux*"] } {
     continue
}

# 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 {} {
    global gdb_prompt

    # 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 } {
    global gdb_prompt

    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 } {
    global gdb_prompt
    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.
proc check_call_to_syscall { syscall } {
    global gdb_prompt

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

# This procedure checks if the syscall returned.
proc check_return_from_syscall { syscall } {
    global gdb_prompt

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

# Internal procedure that performs two 'continue' commands and checks if
# a syscall call AND return occur.
proc check_continue { syscall } {
    global gdb_prompt

    # 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 inferiorr has called the syscall.
    check_call_to_syscall $syscall
    # And now, that the syscall has returned.
    check_return_from_syscall $syscall
}

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

    # Trying to set the catchpoint
    set thistest "catch syscall with arguments ($syscall)"
    gdb_test "catch syscall $syscall" "Catchpoint .*(syscall (.)?${syscall}(.)?( \[\[0-9\]+\])?).*" $thistest

    check_info_bp_specific_syscall $syscall
}

# Inserts a syscall catchpoint with many arguments.
proc insert_catch_syscall_with_many_args { syscalls numbers } {
    global gdb_prompt
    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 .*(syscalls (.)?${filter_str}(.)?).*" $thistest

    check_info_bp_many_syscalls $syscalls
}

proc check_for_program_end {} {
    global gdb_prompt

    # Deleting the catchpoints
    delete_breakpoints

    set thistest "successful program end"
    gdb_test "continue" "Program exited normally.*" $thistest

}

proc test_catch_syscall_without_args {} {
    global gdb_prompt all_syscalls last_syscall

    # Trying to set the syscall
    set thistest "setting catch syscall without arguments"
    gdb_test "catch syscall" "Catchpoint .*(syscall).*" $thistest

    check_info_bp_any_syscall

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

    # 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 {} {
    global gdb_prompt
    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 {} {
    global gdb_prompt 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 {} {
    global gdb_prompt
    # 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_test "continue" "Program exited normally.*" $thistest
}

proc test_catch_syscall_restarting_inferior {} {
    global gdb_prompt
    set syscall_name "chroot"

    insert_catch_syscall_with_arg $syscall_name

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

    # Now, restart the program
    rerun_to_main

    # And check for call/return
    check_continue $syscall_name

    # Can we finish?
    check_for_program_end
}

proc do_syscall_tests {} {
    global gdb_prompt srcdir

    # First, we need to set GDB datadir.
    send_gdb "set data-directory $srcdir/..\n"
    gdb_expect 10 {
	-re "$gdb_prompt $" {
	    verbose "Setting GDB datadir to $srcdir/..." 2
	}
	timeout {
	    error "Couldn't set GDB datadir."
	}
    }

    # 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

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

proc test_catch_syscall_fail_noxml {} {
    global gdb_prompt

    # Sanitizing.
    delete_breakpoints

    # Testing to see if we receive a warning when calling "catch syscall"
    # without XML support.
    set thistest "Catch syscall displays a warning when there is no XML support"
    gdb_test "catch syscall" "warning: Could not open .*warning: Could not load the syscall XML file .*GDB will not be able to display syscall names.*Catchpoint .*(syscall).*" $thistest

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

    # Sanitizing.
    delete_breakpoints
}

proc test_catch_syscall_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 gdb_prompt all_syscalls last_syscall

    delete_breakpoints

    set thistest "Catch syscall without arguments and without XML support"
    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 {
        # Unfortunately, we don't know the syscall number
        # that will be caught because this information is
        # arch-dependent.  Thus, we try to catch anything
        # similar to a number.
        check_continue "\[0-9\]*"
    }

    # At last but not least, we check if the inferior
    # has called the last (exit) syscall.
    check_call_to_syscall "\[0-9\]*"

    delete_breakpoints
}

proc test_catch_syscall_with_args_noxml {} {
    global gdb_prompt

    # The number of the "close" syscall.  This is our
    # option for a "long-estabilished" syscall in all
    # Linux architectures, but unfortunately x86_64 and
    # a few other platforms don't "follow the convention".
    # Because of this, we need this ugly check :-(.
    set close_number ""
    if { [istarget "x86_64-*-linux*"] } {
        set close_number "3"
    } else {
        set close_number "6"
    }

    delete_breakpoints

    insert_catch_syscall_with_arg $close_number

    check_continue $close_number

    delete_breakpoints
}

proc test_catch_syscall_with_wrong_args_noxml {} {
    global gdb_prompt

    delete_breakpoints

    # Even without XML support, GDB should not accept unknown
    # syscall names for the catchpoint.
    set thistest "Catch a nonsense syscall without XML support"
    gdb_test "catch syscall nonsense_syscall" "Unknown syscall name .nonsense_syscall.*" $thistest

    delete_breakpoints
}

proc do_syscall_tests_without_xml {} {
    global gdb_prompt srcdir

    # In this case, we don't need to set GDB's datadir because
    # we want GDB to display only numbers, not names.  So, let's
    # begin with the tests.

    # The first test is to see if GDB displays a warning when we
    # try to catch syscalls without the XML support.
    test_catch_syscall_fail_noxml

    # Now, 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).
    #
    # It's worth mentioning that we only try to catch the syscall
    # close().  This is because the syscall number is an arch-dependent
    # information, so we can't assume that we know every syscall number
    # in this system.  Therefore, we have decided to use a "long-estabilished"
    # system call, and close() just sounded the right choice :-).
    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

    # For Linux on x86, PPC and PPC64, the numbers for the syscalls "close" and
    # "chroot" are the same.
    if { ![istarget "i\[34567\]86-*-linux*"]
         || ![istarget "powerpc-*-linux*"] || ![istarget "powerpc64-*-linux*"] } {
         set all_syscalls_numbers { "6" "61" }
    }
}

# Start with a fresh gdb

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# Execute the tests, using XML support
do_syscall_tests

# Restart gdb

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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
