blob: e98531b25ce69d07d32e8e9f03242bf5aaa7af68 [file] [log] [blame]
/* -*- Mode: C++; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#ifndef RR_KERNEL_SUPPLEMENT_H_
#define RR_KERNEL_SUPPLEMENT_H_
#define _GNU_SOURCE 1
#include <linux/capability.h>
#include <linux/if_tun.h>
#include <linux/mman.h>
#include <linux/seccomp.h>
#include <linux/usbdevice_fs.h>
#include <sched.h>
#include <signal.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
namespace rr {
/* Definitions that should be part of system headers (and maybe are on some but
* not all systems).
* This should not contain anything for which rr needs all the definitions
* across architectures; those definitions belong in kernel_abi.h.
*/
#define KERNEL_CONSTANT(constant) \
constant = KernelConstants::constant
enum _ptrace_request {
KERNEL_CONSTANT(PTRACE_TRACEME),
KERNEL_CONSTANT(PTRACE_PEEKTEXT),
KERNEL_CONSTANT(PTRACE_PEEKDATA),
KERNEL_CONSTANT(PTRACE_PEEKUSR),
KERNEL_CONSTANT(PTRACE_PEEKUSER),
KERNEL_CONSTANT(PTRACE_POKETEXT),
KERNEL_CONSTANT(PTRACE_POKEDATA),
KERNEL_CONSTANT(PTRACE_POKEUSR),
KERNEL_CONSTANT(PTRACE_POKEUSER),
KERNEL_CONSTANT(PTRACE_CONT),
KERNEL_CONSTANT(PTRACE_KILL),
KERNEL_CONSTANT(PTRACE_SINGLESTEP),
KERNEL_CONSTANT(PTRACE_GETREGS),
KERNEL_CONSTANT(PTRACE_GETFPREGS),
KERNEL_CONSTANT(PTRACE_SETFPREGS),
KERNEL_CONSTANT(PTRACE_ATTACH),
KERNEL_CONSTANT(PTRACE_DETACH),
KERNEL_CONSTANT(PTRACE_SYSCALL),
KERNEL_CONSTANT(PTRACE_SETOPTIONS),
KERNEL_CONSTANT(PTRACE_GETEVENTMSG),
KERNEL_CONSTANT(PTRACE_GETSIGINFO),
KERNEL_CONSTANT(PTRACE_SETSIGINFO),
KERNEL_CONSTANT(PTRACE_GETREGSET),
KERNEL_CONSTANT(PTRACE_SETREGSET),
KERNEL_CONSTANT(PTRACE_SEIZE),
KERNEL_CONSTANT(PTRACE_INTERRUPT),
KERNEL_CONSTANT(PTRACE_LISTEN),
KERNEL_CONSTANT(PTRACE_GETSIGMASK),
KERNEL_CONSTANT(PTRACE_SETSIGMASK),
KERNEL_CONSTANT(PTRACE_GET_SYSCALL_INFO),
};
enum _ptrace_eventcodes {
KERNEL_CONSTANT(PTRACE_EVENT_NONE),
KERNEL_CONSTANT(PTRACE_EVENT_FORK),
KERNEL_CONSTANT(PTRACE_EVENT_VFORK),
KERNEL_CONSTANT(PTRACE_EVENT_CLONE),
KERNEL_CONSTANT(PTRACE_EVENT_EXEC),
KERNEL_CONSTANT(PTRACE_EVENT_VFORK_DONE),
KERNEL_CONSTANT(PTRACE_EVENT_EXIT),
KERNEL_CONSTANT(PTRACE_EVENT_SECCOMP),
KERNEL_CONSTANT(PTRACE_EVENT_SECCOMP_OBSOLETE),
KERNEL_CONSTANT(PTRACE_EVENT_STOP),
};
enum _ptrace_options {
KERNEL_CONSTANT(PTRACE_O_TRACESYSGOOD),
KERNEL_CONSTANT(PTRACE_O_TRACEFORK),
KERNEL_CONSTANT(PTRACE_O_TRACEVFORK),
KERNEL_CONSTANT(PTRACE_O_TRACECLONE),
KERNEL_CONSTANT(PTRACE_O_TRACEEXEC),
KERNEL_CONSTANT(PTRACE_O_TRACEVFORKDONE),
KERNEL_CONSTANT(PTRACE_O_TRACEEXIT),
KERNEL_CONSTANT(PTRACE_O_TRACESECCOMP),
KERNEL_CONSTANT(PTRACE_O_EXITKILL),
};
enum _ptrace_get_syscall_info_op {
KERNEL_CONSTANT(PTRACE_SYSCALL_INFO_NONE),
KERNEL_CONSTANT(PTRACE_SYSCALL_INFO_ENTRY),
KERNEL_CONSTANT(PTRACE_SYSCALL_INFO_EXIT),
KERNEL_CONSTANT(PTRACE_SYSCALL_INFO_SECCOMP),
};
#undef KERNEL_CONSTANT
#ifndef SECCOMP_SET_MODE_STRICT
#define SECCOMP_SET_MODE_STRICT 0
#endif
#ifndef SECCOMP_SET_MODE_FILTER
#define SECCOMP_SET_MODE_FILTER 1
#endif
#ifndef SECCOMP_FILTER_FLAG_TSYNC
#define SECCOMP_FILTER_FLAG_TSYNC 1
#endif
#ifndef SECCOMP_GET_ACTION_AVAIL
#define SECCOMP_GET_ACTION_AVAIL 2
#endif
#ifndef SECCOMP_GET_NOTIF_SIZES
#define SECCOMP_GET_NOTIF_SIZES 3
#endif
#ifndef SYS_SECCOMP
#define SYS_SECCOMP 1
#endif
#ifndef PR_GET_SPECULATION_CTRL
#define PR_GET_SPECULATION_CTRL 52
#endif
#ifndef PR_SET_SPECULATION_CTRL
#define PR_SET_SPECULATION_CTRL 53
#endif
// This is used on AArch64 and available in linux/signal.h, but
// including that header will conflict with a number of our
// struct definitions.
#ifndef TRAP_HWBKPT
#define TRAP_HWBKPT 4
#endif
// This is used on AArch64 and not available on CentOS 7.8
#ifndef NT_ARM_SYSTEM_CALL
#define NT_ARM_SYSTEM_CALL 0x404
#endif
// These are defined by the include/linux/errno.h in the kernel tree.
// Since userspace doesn't see these errnos in normal operation, that
// header apparently isn't distributed with libc.
#define ERESTARTSYS 512
#define ERESTARTNOINTR 513
#define ERESTARTNOHAND 514
#define ERESTART_RESTARTBLOCK 516
// These definitions haven't made it out to current libc-dev packages
// yet.
#ifndef GRND_NONBLOCK
#define GRND_NONBLOCK 0x0001
#define GRND_RANDOM 0x0002
#endif
/* We need to complement sigsets in order to update the Task blocked
* set, but POSIX doesn't appear to define a convenient helper. So we
* define our own linux-compatible sig_set_t and use bit operators to
* manipulate sigsets. */
typedef uint64_t sig_set_t;
static_assert(_NSIG / 8 == sizeof(sig_set_t), "Update sig_set_t for _NSIG.");
#ifndef BTRFS_IOCTL_MAGIC
#define BTRFS_IOCTL_MAGIC 0x94
#endif
#ifndef BTRFS_IOC_CLONE
#define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int)
#endif
#ifndef BTRFS_IOC_CLONE_RANGE
struct btrfs_ioctl_clone_range_args {
int64_t src_fd;
uint64_t src_offset;
uint64_t src_length;
uint64_t dest_offset;
};
#define BTRFS_IOC_CLONE_RANGE \
_IOW(BTRFS_IOCTL_MAGIC, 13, struct btrfs_ioctl_clone_range_args)
#endif
#ifndef USBDEVFS_GET_CAPABILITIES
#define USBDEVFS_GET_CAPABILITIES _IOR('U', 26, __u32)
#endif
#ifndef USBDEVFS_DISCONNECT_CLAIM
struct usbdevfs_disconnect_claim {
unsigned int interface;
unsigned int flags;
char driver[USBDEVFS_MAXDRIVERNAME + 1];
};
#define USBDEVFS_DISCONNECT_CLAIM \
_IOR('U', 27, struct usbdevfs_disconnect_claim)
#endif
#ifndef USBDEVFS_ALLOC_STREAMS
struct usbdevfs_streams {
unsigned int num_streams;
unsigned int num_eps;
unsigned char eps[0];
};
#define USBDEVFS_ALLOC_STREAMS _IOR('U', 28, struct usbdevfs_streams)
#define USBDEVFS_FREE_STREAMS _IOR('U', 29, struct usbdevfs_streams)
#endif
#ifndef TUNSETVNETLE
#define TUNSETVNETLE _IOW('T', 220, int)
#endif
#ifndef TUNGETVNETLE
#define TUNGETVNETLE _IOR('T', 221, int)
#endif
#ifndef TUNSETVNETBE
#define TUNSETVNETBE _IOW('T', 222, int)
#endif
#ifndef TUNGETVNETBE
#define TUNGETVNETBE _IOR('T', 223, int)
#endif
#ifndef TIOCGPKT
#define TIOCGPKT _IOR('T', 0x38, int)
#endif
#ifndef TIOCGPTLCK
#define TIOCGPTLCK _IOR('T', 0x39, int)
#endif
#ifndef TIOCGEXCL
#define TIOCGEXCL _IOR('T', 0x40, int)
#endif
#ifndef TIOCGPTPEER
#define TIOCGPTPEER _IO('T', 0x41)
#endif
struct rr_input_mask {
uint32_t type;
uint32_t codes_size;
uint64_t codes_ptr;
};
#ifndef EVIOCGMASK
#define EVIOCGMASK _IOR('E', 0x92, struct rr_input_mask)
#endif
#ifndef MADV_FREE
#define MADV_FREE 8
#endif
#ifndef MADV_DONTDUMP
#define MADV_DONTDUMP 16
#endif
#ifndef MADV_DODUMP
#define MADV_DODUMP 17
#endif
#ifndef MADV_WIPEONFORK
#define MADV_WIPEONFORK 18
#endif
#ifndef MADV_KEEPONFORK
#define MADV_KEEPONFORK 19
#endif
#ifndef MADV_SOFT_OFFLINE
#define MADV_SOFT_OFFLINE 101
#endif
#ifndef BUS_MCEERR_AR
#define BUS_MCEERR_AR 4
#endif
#ifndef BUS_MCEERR_AO
#define BUS_MCEERR_AO 5
#endif
// Defined in the ip_tables header for each protocol, but always to the same,
// value, so it should be fine to set this here
#ifndef SO_SET_REPLACE
#define SO_SET_REPLACE 64
#endif
#ifndef HCIGETDEVLIST
#define HCIGETDEVLIST _IOR('H', 210, int)
#endif
#ifndef HCIGETDEVINFO
#define HCIGETDEVINFO _IOR('H', 211, int)
#endif
// Unfortunately the header that defines these is not C++ safe, we we'll
// have to redefine them here
#ifndef KEYCTL_GET_KEYRING_ID
#define KEYCTL_GET_KEYRING_ID 0
#endif
#ifndef KEYCTL_JOIN_SESSION_KEYRING
#define KEYCTL_JOIN_SESSION_KEYRING 1
#endif
#ifndef KEYCTL_UPDATE
#define KEYCTL_UPDATE 2
#endif
#ifndef KEYCTL_REVOKE
#define KEYCTL_REVOKE 3
#endif
#ifndef KEYCTL_CHOWN
#define KEYCTL_CHOWN 4
#endif
#ifndef KEYCTL_SETPERM
#define KEYCTL_SETPERM 5
#endif
#ifndef KEYCTL_DESCRIBE
#define KEYCTL_DESCRIBE 6
#endif
#ifndef KEYCTL_CLEAR
#define KEYCTL_CLEAR 7
#endif
#ifndef KEYCTL_LINK
#define KEYCTL_LINK 8
#endif
#ifndef KEYCTL_UNLINK
#define KEYCTL_UNLINK 9
#endif
#ifndef KEYCTL_SEARCH
#define KEYCTL_SEARCH 10
#endif
#ifndef KEYCTL_READ
#define KEYCTL_READ 11
#endif
#ifndef KEYCTL_INSTANTIATE
#define KEYCTL_INSTANTIATE 12
#endif
#ifndef KEYCTL_NEGATE
#define KEYCTL_NEGATE 13
#endif
#ifndef KEYCTL_SET_REQKEY_KEYRING
#define KEYCTL_SET_REQKEY_KEYRING 14
#endif
#ifndef KEYCTL_SET_TIMEOUT
#define KEYCTL_SET_TIMEOUT 15
#endif
#ifndef KEYCTL_ASSUME_AUTHORITY
#define KEYCTL_ASSUME_AUTHORITY 16
#endif
#ifndef KEYCTL_GET_SECURITY
#define KEYCTL_GET_SECURITY 17
#endif
#ifndef KEYCTL_SESSION_TO_PARENT
#define KEYCTL_SESSION_TO_PARENT 18
#endif
#ifndef KEYCTL_REJECT
#define KEYCTL_REJECT 19
#endif
#ifndef KEYCTL_INSTANTIATE_IOV
#define KEYCTL_INSTANTIATE_IOV 20
#endif
#ifndef KEYCTL_INVALIDATE
#define KEYCTL_INVALIDATE 21
#endif
#ifndef KEYCTL_GET_PERSISTENT
#define KEYCTL_GET_PERSISTENT 22
#endif
#ifndef KEYCTL_DH_COMPUTE
#define KEYCTL_DH_COMPUTE 23
#endif
#ifndef PR_CAP_AMBIENT
#define PR_CAP_AMBIENT 47
#endif
#ifndef PR_CAP_AMBIENT_CLEAR_ALL
#define PR_CAP_AMBIENT_CLEAR_ALL 4
#endif
// New in the 3.17 kernel.
#ifndef VIDIOC_QUERY_EXT_CTRL
/* This definition omits the size because in prepare_ioctl
it is masked away anyway. And the real size is taken from
the real request by _IOC_SIZE(request). */
#define VIDIOC_QUERY_EXT_CTRL _IOWR('V', 103, 0)
#endif
// New in the 4.6 kernel.
#ifndef CLONE_NEWCGROUP
#define CLONE_NEWCGROUP 0x02000000
#endif
// These are only defined on x86. For simplicity, we defined
// them here for all architectures.
#ifndef ARCH_SET_GS
#define ARCH_SET_GS 0x1001
#endif
#ifndef ARCH_SET_FS
#define ARCH_SET_FS 0x1002
#endif
#ifndef ARCH_GET_FS
#define ARCH_GET_FS 0x1003
#endif
#ifndef ARCH_GET_GS
#define ARCH_GET_GS 0x1004
#endif
// New in the 4.12 kernel
#ifndef ARCH_GET_CPUID
#define ARCH_GET_CPUID 0x1011
#endif
#ifndef ARCH_SET_CPUID
#define ARCH_SET_CPUID 0x1012
#endif
// New in the 4.15 kernel
#ifndef MAP_SYNC
#define MAP_SYNC 0x80000
#endif
enum {
BPF_MAP_CREATE,
BPF_MAP_LOOKUP_ELEM,
BPF_MAP_UPDATE_ELEM,
BPF_MAP_DELETE_ELEM,
BPF_MAP_GET_NEXT_KEY,
BPF_PROG_LOAD,
BPF_OBJ_PIN,
BPF_OBJ_GET,
BPF_PROG_ATTACH,
BPF_PROG_DETACH,
BPF_PROG_TEST_RUN,
BPF_PROG_GET_NEXT_ID,
BPF_MAP_GET_NEXT_ID,
BPF_PROG_GET_FD_BY_ID,
BPF_MAP_GET_FD_BY_ID,
BPF_OBJ_GET_INFO_BY_FD,
BPF_PROG_QUERY,
BPF_RAW_TRACEPOINT_OPEN,
BPF_BTF_LOAD,
BPF_BTF_GET_FD_BY_ID,
BPF_TASK_FD_QUERY,
BPF_MAP_LOOKUP_AND_DELETE_ELEM,
BPF_MAP_FREEZE,
BPF_BTF_GET_NEXT_ID,
BPF_MAP_LOOKUP_BATCH,
BPF_MAP_LOOKUP_AND_DELETE_BATCH,
BPF_MAP_UPDATE_BATCH,
BPF_MAP_DELETE_BATCH,
BPF_LINK_CREATE,
BPF_LINK_UPDATE,
BPF_LINK_GET_FD_BY_ID,
BPF_LINK_GET_NEXT_ID,
BPF_ENABLE_STATS,
BPF_ITER_CREATE,
BPF_LINK_DETACH,
BPF_PROG_BIND_MAP,
};
#ifndef O_PATH
#define O_PATH 040000000
#endif
#ifndef MAX_HANDLE_SZ
#define MAX_HANDLE_SZ 128
#endif
#ifndef P_PIDFD
#define P_PIDFD 3
#endif
#ifndef CLONE_PIDFD
#define CLONE_PIDFD 0x1000
#endif
#ifndef RLIMIT_RTTIME
#define RLIMIT_RTTIME 15
#endif
#ifndef CAP_PERFMON
#define CAP_PERFMON 38
#endif
#ifndef SEGV_PKUERR
#define SEGV_PKUERR 4
#endif
#define RR_RSEQ_FLAG_UNREGISTER (1 << 0)
#define RR_RSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT 0
#define RR_RSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT 1
#define RR_RSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT 2
#define RR_RSEQ_CPU_ID_UNINITIALIZED -1
// New in the 5.7 kernel
#ifndef MREMAP_DONTUNMAP
#define MREMAP_DONTUNMAP 4
#endif
// New in the 5.15 kernel
#ifndef BLKGETDISKSEQ
#define BLKGETDISKSEQ _IOR(0x12,128,__u64)
#endif
// New in the 5.17 kernel
#ifndef PR_SET_VMA
#define PR_SET_VMA 0x53564d41
#endif
#ifndef PR_SET_VMA_ANON_NAME
#define PR_SET_VMA_ANON_NAME 0
#endif
// Technically not "kernel" constants, exactly, since these are defined
// in libc, but required for compat with older libcs like the rest of
// this file.
#ifndef SHF_COMPRESSED
#define SHF_COMPRESSED (1 << 11)
#endif
#ifndef ELFCOMPRESS_ZLIB
#define ELFCOMPRESS_ZLIB 1
#endif
// O_LARGEFILE is defined to 0 for 64-bit builds. We need to know the
// value that is used for 32-bit processes.
#define RR_LARGEFILE_32 0x8000
} // namespace rr
// We can't include libc's ptrace.h, so declare this here.
extern "C" long int ptrace (enum rr::_ptrace_request _request, ...);
#endif /* RR_KERNEL_SUPPLEMENT_H_ */