qemu/bsd-user/freebsd/target_os_siginfo.h
Warner Losh 4550c661bf bsd-user: Complete FreeBSD siginfo
Fill in the missing FreeBSD siginfo fields, and add some comments.

Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
2022-01-28 15:52:38 -07:00

159 lines
4.8 KiB
C

/*
* FreeBSD siginfo related definitions
*
* Copyright (c) 2013 Stacey D. Son
*
* 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 2 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/>.
*/
#ifndef _TARGET_OS_SIGINFO_H_
#define _TARGET_OS_SIGINFO_H_
#define TARGET_NSIG 128
#define TARGET_NSIG_BPW (sizeof(uint32_t) * 8)
#define TARGET_NSIG_WORDS (TARGET_NSIG / TARGET_NSIG_BPW)
/* this struct defines a stack used during syscall handling */
typedef struct target_sigaltstack {
abi_long ss_sp;
abi_ulong ss_size;
abi_long ss_flags;
} target_stack_t;
typedef struct {
uint32_t __bits[TARGET_NSIG_WORDS];
} target_sigset_t;
struct target_sigaction {
abi_ulong _sa_handler;
int32_t sa_flags;
target_sigset_t sa_mask;
};
typedef union target_sigval {
int32_t sival_int;
abi_ulong sival_ptr;
int32_t sigval_int;
abi_ulong sigval_ptr;
} target_sigval_t;
typedef struct target_siginfo {
int32_t si_signo; /* signal number */
int32_t si_errno; /* errno association */
int32_t si_code; /* signal code */
int32_t si_pid; /* sending process */
int32_t si_uid; /* sender's ruid */
int32_t si_status; /* exit value */
abi_ulong si_addr; /* faulting instruction */
union target_sigval si_value; /* signal value */
union {
struct {
int32_t _trapno; /* machine specific trap code */
} _fault;
/* POSIX.1b timers */
struct {
int32_t _timerid;
int32_t _overrun;
} _timer;
struct {
int32_t _mqd;
} _mesgp;
/* SIGPOLL -- Not really genreated in FreeBSD ??? */
struct {
int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
} _poll;
struct {
int _mqd;
} _mesgq;
struct {
/*
* Syscall number for signals delivered as a result of system calls
* denied by Capsicum.
*/
int _syscall;
} _capsicum;
/* Spare for future growth */
struct {
abi_long __spare1__;
int32_t __spare2_[7];
} __spare__;
} _reason;
} target_siginfo_t;
struct target_sigevent {
abi_int sigev_notify;
abi_int sigev_signo;
target_sigval_t sigev_value;
union {
abi_int _threadid;
/*
* The kernel (and thus QEMU) never looks at these;
* they're only used as part of the ABI between a
* userspace program and libc.
*/
struct {
abi_ulong _function;
abi_ulong _attribute;
} _sigev_thread;
abi_ushort _kevent_flags;
abi_long _pad[8];
} _sigev_un;
};
#define target_si_signo si_signo
#define target_si_code si_code
#define target_si_errno si_errno
#define target_si_addr si_addr
/* SIGILL si_codes */
#define TARGET_ILL_ILLOPC (1) /* Illegal opcode. */
#define TARGET_ILL_ILLOPN (2) /* Illegal operand. */
#define TARGET_ILL_ILLADR (3) /* Illegal addressing mode. */
#define TARGET_ILL_ILLTRP (4) /* Illegal trap. */
#define TARGET_ILL_PRVOPC (5) /* Privileged opcode. */
#define TARGET_ILL_PRVREG (6) /* Privileged register. */
#define TARGET_ILL_COPROC (7) /* Coprocessor error. */
#define TARGET_ILL_BADSTK (8) /* Internal stack error. */
/* SIGSEGV si_codes */
#define TARGET_SEGV_MAPERR (1) /* address not mapped to object */
#define TARGET_SEGV_ACCERR (2) /* invalid permissions for mapped object */
/* SIGTRAP si_codes */
#define TARGET_TRAP_BRKPT (1) /* process beakpoint */
#define TARGET_TRAP_TRACE (2) /* process trace trap */
/* SIGBUS si_codes */
#define TARGET_BUS_ADRALN (1)
#define TARGET_BUS_ADRERR (2)
#define TARGET_BUS_OBJERR (3)
/* SIGFPE codes */
#define TARGET_FPE_INTOVF (1) /* Integer overflow. */
#define TARGET_FPE_INTDIV (2) /* Integer divide by zero. */
#define TARGET_FPE_FLTDIV (3) /* Floating point divide by zero. */
#define TARGET_FPE_FLTOVF (4) /* Floating point overflow. */
#define TARGET_FPE_FLTUND (5) /* Floating point underflow. */
#define TARGET_FPE_FLTRES (6) /* Floating point inexact result. */
#define TARGET_FPE_FLTINV (7) /* Invalid floating point operation. */
#define TARGET_FPE_FLTSUB (8) /* Subscript out of range. */
#endif /* !_TARGET_OS_SIGINFO_H_ */