|
|
d2b3e5 |
From 0f98ee4641458301a3bbe49c88df381edaea93dc Mon Sep 17 00:00:00 2001
|
|
|
d2b3e5 |
From: Dmitry Safonov <dima@arista.com>
|
|
|
d2b3e5 |
Date: Thu, 10 May 2018 19:14:44 +0100
|
|
|
d2b3e5 |
Subject: [PATCH 4/8] compel/criu: Add ARCH_HAS_LONG_PAGES to PIE binaries
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
For architectures like aarch64/ppc64 it's needed to propagate the size
|
|
|
d2b3e5 |
of page inside PIEs. For the parasite page size will be defined during
|
|
|
d2b3e5 |
seizing, and for restorer during early initialization.
|
|
|
d2b3e5 |
Afterward we can use PAGE_SIZE in PIEs like we did before.
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
Signed-off-by: Dmitry Safonov <dima@arista.com>
|
|
|
d2b3e5 |
Signed-off-by: Andrei Vagin <avagin@virtuozzo.com>
|
|
|
d2b3e5 |
---
|
|
|
d2b3e5 |
compel/include/rpc-pie-priv.h | 3 +++
|
|
|
d2b3e5 |
compel/plugins/std/infect.c | 17 +++++++++++++++++
|
|
|
d2b3e5 |
compel/src/lib/infect.c | 3 +++
|
|
|
d2b3e5 |
criu/cr-restore.c | 3 +++
|
|
|
d2b3e5 |
criu/include/restorer.h | 3 +++
|
|
|
d2b3e5 |
criu/pie/restorer.c | 16 ++++++++++++++++
|
|
|
d2b3e5 |
include/common/arch/aarch64/asm/page.h | 9 +++++++++
|
|
|
d2b3e5 |
include/common/arch/ppc64/asm/page.h | 9 +++++++++
|
|
|
d2b3e5 |
8 files changed, 63 insertions(+)
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
diff --git a/compel/include/rpc-pie-priv.h b/compel/include/rpc-pie-priv.h
|
|
|
d2b3e5 |
index f25ca89eb..15f5b14ca 100644
|
|
|
d2b3e5 |
--- a/compel/include/rpc-pie-priv.h
|
|
|
d2b3e5 |
+++ b/compel/include/rpc-pie-priv.h
|
|
|
d2b3e5 |
@@ -38,6 +38,9 @@ struct parasite_init_args {
|
|
|
d2b3e5 |
uint64_t sigreturn_addr;
|
|
|
d2b3e5 |
uint64_t sigframe; /* pointer to sigframe */
|
|
|
d2b3e5 |
futex_t daemon_connected;
|
|
|
d2b3e5 |
+#ifdef ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+ uint32_t page_size;
|
|
|
d2b3e5 |
+#endif
|
|
|
d2b3e5 |
};
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
struct parasite_unmap_args {
|
|
|
d2b3e5 |
diff --git a/compel/plugins/std/infect.c b/compel/plugins/std/infect.c
|
|
|
d2b3e5 |
index 2d3aa3df8..d5e1b4354 100644
|
|
|
d2b3e5 |
--- a/compel/plugins/std/infect.c
|
|
|
d2b3e5 |
+++ b/compel/plugins/std/infect.c
|
|
|
d2b3e5 |
@@ -3,6 +3,7 @@
|
|
|
d2b3e5 |
#include "common/scm.h"
|
|
|
d2b3e5 |
#include "common/compiler.h"
|
|
|
d2b3e5 |
#include "common/lock.h"
|
|
|
d2b3e5 |
+#include "common/page.h"
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
#define pr_err(fmt, ...) print_on_level(1, fmt, ##__VA_ARGS__)
|
|
|
d2b3e5 |
#define pr_info(fmt, ...) print_on_level(3, fmt, ##__VA_ARGS__)
|
|
|
d2b3e5 |
@@ -19,6 +20,19 @@ static int tsock = -1;
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
static struct rt_sigframe *sigframe;
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
+#ifdef ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+/*
|
|
|
d2b3e5 |
+ * XXX: Make it compel's std plugin global variable. Drop parasite_size().
|
|
|
d2b3e5 |
+ * Hint: compel on aarch64 shall learn relocs for that.
|
|
|
d2b3e5 |
+ */
|
|
|
d2b3e5 |
+static unsigned __page_size;
|
|
|
d2b3e5 |
+
|
|
|
d2b3e5 |
+unsigned __attribute((weak)) page_size(void)
|
|
|
d2b3e5 |
+{
|
|
|
d2b3e5 |
+ return __page_size;
|
|
|
d2b3e5 |
+}
|
|
|
d2b3e5 |
+#endif
|
|
|
d2b3e5 |
+
|
|
|
d2b3e5 |
int parasite_get_rpc_sock(void)
|
|
|
d2b3e5 |
{
|
|
|
d2b3e5 |
return tsock;
|
|
|
d2b3e5 |
@@ -142,6 +156,9 @@ static noinline __used int parasite_init_daemon(void *data)
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
args->sigreturn_addr = (uint64_t)(uintptr_t)fini_sigreturn;
|
|
|
d2b3e5 |
sigframe = (void*)(uintptr_t)args->sigframe;
|
|
|
d2b3e5 |
+#ifdef ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+ __page_size = args->page_size;
|
|
|
d2b3e5 |
+#endif
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
ret = tsock = sys_socket(PF_UNIX, SOCK_SEQPACKET, 0);
|
|
|
d2b3e5 |
if (tsock < 0) {
|
|
|
d2b3e5 |
diff --git a/compel/src/lib/infect.c b/compel/src/lib/infect.c
|
|
|
d2b3e5 |
index ecc6599b1..d51b8aa88 100644
|
|
|
d2b3e5 |
--- a/compel/src/lib/infect.c
|
|
|
d2b3e5 |
+++ b/compel/src/lib/infect.c
|
|
|
d2b3e5 |
@@ -613,6 +613,9 @@ static int parasite_init_daemon(struct parasite_ctl *ctl)
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
args->sigframe = (uintptr_t)ctl->rsigframe;
|
|
|
d2b3e5 |
args->log_level = compel_log_get_loglevel();
|
|
|
d2b3e5 |
+#ifdef ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+ args->page_size = PAGE_SIZE;
|
|
|
d2b3e5 |
+#endif
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
futex_set(&args->daemon_connected, 0);
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
diff --git a/criu/cr-restore.c b/criu/cr-restore.c
|
|
|
d2b3e5 |
index 54216b8ea..8a436cc98 100644
|
|
|
d2b3e5 |
--- a/criu/cr-restore.c
|
|
|
d2b3e5 |
+++ b/criu/cr-restore.c
|
|
|
d2b3e5 |
@@ -3650,6 +3650,9 @@ static int sigreturn_restore(pid_t pid, struct task_restore_args *task_args, uns
|
|
|
d2b3e5 |
task_args->premmapped_len = rsti(current)->premmapped_len;
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
task_args->task_size = kdat.task_size;
|
|
|
d2b3e5 |
+#ifdef ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+ task_args->page_size = PAGE_SIZE;
|
|
|
d2b3e5 |
+#endif
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
RST_MEM_FIXUP_PPTR(task_args->vmas);
|
|
|
d2b3e5 |
RST_MEM_FIXUP_PPTR(task_args->rings);
|
|
|
d2b3e5 |
diff --git a/criu/include/restorer.h b/criu/include/restorer.h
|
|
|
d2b3e5 |
index 15307d9c0..70223be55 100644
|
|
|
d2b3e5 |
--- a/criu/include/restorer.h
|
|
|
d2b3e5 |
+++ b/criu/include/restorer.h
|
|
|
d2b3e5 |
@@ -209,6 +209,9 @@ struct task_restore_args {
|
|
|
d2b3e5 |
void **breakpoint;
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
enum faults fault_strategy;
|
|
|
d2b3e5 |
+#ifdef ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+ unsigned page_size;
|
|
|
d2b3e5 |
+#endif
|
|
|
d2b3e5 |
} __aligned(64);
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
/*
|
|
|
d2b3e5 |
diff --git a/criu/pie/restorer.c b/criu/pie/restorer.c
|
|
|
d2b3e5 |
index 69f8504e3..da20f3298 100644
|
|
|
d2b3e5 |
--- a/criu/pie/restorer.c
|
|
|
d2b3e5 |
+++ b/criu/pie/restorer.c
|
|
|
d2b3e5 |
@@ -36,6 +36,7 @@
|
|
|
d2b3e5 |
#include "uffd.h"
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
#include "common/lock.h"
|
|
|
d2b3e5 |
+#include "common/page.h"
|
|
|
d2b3e5 |
#include "restorer.h"
|
|
|
d2b3e5 |
#include "aio.h"
|
|
|
d2b3e5 |
#include "seccomp.h"
|
|
|
d2b3e5 |
@@ -76,6 +77,18 @@ bool fault_injected(enum faults f)
|
|
|
d2b3e5 |
return __fault_injected(f, fi_strategy);
|
|
|
d2b3e5 |
}
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
+#ifdef ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+/*
|
|
|
d2b3e5 |
+ * XXX: Make it compel's std plugin global variable. Drop parasite_size().
|
|
|
d2b3e5 |
+ * Hint: compel on aarch64 shall learn relocs for that.
|
|
|
d2b3e5 |
+ */
|
|
|
d2b3e5 |
+static unsigned __page_size;
|
|
|
d2b3e5 |
+unsigned page_size(void)
|
|
|
d2b3e5 |
+{
|
|
|
d2b3e5 |
+ return __page_size;
|
|
|
d2b3e5 |
+}
|
|
|
d2b3e5 |
+#endif
|
|
|
d2b3e5 |
+
|
|
|
d2b3e5 |
/*
|
|
|
d2b3e5 |
* These are stubs for std compel plugin.
|
|
|
d2b3e5 |
*/
|
|
|
d2b3e5 |
@@ -1230,6 +1243,9 @@ long __export_restore_task(struct task_restore_args *args)
|
|
|
d2b3e5 |
zombies = args->zombies;
|
|
|
d2b3e5 |
n_zombies = args->zombies_n;
|
|
|
d2b3e5 |
*args->breakpoint = rst_sigreturn;
|
|
|
d2b3e5 |
+#ifdef ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+ __page_size = args->page_size;
|
|
|
d2b3e5 |
+#endif
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
ksigfillset(&act.rt_sa_mask);
|
|
|
d2b3e5 |
act.rt_sa_handler = sigchld_handler;
|
|
|
d2b3e5 |
diff --git a/include/common/arch/aarch64/asm/page.h b/include/common/arch/aarch64/asm/page.h
|
|
|
d2b3e5 |
index de1fe5428..4126c8474 100644
|
|
|
d2b3e5 |
--- a/include/common/arch/aarch64/asm/page.h
|
|
|
d2b3e5 |
+++ b/include/common/arch/aarch64/asm/page.h
|
|
|
d2b3e5 |
@@ -1,6 +1,9 @@
|
|
|
d2b3e5 |
#ifndef __CR_ASM_PAGE_H__
|
|
|
d2b3e5 |
#define __CR_ASM_PAGE_H__
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
+#define ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+
|
|
|
d2b3e5 |
+#ifndef CR_NOGLIBC
|
|
|
d2b3e5 |
#include <unistd.h>
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
#ifndef PAGE_SHIFT
|
|
|
d2b3e5 |
@@ -18,4 +21,10 @@
|
|
|
d2b3e5 |
#define PAGE_PFN(addr) ((addr) / PAGE_SIZE)
|
|
|
d2b3e5 |
#define page_size() sysconf(_SC_PAGESIZE)
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
+#else /* CR_NOGLIBC */
|
|
|
d2b3e5 |
+
|
|
|
d2b3e5 |
+extern unsigned page_size(void);
|
|
|
d2b3e5 |
+#define PAGE_SIZE page_size()
|
|
|
d2b3e5 |
+
|
|
|
d2b3e5 |
+#endif /* CR_NOGLIBC */
|
|
|
d2b3e5 |
#endif /* __CR_ASM_PAGE_H__ */
|
|
|
d2b3e5 |
diff --git a/include/common/arch/ppc64/asm/page.h b/include/common/arch/ppc64/asm/page.h
|
|
|
d2b3e5 |
index 9d10455f1..a95af55ef 100644
|
|
|
d2b3e5 |
--- a/include/common/arch/ppc64/asm/page.h
|
|
|
d2b3e5 |
+++ b/include/common/arch/ppc64/asm/page.h
|
|
|
d2b3e5 |
@@ -1,6 +1,9 @@
|
|
|
d2b3e5 |
#ifndef __CR_ASM_PAGE_H__
|
|
|
d2b3e5 |
#define __CR_ASM_PAGE_H__
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
+#define ARCH_HAS_LONG_PAGES
|
|
|
d2b3e5 |
+
|
|
|
d2b3e5 |
+#ifndef CR_NOGLIBC
|
|
|
d2b3e5 |
#include <unistd.h>
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
/*
|
|
|
d2b3e5 |
@@ -22,4 +25,10 @@
|
|
|
d2b3e5 |
#define PAGE_PFN(addr) ((addr) / PAGE_SIZE)
|
|
|
d2b3e5 |
#define page_size() sysconf(_SC_PAGESIZE)
|
|
|
d2b3e5 |
|
|
|
d2b3e5 |
+#else /* CR_NOGLIBC */
|
|
|
d2b3e5 |
+
|
|
|
d2b3e5 |
+extern unsigned page_size(void);
|
|
|
d2b3e5 |
+#define PAGE_SIZE page_size()
|
|
|
d2b3e5 |
+
|
|
|
d2b3e5 |
+#endif /* CR_NOGLIBC */
|
|
|
d2b3e5 |
#endif /* __CR_ASM_PAGE_H__ */
|
|
|
d2b3e5 |
--
|
|
|
d2b3e5 |
2.17.0
|
|
|
d2b3e5 |
|