Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[libc] Update siginfo_t to match kernel definition #66560

Merged
merged 3 commits into from
Sep 21, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion libc/include/llvm-libc-types/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ add_header(struct_rusage HDR struct_rusage.h DEPENDS .struct_timeval)
add_header(struct_dirent HDR struct_dirent.h DEPENDS .ino_t .off_t)
add_header(struct_sched_param HDR struct_sched_param.h)
add_header(union_sigval HDR union_sigval.h)
add_header(siginfo_t HDR siginfo_t.h DEPENDS .union_sigval .pid_t .uid_t)
add_header(siginfo_t HDR siginfo_t.h DEPENDS .union_sigval .pid_t .uid_t .clock_t)
add_header(sig_atomic_t HDR sig_atomic_t.h)
add_header(sigset_t HDR sigset_t.h DEPENDS libc.include.llvm-libc-macros.signal_macros)
add_header(struct_sigaction HDR struct_sigaction.h DEPENDS .sigset_t .siginfo_t)
Expand Down
97 changes: 88 additions & 9 deletions libc/include/llvm-libc-types/siginfo_t.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,99 @@
#ifndef __LLVM_LIBC_TYPES_SIGINFO_T_H__
#define __LLVM_LIBC_TYPES_SIGINFO_T_H__

#include <llvm-libc-types/clock_t.h>
#include <llvm-libc-types/pid_t.h>
#include <llvm-libc-types/uid_t.h>
#include <llvm-libc-types/union_sigval.h>

#define SI_MAX_SIZE 128

typedef struct {
int si_signo;
int si_code;
int si_errno;
pid_t si_pid;
uid_t si_uid;
void *si_addr;
int si_status;
long si_band;
union sigval si_value;
int si_signo; /* Signal number. */
int si_errno; /* If non-zero, an errno value associated with
this signal, as defined in <errno.h>. */
int si_code; /* Signal code. */
union {
int _si_pad[SI_MAX_SIZE / sizeof(int)];

/* kill() */
struct {
pid_t si_pid; /* sender's pid */
uid_t si_uid; /* sender's uid */
} _kill;

/* POSIX.1b timers */
struct {
int si_tid; /* timer id */
int _overrun; /* overrun count */
union sigval si_sigval; /* same as below */
} _timer;

/* POSIX.1b signals */
struct {
pid_t si_pid; /* sender's pid */
uid_t si_uid; /* sender's uid */
union sigval si_sigval;
} _rt;

/* SIGCHLD */
struct {
pid_t si_pid; /* which child */
uid_t si_uid; /* sender's uid */
int si_status; /* exit code */
clock_t si_utime;
clock_t si_stime;
} _sigchld;

/* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
struct {
void *si_addr; /* faulting insn/memory ref. */
short int si_addr_lsb; /* Valid LSB of the reported address. */
union {
/* used when si_code=SEGV_BNDERR */
struct {
void *_lower;
void *_upper;
} _addr_bnd;
/* used when si_code=SEGV_PKUERR */
__UINT32_TYPE__ _pkey;
} _bounds;
} _sigfault;

/* SIGPOLL */
struct {
long int si_band; /* POLL_IN, POLL_OUT, POLL_MSG */
int si_fd;
} _sigpoll;

/* SIGSYS */
struct {
void *_call_addr; /* calling user insn */
int _syscall; /* triggering system call number */
unsigned int _arch; /* AUDIT_ARCH_* of syscall */
} _sigsys;
} _sifields;
} siginfo_t;

#define si_pid _sifields._kill.si_pid
#define si_uid _sifields._kill.si_uid
#define si_timerid _sifields._timer.si_tid
#define si_overrun _sifields._timer.si_overrun
#define si_status _sifields._sigchld.si_status
#define si_utime _sifields._sigchld.si_utime
#define si_stime _sifields._sigchld.si_stime
#define si_value _sifields._rt.si_sigval
#define si_int _sifields._rt.si_sigval.sival_int
#define si_ptr _sifields._rt.si_sigval.sival_ptr
#define si_addr _sifields._sigfault.si_addr
#define si_addr_lsb _sifields._sigfault.si_addr_lsb
#define si_lower _sifields._sigfault._bounds._addr_bnd._lower
#define si_upper _sifields._sigfault._bounds._addr_bnd._upper
#define si_pkey _sifields._sigfault._bounds._pkey
#define si_band _sifields._sigpoll.si_band
#define si_fd _sifields._sigpoll.si_fd
#define si_call_addr _sifields._sigsys._call_addr
#define si_syscall _sifields._sigsys._syscall
#define si_arch _sifields._sigsys._arch

#endif // __LLVM_LIBC_TYPES_SIGINFO_T_H__