[CRIU] [PATCH 45/78] infect: Move breakpoints management into infect
Cyrill Gorcunov
gorcunov at openvz.org
Mon Nov 7 08:36:30 PST 2016
From: Pavel Emelyanov <xemul at virtuozzo.com>
This removes restorer.h from infect. The header describes
routines, structures and constants messing with restorer blob.
Signed-off-by: Pavel Emelyanov <xemul at virtuozzo.com>
---
compel/arch/aarch64/src/lib/include/ptrace.h | 11 +++++
compel/arch/arm/src/lib/include/ptrace.h | 11 +++++
compel/arch/ppc64/src/lib/include/ptrace.h | 11 +++++
compel/arch/x86/src/lib/include/ptrace.h | 2 +
criu/arch/aarch64/include/asm/restorer.h | 10 -----
criu/arch/arm/include/asm/restorer.h | 10 -----
criu/arch/ppc64/include/asm/restorer.h | 10 -----
criu/arch/x86/crtools.c | 59 ---------------------------
criu/arch/x86/infect.c | 60 ++++++++++++++++++++++++++++
criu/infect.c | 13 +++++-
10 files changed, 106 insertions(+), 91 deletions(-)
diff --git a/compel/arch/aarch64/src/lib/include/ptrace.h b/compel/arch/aarch64/src/lib/include/ptrace.h
index 9cf7d460de01..e18454df24bb 100644
--- a/compel/arch/aarch64/src/lib/include/ptrace.h
+++ b/compel/arch/aarch64/src/lib/include/ptrace.h
@@ -1,4 +1,15 @@
#ifndef __COMPEL_PTRACE_H__
#define __COMPEL_PTRACE_H__
#define ARCH_SI_TRAP TRAP_BRKPT
+
+static inline int ptrace_set_breakpoint(pid_t pid, void *addr)
+{
+ return 0;
+}
+
+static inline int ptrace_flush_breakpoints(pid_t pid)
+{
+ return 0;
+}
+
#endif
diff --git a/compel/arch/arm/src/lib/include/ptrace.h b/compel/arch/arm/src/lib/include/ptrace.h
index 9cf7d460de01..e18454df24bb 100644
--- a/compel/arch/arm/src/lib/include/ptrace.h
+++ b/compel/arch/arm/src/lib/include/ptrace.h
@@ -1,4 +1,15 @@
#ifndef __COMPEL_PTRACE_H__
#define __COMPEL_PTRACE_H__
#define ARCH_SI_TRAP TRAP_BRKPT
+
+static inline int ptrace_set_breakpoint(pid_t pid, void *addr)
+{
+ return 0;
+}
+
+static inline int ptrace_flush_breakpoints(pid_t pid)
+{
+ return 0;
+}
+
#endif
diff --git a/compel/arch/ppc64/src/lib/include/ptrace.h b/compel/arch/ppc64/src/lib/include/ptrace.h
index 9cf7d460de01..0274c2675237 100644
--- a/compel/arch/ppc64/src/lib/include/ptrace.h
+++ b/compel/arch/ppc64/src/lib/include/ptrace.h
@@ -1,4 +1,15 @@
#ifndef __COMPEL_PTRACE_H__
#define __COMPEL_PTRACE_H__
#define ARCH_SI_TRAP TRAP_BRKPT
+
+static inline int ptrace_set_breakpoint(pid_t pid, void *addr)
+{
+ return 0;
+}
+
+static inline int ptrace_flush_breakpoints(pid_t pid)
+{
+ return 0;
+}
+
#endif
diff --git a/compel/arch/x86/src/lib/include/ptrace.h b/compel/arch/x86/src/lib/include/ptrace.h
index 991f1152ad7d..844ea0efd938 100644
--- a/compel/arch/x86/src/lib/include/ptrace.h
+++ b/compel/arch/x86/src/lib/include/ptrace.h
@@ -1,4 +1,6 @@
#ifndef __COMPEL_PTRACE_H__
#define __COMPEL_PTRACE_H__
#define ARCH_SI_TRAP SI_KERNEL
+extern int ptrace_set_breakpoint(pid_t pid, void *addr);
+extern int ptrace_flush_breakpoints(pid_t pid);
#endif
diff --git a/criu/arch/aarch64/include/asm/restorer.h b/criu/arch/aarch64/include/asm/restorer.h
index e23ab11fbfbd..b842a74ef0ef 100644
--- a/criu/arch/aarch64/include/asm/restorer.h
+++ b/criu/arch/aarch64/include/asm/restorer.h
@@ -62,16 +62,6 @@ static inline void restore_tls(tls_t *ptls)
asm("msr tpidr_el0, %0" : : "r" (*ptls));
}
-static inline int ptrace_set_breakpoint(pid_t pid, void *addr)
-{
- return 0;
-}
-
-static inline int ptrace_flush_breakpoints(pid_t pid)
-{
- return 0;
-}
-
static inline void *alloc_compat_syscall_stack(void) { return NULL; }
static inline void free_compat_syscall_stack(void *stack32) { }
static inline int
diff --git a/criu/arch/arm/include/asm/restorer.h b/criu/arch/arm/include/asm/restorer.h
index 095a9b3285d6..c3b65922212a 100644
--- a/criu/arch/arm/include/asm/restorer.h
+++ b/criu/arch/arm/include/asm/restorer.h
@@ -73,16 +73,6 @@ static inline void restore_tls(tls_t *ptls) {
);
}
-static inline int ptrace_set_breakpoint(pid_t pid, void *addr)
-{
- return 0;
-}
-
-static inline int ptrace_flush_breakpoints(pid_t pid)
-{
- return 0;
-}
-
static inline void *alloc_compat_syscall_stack(void) { return NULL; }
static inline void free_compat_syscall_stack(void *stack32) { }
static inline int
diff --git a/criu/arch/ppc64/include/asm/restorer.h b/criu/arch/ppc64/include/asm/restorer.h
index afd00c519059..5342fab68775 100644
--- a/criu/arch/ppc64/include/asm/restorer.h
+++ b/criu/arch/ppc64/include/asm/restorer.h
@@ -55,16 +55,6 @@ int restore_nonsigframe_gpregs(UserPpc64RegsEntry *r);
/* Nothing to do, TLS is accessed through r13 */
static inline void restore_tls(tls_t *ptls) { (void)ptls; }
-static inline int ptrace_set_breakpoint(pid_t pid, void *addr)
-{
- return 0;
-}
-
-static inline int ptrace_flush_breakpoints(pid_t pid)
-{
- return 0;
-}
-
/*
* Defined in arch/ppc64/syscall-common-ppc64.S
*/
diff --git a/criu/arch/x86/crtools.c b/criu/arch/x86/crtools.c
index 89a802fd7b47..6b0dedee8441 100644
--- a/criu/arch/x86/crtools.c
+++ b/criu/arch/x86/crtools.c
@@ -1,7 +1,6 @@
#include <string.h>
#include <unistd.h>
#include <elf.h>
-#include <sys/user.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <sys/auxv.h>
@@ -450,61 +449,3 @@ int restore_gpregs(struct rt_sigframe *f, UserX86RegsEntry *r)
}
#endif
-/* Copied from the gdb header gdb/nat/x86-dregs.h */
-
-/* Debug registers' indices. */
-#define DR_FIRSTADDR 0
-#define DR_LASTADDR 3
-#define DR_NADDR 4 /* The number of debug address registers. */
-#define DR_STATUS 6 /* Index of debug status register (DR6). */
-#define DR_CONTROL 7 /* Index of debug control register (DR7). */
-
-#define DR_LOCAL_ENABLE_SHIFT 0 /* Extra shift to the local enable bit. */
-#define DR_GLOBAL_ENABLE_SHIFT 1 /* Extra shift to the global enable bit. */
-#define DR_ENABLE_SIZE 2 /* Two enable bits per debug register. */
-
-/* Locally enable the break/watchpoint in the I'th debug register. */
-#define X86_DR_LOCAL_ENABLE(i) (1 << (DR_LOCAL_ENABLE_SHIFT + DR_ENABLE_SIZE * (i)))
-
-int ptrace_set_breakpoint(pid_t pid, void *addr)
-{
- int ret;
-
- /* Set a breakpoint */
- if (ptrace(PTRACE_POKEUSER, pid,
- offsetof(struct user, u_debugreg[DR_FIRSTADDR]),
- addr)) {
- pr_perror("Unable to setup a breakpoint into %d", pid);
- return -1;
- }
-
- /* Enable the breakpoint */
- if (ptrace(PTRACE_POKEUSER, pid,
- offsetof(struct user, u_debugreg[DR_CONTROL]),
- X86_DR_LOCAL_ENABLE(DR_FIRSTADDR))) {
- pr_perror("Unable to enable the breakpoint for %d", pid);
- return -1;
- }
-
- ret = ptrace(PTRACE_CONT, pid, NULL, NULL);
- if (ret) {
- pr_perror("Unable to restart the stopped tracee process %d", pid);
- return -1;
- }
-
- return 1;
-}
-
-int ptrace_flush_breakpoints(pid_t pid)
-{
- /* Disable the breakpoint */
- if (ptrace(PTRACE_POKEUSER, pid,
- offsetof(struct user, u_debugreg[DR_CONTROL]),
- 0)) {
- pr_perror("Unable to disable the breakpoint for %d", pid);
- return -1;
- }
-
- return 0;
-}
-
diff --git a/criu/arch/x86/infect.c b/criu/arch/x86/infect.c
index 3208e3af0ded..6ba9774caaca 100644
--- a/criu/arch/x86/infect.c
+++ b/criu/arch/x86/infect.c
@@ -3,11 +3,13 @@
#include <sys/uio.h>
#include <sys/auxv.h>
#include <sys/mman.h>
+#include <sys/user.h>
#include "asm/processor-flags.h"
#include "asm/parasite-syscall.h"
#include "uapi/std/syscall-codes.h"
#include "compel/include/asm/syscall.h"
+#include "compel/include/asm/ptrace.h"
#include "err.h"
#include "asm/fpu.h"
#include "asm/types.h"
@@ -246,6 +248,64 @@ bool arch_can_dump_task(struct parasite_ctl *ctl)
return true;
}
+/* Copied from the gdb header gdb/nat/x86-dregs.h */
+
+/* Debug registers' indices. */
+#define DR_FIRSTADDR 0
+#define DR_LASTADDR 3
+#define DR_NADDR 4 /* The number of debug address registers. */
+#define DR_STATUS 6 /* Index of debug status register (DR6). */
+#define DR_CONTROL 7 /* Index of debug control register (DR7). */
+
+#define DR_LOCAL_ENABLE_SHIFT 0 /* Extra shift to the local enable bit. */
+#define DR_GLOBAL_ENABLE_SHIFT 1 /* Extra shift to the global enable bit. */
+#define DR_ENABLE_SIZE 2 /* Two enable bits per debug register. */
+
+/* Locally enable the break/watchpoint in the I'th debug register. */
+#define X86_DR_LOCAL_ENABLE(i) (1 << (DR_LOCAL_ENABLE_SHIFT + DR_ENABLE_SIZE * (i)))
+
+int ptrace_set_breakpoint(pid_t pid, void *addr)
+{
+ int ret;
+
+ /* Set a breakpoint */
+ if (ptrace(PTRACE_POKEUSER, pid,
+ offsetof(struct user, u_debugreg[DR_FIRSTADDR]),
+ addr)) {
+ pr_perror("Unable to setup a breakpoint into %d", pid);
+ return -1;
+ }
+
+ /* Enable the breakpoint */
+ if (ptrace(PTRACE_POKEUSER, pid,
+ offsetof(struct user, u_debugreg[DR_CONTROL]),
+ X86_DR_LOCAL_ENABLE(DR_FIRSTADDR))) {
+ pr_perror("Unable to enable the breakpoint for %d", pid);
+ return -1;
+ }
+
+ ret = ptrace(PTRACE_CONT, pid, NULL, NULL);
+ if (ret) {
+ pr_perror("Unable to restart the stopped tracee process %d", pid);
+ return -1;
+ }
+
+ return 1;
+}
+
+int ptrace_flush_breakpoints(pid_t pid)
+{
+ /* Disable the breakpoint */
+ if (ptrace(PTRACE_POKEUSER, pid,
+ offsetof(struct user, u_debugreg[DR_CONTROL]),
+ 0)) {
+ pr_perror("Unable to disable the breakpoint for %d", pid);
+ return -1;
+ }
+
+ return 0;
+}
+
int ptrace_get_regs(pid_t pid, user_regs_struct_t *regs)
{
struct iovec iov;
diff --git a/criu/infect.c b/criu/infect.c
index a3801a983acd..d171ed31b859 100644
--- a/criu/infect.c
+++ b/criu/infect.c
@@ -4,21 +4,30 @@
#include <unistd.h>
#include <errno.h>
#include <signal.h>
+#include <sys/mman.h>
+#include <stdio.h>
#include <linux/seccomp.h>
+#include "xmalloc.h"
+#include "uapi/std/syscall-codes.h"
+#include "uapi/std/asm/syscall-types.h"
#include "compel/include/asm/ptrace.h"
#include "compel/include/asm/syscall.h"
+#include "asm/sigframe.h"
#include "infect.h"
#include "ptrace.h"
-#include "restorer.h"
#include "pie-relocs.h"
#include "parasite-blob.h"
-#include "sigframe.h"
#include "criu-log.h"
+#include "common/bug.h"
+#include "lock.h"
#include "infect-rpc.h"
#include "infect-priv.h"
#include "infect-util.h"
+#include <fcntl.h>
+#include "util.h"
+
#define UNIX_PATH_MAX (sizeof(struct sockaddr_un) - \
(size_t)((struct sockaddr_un *) 0)->sun_path)
--
2.7.4
More information about the CRIU
mailing list