mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
28244707d9
Currently, we use 123456789 as unknown or illegal syscall number, and expect program return ENOSYS. Although 123456789 is an illegal syscall number on arm linux, kernel sends SIGILL rather than returns -ENOSYS. However, arm linux kernel returns -ENOSYS if syscall number is within 0xf0001..0xf07ff, so we can use 0xf07ff for unknown_syscall in test. gdb/testsuite: 2016-06-29 Yao Qi <yao.qi@linaro.org> * gdb.base/catch-syscall.c [__arm__]: Set unknown_syscall to 0x0f07ff.
78 lines
2.1 KiB
C
78 lines
2.1 KiB
C
/* This file is used to test the 'catch syscall' feature on GDB.
|
|
|
|
Please, if you are going to edit this file DO NOT change the syscalls
|
|
being called (nor the order of them). If you really must do this, then
|
|
take a look at catch-syscall.exp and modify there too.
|
|
|
|
Written by Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
|
|
September, 2008 */
|
|
|
|
#include <unistd.h>
|
|
#include <sys/syscall.h>
|
|
#include <fcntl.h>
|
|
#include <sys/stat.h>
|
|
#include <sched.h>
|
|
|
|
/* These are the syscalls numbers used by the test. */
|
|
|
|
int close_syscall = SYS_close;
|
|
int chroot_syscall = SYS_chroot;
|
|
/* GDB had a bug where it couldn't catch syscall number 0 (PR 16297).
|
|
In most GNU/Linux architectures, syscall number 0 is
|
|
restart_syscall, which can't be called from userspace. However,
|
|
the "read" syscall is zero on x86_64. */
|
|
int read_syscall = SYS_read;
|
|
#ifdef SYS_pipe
|
|
int pipe_syscall = SYS_pipe;
|
|
#else
|
|
int pipe2_syscall = SYS_pipe2;
|
|
#endif
|
|
int write_syscall = SYS_write;
|
|
#if defined(__arm__)
|
|
/* Although 123456789 is an illegal syscall umber on arm linux, kernel
|
|
sends SIGILL rather than returns -ENOSYS. However, arm linux kernel
|
|
returns -ENOSYS if syscall number is within 0xf0001..0xf07ff, so we
|
|
can use 0xf07ff for unknown_syscall in test. */
|
|
int unknown_syscall = 0x0f07ff;
|
|
#else
|
|
int unknown_syscall = 123456789;
|
|
#endif
|
|
int exit_group_syscall = SYS_exit_group;
|
|
|
|
/* Set by the test when it wants execve. */
|
|
int do_execve = 0;
|
|
|
|
int
|
|
main (int argc, char *const argv[])
|
|
{
|
|
int fd[2];
|
|
char buf1[2] = "a";
|
|
char buf2[2];
|
|
|
|
/* Test a simple self-exec, but only on request. */
|
|
if (do_execve)
|
|
execv (*argv, argv);
|
|
|
|
/* A close() with a wrong argument. We are only
|
|
interested in the syscall. */
|
|
close (-1);
|
|
|
|
chroot (".");
|
|
|
|
pipe (fd);
|
|
|
|
write (fd[1], buf1, sizeof (buf1));
|
|
read (fd[0], buf2, sizeof (buf2));
|
|
|
|
/* Test vfork-event interactions. Child exits immediately.
|
|
(Plain fork won't work on no-mmu kernel configurations.) */
|
|
if (vfork () == 0)
|
|
_exit (0);
|
|
|
|
/* Trigger an intentional ENOSYS. */
|
|
syscall (unknown_syscall);
|
|
|
|
/* The last syscall. Do not change this. */
|
|
_exit (0);
|
|
}
|