1cfca06d7SDimitry Andric //===-- LinuxSignals.cpp --------------------------------------------------===//
20cac4ca3SEd Maste //
35f29bb8aSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f29bb8aSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55f29bb8aSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60cac4ca3SEd Maste //
70cac4ca3SEd Maste //===----------------------------------------------------------------------===//
80cac4ca3SEd Maste
90cac4ca3SEd Maste #include "LinuxSignals.h"
100cac4ca3SEd Maste
117fa27ce4SDimitry Andric #ifdef __linux__
127fa27ce4SDimitry Andric #include <csignal>
137fa27ce4SDimitry Andric
147fa27ce4SDimitry Andric #ifndef SEGV_BNDERR
157fa27ce4SDimitry Andric #define SEGV_BNDERR 3
167fa27ce4SDimitry Andric #endif
177fa27ce4SDimitry Andric #ifndef SEGV_MTEAERR
187fa27ce4SDimitry Andric #define SEGV_MTEAERR 8
197fa27ce4SDimitry Andric #endif
207fa27ce4SDimitry Andric #ifndef SEGV_MTESERR
217fa27ce4SDimitry Andric #define SEGV_MTESERR 9
227fa27ce4SDimitry Andric #endif
237fa27ce4SDimitry Andric
247fa27ce4SDimitry Andric #define ADD_SIGCODE(signal_name, signal_value, code_name, code_value, ...) \
257fa27ce4SDimitry Andric static_assert(signal_name == signal_value, \
267fa27ce4SDimitry Andric "Value mismatch for signal number " #signal_name); \
277fa27ce4SDimitry Andric static_assert(code_name == code_value, \
287fa27ce4SDimitry Andric "Value mismatch for signal code " #code_name); \
297fa27ce4SDimitry Andric AddSignalCode(signal_value, code_value, __VA_ARGS__)
307fa27ce4SDimitry Andric #else
317fa27ce4SDimitry Andric #define ADD_SIGCODE(signal_name, signal_value, code_name, code_value, ...) \
327fa27ce4SDimitry Andric AddSignalCode(signal_value, code_value, __VA_ARGS__)
337fa27ce4SDimitry Andric #endif /* ifdef __linux__ */
347fa27ce4SDimitry Andric
35027f1c96SDimitry Andric using namespace lldb_private;
360cac4ca3SEd Maste
LinuxSignals()3714f1b3e8SDimitry Andric LinuxSignals::LinuxSignals() : UnixSignals() { Reset(); }
380cac4ca3SEd Maste
Reset()3914f1b3e8SDimitry Andric void LinuxSignals::Reset() {
400cac4ca3SEd Maste m_signals.clear();
41b60736ecSDimitry Andric // clang-format off
42b60736ecSDimitry Andric // SIGNO NAME SUPPRESS STOP NOTIFY DESCRIPTION
43b60736ecSDimitry Andric // ====== ============== ======== ====== ====== ===================================================
44e81d9d49SDimitry Andric AddSignal(1, "SIGHUP", false, true, true, "hangup");
45e81d9d49SDimitry Andric AddSignal(2, "SIGINT", true, true, true, "interrupt");
46e81d9d49SDimitry Andric AddSignal(3, "SIGQUIT", false, true, true, "quit");
477fa27ce4SDimitry Andric
48e81d9d49SDimitry Andric AddSignal(4, "SIGILL", false, true, true, "illegal instruction");
497fa27ce4SDimitry Andric ADD_SIGCODE(SIGILL, 4, ILL_ILLOPC, 1, "illegal opcode");
507fa27ce4SDimitry Andric ADD_SIGCODE(SIGILL, 4, ILL_ILLOPN, 2, "illegal operand");
517fa27ce4SDimitry Andric ADD_SIGCODE(SIGILL, 4, ILL_ILLADR, 3, "illegal addressing mode");
527fa27ce4SDimitry Andric ADD_SIGCODE(SIGILL, 4, ILL_ILLTRP, 4, "illegal trap");
537fa27ce4SDimitry Andric ADD_SIGCODE(SIGILL, 4, ILL_PRVOPC, 5, "privileged opcode");
547fa27ce4SDimitry Andric ADD_SIGCODE(SIGILL, 4, ILL_PRVREG, 6, "privileged register");
557fa27ce4SDimitry Andric ADD_SIGCODE(SIGILL, 4, ILL_COPROC, 7, "coprocessor error");
567fa27ce4SDimitry Andric ADD_SIGCODE(SIGILL, 4, ILL_BADSTK, 8, "internal stack error");
577fa27ce4SDimitry Andric
58b60736ecSDimitry Andric AddSignal(5, "SIGTRAP", true, true, true, "trace trap (not reset when caught)");
59e81d9d49SDimitry Andric AddSignal(6, "SIGABRT", false, true, true, "abort()/IOT trap", "SIGIOT");
607fa27ce4SDimitry Andric
61e81d9d49SDimitry Andric AddSignal(7, "SIGBUS", false, true, true, "bus error");
627fa27ce4SDimitry Andric ADD_SIGCODE(SIGBUS, 7, BUS_ADRALN, 1, "illegal alignment");
637fa27ce4SDimitry Andric ADD_SIGCODE(SIGBUS, 7, BUS_ADRERR, 2, "illegal address");
647fa27ce4SDimitry Andric ADD_SIGCODE(SIGBUS, 7, BUS_OBJERR, 3, "hardware error");
657fa27ce4SDimitry Andric
66e81d9d49SDimitry Andric AddSignal(8, "SIGFPE", false, true, true, "floating point exception");
677fa27ce4SDimitry Andric ADD_SIGCODE(SIGFPE, 8, FPE_INTDIV, 1, "integer divide by zero");
687fa27ce4SDimitry Andric ADD_SIGCODE(SIGFPE, 8, FPE_INTOVF, 2, "integer overflow");
697fa27ce4SDimitry Andric ADD_SIGCODE(SIGFPE, 8, FPE_FLTDIV, 3, "floating point divide by zero");
707fa27ce4SDimitry Andric ADD_SIGCODE(SIGFPE, 8, FPE_FLTOVF, 4, "floating point overflow");
717fa27ce4SDimitry Andric ADD_SIGCODE(SIGFPE, 8, FPE_FLTUND, 5, "floating point underflow");
727fa27ce4SDimitry Andric ADD_SIGCODE(SIGFPE, 8, FPE_FLTRES, 6, "floating point inexact result");
737fa27ce4SDimitry Andric ADD_SIGCODE(SIGFPE, 8, FPE_FLTINV, 7, "floating point invalid operation");
747fa27ce4SDimitry Andric ADD_SIGCODE(SIGFPE, 8, FPE_FLTSUB, 8, "subscript out of range");
757fa27ce4SDimitry Andric
76e81d9d49SDimitry Andric AddSignal(9, "SIGKILL", false, true, true, "kill");
77e81d9d49SDimitry Andric AddSignal(10, "SIGUSR1", false, true, true, "user defined signal 1");
787fa27ce4SDimitry Andric
79e81d9d49SDimitry Andric AddSignal(11, "SIGSEGV", false, true, true, "segmentation violation");
807fa27ce4SDimitry Andric ADD_SIGCODE(SIGSEGV, 11, SEGV_MAPERR, 1, "address not mapped to object", SignalCodePrintOption::Address);
817fa27ce4SDimitry Andric ADD_SIGCODE(SIGSEGV, 11, SEGV_ACCERR, 2, "invalid permissions for mapped object", SignalCodePrintOption::Address);
827fa27ce4SDimitry Andric ADD_SIGCODE(SIGSEGV, 11, SEGV_BNDERR, 3, "failed address bounds checks", SignalCodePrintOption::Bounds);
837fa27ce4SDimitry Andric ADD_SIGCODE(SIGSEGV, 11, SEGV_MTEAERR, 8, "async tag check fault");
847fa27ce4SDimitry Andric ADD_SIGCODE(SIGSEGV, 11, SEGV_MTESERR, 9, "sync tag check fault", SignalCodePrintOption::Address);
857fa27ce4SDimitry Andric // Some platforms will occasionally send nonstandard spurious SI_KERNEL
867fa27ce4SDimitry Andric // codes. One way to get this is via unaligned SIMD loads. Treat it as invalid address.
877fa27ce4SDimitry Andric ADD_SIGCODE(SIGSEGV, 11, SI_KERNEL, 0x80, "invalid address", SignalCodePrintOption::Address);
887fa27ce4SDimitry Andric
89e81d9d49SDimitry Andric AddSignal(12, "SIGUSR2", false, true, true, "user defined signal 2");
90b60736ecSDimitry Andric AddSignal(13, "SIGPIPE", false, true, true, "write to pipe with reading end closed");
91e81d9d49SDimitry Andric AddSignal(14, "SIGALRM", false, false, false, "alarm");
92e81d9d49SDimitry Andric AddSignal(15, "SIGTERM", false, true, true, "termination requested");
93e81d9d49SDimitry Andric AddSignal(16, "SIGSTKFLT", false, true, true, "stack fault");
94b60736ecSDimitry Andric AddSignal(17, "SIGCHLD", false, false, true, "child status has changed", "SIGCLD");
95b60736ecSDimitry Andric AddSignal(18, "SIGCONT", false, false, true, "process continue");
96e81d9d49SDimitry Andric AddSignal(19, "SIGSTOP", true, true, true, "process stop");
97e81d9d49SDimitry Andric AddSignal(20, "SIGTSTP", false, true, true, "tty stop");
98e81d9d49SDimitry Andric AddSignal(21, "SIGTTIN", false, true, true, "background tty read");
99e81d9d49SDimitry Andric AddSignal(22, "SIGTTOU", false, true, true, "background tty write");
100e81d9d49SDimitry Andric AddSignal(23, "SIGURG", false, true, true, "urgent data on socket");
101e81d9d49SDimitry Andric AddSignal(24, "SIGXCPU", false, true, true, "CPU resource exceeded");
102e81d9d49SDimitry Andric AddSignal(25, "SIGXFSZ", false, true, true, "file size limit exceeded");
103e81d9d49SDimitry Andric AddSignal(26, "SIGVTALRM", false, true, true, "virtual time alarm");
104e81d9d49SDimitry Andric AddSignal(27, "SIGPROF", false, false, false, "profiling time alarm");
105e81d9d49SDimitry Andric AddSignal(28, "SIGWINCH", false, true, true, "window size changes");
106b60736ecSDimitry Andric AddSignal(29, "SIGIO", false, true, true, "input/output ready/Pollable event", "SIGPOLL");
107e81d9d49SDimitry Andric AddSignal(30, "SIGPWR", false, true, true, "power failure");
108e81d9d49SDimitry Andric AddSignal(31, "SIGSYS", false, true, true, "invalid system call");
109b60736ecSDimitry Andric AddSignal(32, "SIG32", false, false, false, "threading library internal signal 1");
110b60736ecSDimitry Andric AddSignal(33, "SIG33", false, false, false, "threading library internal signal 2");
111e81d9d49SDimitry Andric AddSignal(34, "SIGRTMIN", false, false, false, "real time signal 0");
112e81d9d49SDimitry Andric AddSignal(35, "SIGRTMIN+1", false, false, false, "real time signal 1");
113e81d9d49SDimitry Andric AddSignal(36, "SIGRTMIN+2", false, false, false, "real time signal 2");
114e81d9d49SDimitry Andric AddSignal(37, "SIGRTMIN+3", false, false, false, "real time signal 3");
115e81d9d49SDimitry Andric AddSignal(38, "SIGRTMIN+4", false, false, false, "real time signal 4");
116e81d9d49SDimitry Andric AddSignal(39, "SIGRTMIN+5", false, false, false, "real time signal 5");
117e81d9d49SDimitry Andric AddSignal(40, "SIGRTMIN+6", false, false, false, "real time signal 6");
118e81d9d49SDimitry Andric AddSignal(41, "SIGRTMIN+7", false, false, false, "real time signal 7");
119e81d9d49SDimitry Andric AddSignal(42, "SIGRTMIN+8", false, false, false, "real time signal 8");
120e81d9d49SDimitry Andric AddSignal(43, "SIGRTMIN+9", false, false, false, "real time signal 9");
121e81d9d49SDimitry Andric AddSignal(44, "SIGRTMIN+10", false, false, false, "real time signal 10");
122e81d9d49SDimitry Andric AddSignal(45, "SIGRTMIN+11", false, false, false, "real time signal 11");
123e81d9d49SDimitry Andric AddSignal(46, "SIGRTMIN+12", false, false, false, "real time signal 12");
124e81d9d49SDimitry Andric AddSignal(47, "SIGRTMIN+13", false, false, false, "real time signal 13");
125e81d9d49SDimitry Andric AddSignal(48, "SIGRTMIN+14", false, false, false, "real time signal 14");
126e81d9d49SDimitry Andric AddSignal(49, "SIGRTMIN+15", false, false, false, "real time signal 15");
127b60736ecSDimitry Andric AddSignal(50, "SIGRTMAX-14", false, false, false, "real time signal 16"); // switching to SIGRTMAX-xxx to match "kill -l" output
128e81d9d49SDimitry Andric AddSignal(51, "SIGRTMAX-13", false, false, false, "real time signal 17");
129e81d9d49SDimitry Andric AddSignal(52, "SIGRTMAX-12", false, false, false, "real time signal 18");
130e81d9d49SDimitry Andric AddSignal(53, "SIGRTMAX-11", false, false, false, "real time signal 19");
131e81d9d49SDimitry Andric AddSignal(54, "SIGRTMAX-10", false, false, false, "real time signal 20");
132e81d9d49SDimitry Andric AddSignal(55, "SIGRTMAX-9", false, false, false, "real time signal 21");
133e81d9d49SDimitry Andric AddSignal(56, "SIGRTMAX-8", false, false, false, "real time signal 22");
134e81d9d49SDimitry Andric AddSignal(57, "SIGRTMAX-7", false, false, false, "real time signal 23");
135e81d9d49SDimitry Andric AddSignal(58, "SIGRTMAX-6", false, false, false, "real time signal 24");
136e81d9d49SDimitry Andric AddSignal(59, "SIGRTMAX-5", false, false, false, "real time signal 25");
137e81d9d49SDimitry Andric AddSignal(60, "SIGRTMAX-4", false, false, false, "real time signal 26");
138e81d9d49SDimitry Andric AddSignal(61, "SIGRTMAX-3", false, false, false, "real time signal 27");
139e81d9d49SDimitry Andric AddSignal(62, "SIGRTMAX-2", false, false, false, "real time signal 28");
140e81d9d49SDimitry Andric AddSignal(63, "SIGRTMAX-1", false, false, false, "real time signal 29");
141e81d9d49SDimitry Andric AddSignal(64, "SIGRTMAX", false, false, false, "real time signal 30");
142b60736ecSDimitry Andric // clang-format on
1430cac4ca3SEd Maste }
144