1/* This file is used to test the 'catch syscall' feature on GDB.
2
3   Please, if you are going to edit this file DO NOT change the syscalls
4   being called (nor the order of them).  If you really must do this, then
5   take a look at catch-syscall.exp and modify there too.
6
7   Written by Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
8   September, 2008 */
9
10#include <unistd.h>
11#include <sys/syscall.h>
12#include <fcntl.h>
13#include <sys/stat.h>
14#include <sched.h>
15
16/* These are the syscalls numbers used by the test.  */
17
18int close_syscall = SYS_close;
19int chroot_syscall = SYS_chroot;
20/* GDB had a bug where it couldn't catch syscall number 0 (PR 16297).
21   In most GNU/Linux architectures, syscall number 0 is
22   restart_syscall, which can't be called from userspace.  However,
23   the "read" syscall is zero on x86_64.  */
24int read_syscall = SYS_read;
25#ifdef SYS_pipe
26int pipe_syscall = SYS_pipe;
27#else
28int pipe2_syscall = SYS_pipe2;
29#endif
30int write_syscall = SYS_write;
31#if defined(__arm__)
32/* Although 123456789 is an illegal syscall umber on arm linux, kernel
33   sends SIGILL rather than returns -ENOSYS.  However, arm linux kernel
34   returns -ENOSYS if syscall number is within 0xf0001..0xf07ff, so we
35   can use 0xf07ff for unknown_syscall in test.  */
36int unknown_syscall = 0x0f07ff;
37#else
38int unknown_syscall = 123456789;
39#endif
40int exit_group_syscall = SYS_exit_group;
41
42/* Set by the test when it wants execve.  */
43int do_execve = 0;
44
45int
46main (int argc, char *const argv[])
47{
48	int fd[2];
49	char buf1[2] = "a";
50	char buf2[2];
51
52	/* Test a simple self-exec, but only on request.  */
53	if (do_execve)
54	  execv (*argv, argv);
55
56	/* A close() with a wrong argument.  We are only
57	   interested in the syscall.  */
58	close (-1);
59
60	chroot (".");
61
62	pipe (fd);
63
64	write (fd[1], buf1, sizeof (buf1));
65	read (fd[0], buf2, sizeof (buf2));
66
67	/* Test vfork-event interactions.  Child exits immediately.
68	   (Plain fork won't work on no-mmu kernel configurations.)  */
69	if (vfork () == 0)
70	  _exit (0);
71
72	/* Trigger an intentional ENOSYS.  */
73	syscall (unknown_syscall);
74
75	/* The last syscall.  Do not change this.  */
76	_exit (0);
77}
78