Commit cd368c8e authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Andrei Vagin

infect: Move ptrace_get/set_regs() into ptrace.c

The criu/ptrace.c will also go into compel sources, so
detach the needed code from CRIU as well.
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 3e2f8957
...@@ -211,49 +211,6 @@ int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpre ...@@ -211,49 +211,6 @@ int save_task_regs(void *x, user_regs_struct_t *regs, user_fpregs_struct_t *fpre
return 0; return 0;
} }
int ptrace_get_regs(pid_t pid, user_regs_struct_t *regs)
{
struct iovec iov;
int ret;
iov.iov_base = &regs->native;
iov.iov_len = sizeof(user_regs_struct64);
ret = ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov);
if (ret == -1) {
pr_perror("PTRACE_GETREGSET failed");
return -1;
}
if (iov.iov_len == sizeof(regs->native)) {
regs->__is_native = NATIVE_MAGIC;
return ret;
}
if (iov.iov_len == sizeof(regs->compat)) {
regs->__is_native = COMPAT_MAGIC;
return ret;
}
pr_err("PTRACE_GETREGSET read %zu bytes for pid %d, but native/compat regs sizes are %zu/%zu bytes",
iov.iov_len, pid,
sizeof(regs->native), sizeof(regs->compat));
return -1;
}
int ptrace_set_regs(pid_t pid, user_regs_struct_t *regs)
{
struct iovec iov;
if (user_regs_native(regs)) {
iov.iov_base = &regs->native;
iov.iov_len = sizeof(user_regs_struct64);
} else {
iov.iov_base = &regs->compat;
iov.iov_len = sizeof(user_regs_struct32);
}
return ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &iov);
}
static void alloc_tls(ThreadInfoX86 *ti, void **mempool) static void alloc_tls(ThreadInfoX86 *ti, void **mempool)
{ {
int i; int i;
......
...@@ -5,10 +5,6 @@ extern int save_task_regs(void *, user_regs_struct_t *, user_fpregs_struct_t *); ...@@ -5,10 +5,6 @@ extern int save_task_regs(void *, user_regs_struct_t *, user_fpregs_struct_t *);
extern int arch_alloc_thread_info(CoreEntry *core); extern int arch_alloc_thread_info(CoreEntry *core);
extern void arch_free_thread_info(CoreEntry *core); extern void arch_free_thread_info(CoreEntry *core);
#define ARCH_HAS_GET_REGS
extern int ptrace_get_regs(pid_t pid, user_regs_struct_t *regs);
extern int ptrace_set_regs(pid_t pid, user_regs_struct_t *regs);
static inline void core_put_tls(CoreEntry *core, tls_t tls) static inline void core_put_tls(CoreEntry *core, tls_t tls)
{ {
ThreadInfoX86 *ti = core->thread_info; ThreadInfoX86 *ti = core->thread_info;
......
...@@ -169,3 +169,46 @@ void *remote_mmap(struct parasite_ctl *ctl, ...@@ -169,3 +169,46 @@ void *remote_mmap(struct parasite_ctl *ctl,
return (void *)map; return (void *)map;
} }
int ptrace_get_regs(pid_t pid, user_regs_struct_t *regs)
{
struct iovec iov;
int ret;
iov.iov_base = &regs->native;
iov.iov_len = sizeof(user_regs_struct64);
ret = ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov);
if (ret == -1) {
pr_perror("PTRACE_GETREGSET failed");
return -1;
}
if (iov.iov_len == sizeof(regs->native)) {
regs->__is_native = NATIVE_MAGIC;
return ret;
}
if (iov.iov_len == sizeof(regs->compat)) {
regs->__is_native = COMPAT_MAGIC;
return ret;
}
pr_err("PTRACE_GETREGSET read %zu bytes for pid %d, but native/compat regs sizes are %zu/%zu bytes",
iov.iov_len, pid,
sizeof(regs->native), sizeof(regs->compat));
return -1;
}
int ptrace_set_regs(pid_t pid, user_regs_struct_t *regs)
{
struct iovec iov;
if (user_regs_native(regs)) {
iov.iov_base = &regs->native;
iov.iov_len = sizeof(user_regs_struct64);
} else {
iov.iov_base = &regs->compat;
iov.iov_len = sizeof(user_regs_struct32);
}
return ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &iov);
}
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include <linux/types.h> #include <linux/types.h>
#include <sys/ptrace.h> #include <sys/ptrace.h>
#include "types.h"
/* some constants for ptrace */ /* some constants for ptrace */
#ifndef PTRACE_SEIZE #ifndef PTRACE_SEIZE
# define PTRACE_SEIZE 0x4206 # define PTRACE_SEIZE 0x4206
...@@ -67,4 +69,7 @@ extern int ptrace_peek_area(pid_t pid, void *dst, void *addr, long bytes); ...@@ -67,4 +69,7 @@ extern int ptrace_peek_area(pid_t pid, void *dst, void *addr, long bytes);
extern int ptrace_poke_area(pid_t pid, void *src, void *addr, long bytes); extern int ptrace_poke_area(pid_t pid, void *src, void *addr, long bytes);
extern int ptrace_swap_area(pid_t pid, void *dst, void *src, long bytes); extern int ptrace_swap_area(pid_t pid, void *dst, void *src, long bytes);
extern int ptrace_get_regs(pid_t pid, user_regs_struct_t *regs);
extern int ptrace_set_regs(pid_t pid, user_regs_struct_t *regs);
#endif /* __CR_PTRACE_H__ */ #endif /* __CR_PTRACE_H__ */
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include "infect.h" #include "infect.h"
#include "ptrace.h" #include "ptrace.h"
#include "asm/parasite-syscall.h" #include "asm/parasite-syscall.h"
#include "asm/dump.h"
#include "restorer.h" #include "restorer.h"
#include "parasite-syscall.h" #include "parasite-syscall.h"
#include "pie-relocs.h" #include "pie-relocs.h"
......
...@@ -68,26 +68,6 @@ unsigned long get_exec_start(struct vm_area_list *vmas) ...@@ -68,26 +68,6 @@ unsigned long get_exec_start(struct vm_area_list *vmas)
return 0; return 0;
} }
#ifndef ARCH_HAS_GET_REGS
static inline int ptrace_get_regs(int pid, user_regs_struct_t *regs)
{
struct iovec iov;
iov.iov_base = regs;
iov.iov_len = sizeof(user_regs_struct_t);
return ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov);
}
static inline int ptrace_set_regs(int pid, user_regs_struct_t *regs)
{
struct iovec iov;
iov.iov_base = regs;
iov.iov_len = sizeof(user_regs_struct_t);
return ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &iov);
}
#endif
int parasite_send_fd(struct parasite_ctl *ctl, int fd) int parasite_send_fd(struct parasite_ctl *ctl, int fd)
{ {
int sk; int sk;
......
...@@ -7,7 +7,8 @@ ...@@ -7,7 +7,8 @@
#include <stdbool.h> #include <stdbool.h>
#include <limits.h> #include <limits.h>
#include <signal.h> #include <signal.h>
#include <elf.h>
#include <sys/uio.h>
#include <sys/ptrace.h> #include <sys/ptrace.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/time.h> #include <sys/time.h>
...@@ -82,3 +83,20 @@ int ptrace_swap_area(pid_t pid, void *dst, void *src, long bytes) ...@@ -82,3 +83,20 @@ int ptrace_swap_area(pid_t pid, void *dst, void *src, long bytes)
return 0; return 0;
} }
int __attribute__((weak)) ptrace_get_regs(int pid, user_regs_struct_t *regs) {
struct iovec iov;
iov.iov_base = regs;
iov.iov_len = sizeof(user_regs_struct_t);
return ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov);
}
int __attribute__((weak)) ptrace_set_regs(int pid, user_regs_struct_t *regs)
{
struct iovec iov;
iov.iov_base = regs;
iov.iov_len = sizeof(user_regs_struct_t);
return ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &iov);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment