File: ptrace.h

package info (click to toggle)
criu 4.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,584 kB
  • sloc: ansic: 139,280; python: 7,484; sh: 3,824; java: 2,799; makefile: 2,659; asm: 1,137; perl: 206; xml: 117; exp: 45
file content (108 lines) | stat: -rw-r--r-- 2,945 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifndef UAPI_COMPEL_PTRACE_H__
#define UAPI_COMPEL_PTRACE_H__

#include "common/compiler.h"
/*
 * We'd want to include both sys/ptrace.h and linux/ptrace.h,
 * hoping that most definitions come from either one or another.
 * Alas, on Alpine/musl both files declare struct ptrace_peeksiginfo_args,
 * so there is no way they can be used together. Let's rely on libc one.
 */
#include <sys/ptrace.h>
#include <stdint.h>

#include <compel/asm/breakpoints.h>

/*
 * Some constants for ptrace that might be missing from the
 * standard library includes due to being (relatively) new.
 */

#ifndef PTRACE_SEIZE
#define PTRACE_SEIZE 0x4206
#endif

#ifndef PTRACE_O_SUSPEND_SECCOMP
#define PTRACE_O_SUSPEND_SECCOMP (1 << 21)
#endif

#ifndef PTRACE_INTERRUPT
#define PTRACE_INTERRUPT 0x4207
#endif

#ifndef PTRACE_PEEKSIGINFO
#define PTRACE_PEEKSIGINFO 0x4209

/* Read signals from a shared (process wide) queue */
#define PTRACE_PEEKSIGINFO_SHARED (1 << 0)
#endif

#ifndef PTRACE_GETREGSET
#define PTRACE_GETREGSET 0x4204
#define PTRACE_SETREGSET 0x4205
#endif

#ifndef PTRACE_GETSIGMASK
#define PTRACE_GETSIGMASK 0x420a
#define PTRACE_SETSIGMASK 0x420b
#endif

#ifndef PTRACE_SECCOMP_GET_FILTER
#define PTRACE_SECCOMP_GET_FILTER 0x420c
#endif

#ifndef PTRACE_SECCOMP_GET_METADATA
#define PTRACE_SECCOMP_GET_METADATA 0x420d
#endif /* PTRACE_SECCOMP_GET_METADATA */

/*
 * struct seccomp_metadata is not yet
 * settled down well in headers so use
 * own identical definition for a while.
 */
typedef struct {
	uint64_t filter_off; /* Input: which filter */
	uint64_t flags;	     /* Output: filter's flags */
} seccomp_metadata_t;

#ifndef PTRACE_GET_RSEQ_CONFIGURATION
#define PTRACE_GET_RSEQ_CONFIGURATION 0x420f

struct __ptrace_rseq_configuration {
	uint64_t rseq_abi_pointer;
	uint32_t rseq_abi_size;
	uint32_t signature;
	uint32_t flags;
	uint32_t pad;
};
#endif

#ifdef PTRACE_EVENT_STOP
#if PTRACE_EVENT_STOP == 7 /* Bad value from Linux 3.1-3.3, fixed in 3.4 */
#undef PTRACE_EVENT_STOP
#endif
#endif
#ifndef PTRACE_EVENT_STOP
#define PTRACE_EVENT_STOP 128
#endif

/*
 * Amazon Linux 2 uses glibc 2.26. PTRACE_ARCH_PRCTL was added in glibc 2.27.
 * This allows CRIU to build on Amazon Linux 2.
 *
 * Note that in sys/ptrace.h, PTRACE_ARCH_PRCTL is an enum value so the
 * preprocessor doesn't know about it. PT_ARCH_PRCTL is the preprocessor symbol
 * that matches the value of PTRACE_ARCH_PRCTL. So look for PT_ARCH_PRCTL to
 * decide if PTRACE_ARCH_PRCTL is available or not.
 */
#if defined(__x86_64__) && !defined(PT_ARCH_PRCTL)
#define PTRACE_ARCH_PRCTL 30 /* From asm/ptrace-abi.h. */
#endif

extern int ptrace_suspend_seccomp(pid_t pid);

extern int __must_check ptrace_peek_area(pid_t pid, void *dst, void *addr, long bytes);
extern int __must_check ptrace_poke_area(pid_t pid, void *src, void *addr, long bytes);
extern int __must_check ptrace_swap_area(pid_t pid, void *dst, void *src, long bytes);

#endif /* UAPI_COMPEL_PTRACE_H__ */