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