2 * Check decoding of signal syscall.
4 * Copyright (c) 2017 Dmitry V. Levin <ldv@altlinux.org>
7 * SPDX-License-Identifier: GPL-2.0-or-later
11 #include <asm/unistd.h>
23 k_signal(const kernel_ulong_t signum, const kernel_ulong_t handler)
25 return syscall(__NR_signal, signum, handler);
31 static const uintptr_t sig_ign = (uintptr_t) SIG_IGN;
32 static const uintptr_t sig_dfl = (uintptr_t) SIG_DFL;
33 static const kernel_ulong_t sigusr1 =
34 (kernel_ulong_t) 0xfacefeed00000000ULL | SIGUSR1;
35 static const struct sigaction act = { .sa_handler = SIG_DFL };
40 sigaddset(&mask, SIGUSR1);
41 if (sigprocmask(SIG_BLOCK, &mask, NULL))
42 perror_msg_and_fail("sigprocmask SIG_BLOCK");
44 if (sigaction(SIGUSR1, &act, NULL))
45 perror_msg_and_fail("sigaction");
47 rc = k_signal(sigusr1, sig_ign);
50 printf("signal(SIGUSR1, SIG_IGN) = %s\n", sprintrc(rc));
51 } else if (rc != (long) sig_dfl) {
52 error_msg_and_fail("signal(SIGUSR1, SIG_IGN) = %#lx\n", rc);
54 printf("signal(SIGUSR1, SIG_IGN) = %#lx (SIG_DFL)\n", rc);
57 * Raise and unblock SIGUSR1.
58 * If signal syscall failed to set SIGUSR1 handler to SIG_IGN,
59 * the process will be terminated by SIGUSR1.
62 if (sigprocmask(SIG_UNBLOCK, &mask, NULL))
63 perror_msg_and_fail("sigprocmask SIG_UNBLOCK");
65 if (sigprocmask(SIG_BLOCK, &mask, NULL))
66 perror_msg_and_fail("sigprocmask SIG_BLOCK");
69 rc = k_signal(SIGUSR1, sig_dfl);
72 printf("signal(SIGUSR1, SIG_DFL) = %s\n", sprintrc(rc));
73 } else if (rc != (long) sig_ign) {
74 error_msg_and_fail("signal(SIGUSR1, SIG_DFL) = %#lx\n", rc);
76 printf("signal(SIGUSR1, SIG_DFL) = %#lx (SIG_IGN)\n", rc);
79 const kernel_ulong_t addr = (kernel_ulong_t) 0xfacefeeddeadbeefULL;
80 rc = k_signal(SIGUSR1, addr);
83 printf("signal(SIGUSR1, %#llx) = %s\n",
84 (unsigned long long) addr, sprintrc(rc));
85 } else if (rc != (long) sig_dfl) {
86 error_msg_and_fail("signal(SIGUSR1, %#llx) = %#lx\n",
87 (unsigned long long) addr, rc);
89 printf("signal(SIGUSR1, %#llx) = %#lx (SIG_DFL)\n",
90 (unsigned long long) addr, rc);
93 rc = k_signal(SIGUSR1, sig_ign);
96 printf("signal(SIGUSR1, SIG_IGN) = %s\n", sprintrc(rc));
98 printf("signal(SIGUSR1, SIG_IGN) = %#lx\n", rc);
101 rc = k_signal(addr, sig_ign);
102 printf("signal(%d, SIG_IGN) = %s\n", (int) addr, sprintrc(rc));
104 puts("+++ exited with 0 +++");
110 SKIP_MAIN_UNDEFINED("__NR_signal")