[CRIU] [PATCH 9/9] criu: wrap compatible code with CONFIG_COMPAT
Dmitry Safonov
dsafonov at virtuozzo.com
Thu Aug 4 07:49:50 PDT 2016
As we will not support *native* 32-bit i386 build, I dropped some
ifdefs, introducing instead of ifdef(CONFIG_X86_64) --
ifdef(CONFIG_COMPAT).
CRIU should build now without ia32 Glibc and gcc-multilib support.
Maybe I should add some warning that the build is made without
compatible task support (or criu check should print that),
will do as compat patches hit master.
Fixes: #181
Cc: Cyrill Gorcunov <gorcunov at openvz.org>
Cc: Andrew Vagin <avagin at virtuozzo.com>
Signed-off-by: Dmitry Safonov <dsafonov at virtuozzo.com>
---
criu/arch/x86/Makefile | 6 ++++--
criu/arch/x86/Makefile.syscalls | 8 +++-----
criu/arch/x86/include/asm/restorer.h | 7 +++++--
criu/arch/x86/restorer.c | 4 ++--
criu/arch/x86/sys-exec-tbl.c | 8 ++++----
criu/parasite-syscall.c | 4 ++--
criu/pie/Makefile | 9 ++++++---
criu/pie/Makefile.library | 7 ++++---
criu/pie/parasite-blob.h | 2 +-
9 files changed, 31 insertions(+), 24 deletions(-)
diff --git a/criu/arch/x86/Makefile b/criu/arch/x86/Makefile
index e214a15be4b1..fb8608211ab5 100644
--- a/criu/arch/x86/Makefile
+++ b/criu/arch/x86/Makefile
@@ -8,5 +8,7 @@ asflags-y += -iquote $(obj)/include
obj-y += cpu.o
obj-y += crtools.o
-obj-y += sigaction_compat.o
-obj-y += call32.o
+ifeq ($(CONFIG_COMPAT),y)
+ obj-y += sigaction_compat.o
+ obj-y += call32.o
+endif
diff --git a/criu/arch/x86/Makefile.syscalls b/criu/arch/x86/Makefile.syscalls
index 0506c1f2b117..839f24c1b385 100644
--- a/criu/arch/x86/Makefile.syscalls
+++ b/criu/arch/x86/Makefile.syscalls
@@ -17,11 +17,9 @@ target :=
target_32 := syscalls-32
target_64 := syscalls-64
-SYS-BITS := 32
-
-# native x86_64
-ifeq ($(ARCH),x86)
- SYS-BITS += 64
+SYS-BITS := 64
+ifeq ($(CONFIG_COMPAT),y)
+ SYS-BITS += 32
endif
# targets
diff --git a/criu/arch/x86/include/asm/restorer.h b/criu/arch/x86/include/asm/restorer.h
index a124dd2a6293..6bc5c2b27d54 100644
--- a/criu/arch/x86/include/asm/restorer.h
+++ b/criu/arch/x86/include/asm/restorer.h
@@ -84,7 +84,6 @@ typedef struct {
compat_sigset_word sig[_COMPAT_NSIG_WORDS];
} compat_sigset_t;
-#ifdef CONFIG_X86_64
typedef struct compat_siginfo {
int si_signo;
int si_errno;
@@ -92,6 +91,7 @@ typedef struct compat_siginfo {
int _pad[128/sizeof(int) - 3];
} compat_siginfo_t;
+#ifdef CONFIG_COMPAT
static inline void __always_unused __check_compat_sigset_t(void)
{
BUILD_BUG_ON(sizeof(compat_sigset_t) != sizeof(k_rtsigset_t));
@@ -104,13 +104,16 @@ extern unsigned long call32_from_64(void *stack, void *func);
extern int arch_compat_rt_sigaction(void *stack32, int sig,
rt_sigaction_t_compat *act);
#else
-#define rt_sigframe_ia32 rt_sigframe
static inline void *alloc_compat_syscall_stack(void) { return NULL; }
static inline void free_compat_syscall_stack(void *stack32) { }
static inline int
arch_compat_rt_sigaction(void *stack, int sig, void *act) { return -1; }
#endif
+#ifdef CONFIG_X86_32
+# define rt_sigframe_ia32 rt_sigframe
+#endif
+
typedef struct compat_sigaltstack {
compat_uptr_t ss_sp;
int ss_flags;
diff --git a/criu/arch/x86/restorer.c b/criu/arch/x86/restorer.c
index f16bdcaa5b68..3de0146e816b 100644
--- a/criu/arch/x86/restorer.c
+++ b/criu/arch/x86/restorer.c
@@ -12,7 +12,6 @@
int restore_nonsigframe_gpregs(UserX86RegsEntry *r)
{
-#ifdef CONFIG_X86_64
long ret;
unsigned long fsgs_base;
@@ -29,10 +28,10 @@ int restore_nonsigframe_gpregs(UserX86RegsEntry *r)
pr_info("SET_GS fail %ld\n", ret);
return -1;
}
-#endif
return 0;
}
+#ifdef CONFIG_COMPAT
asm ( " .pushsection .text \n"
" .global restore_set_thread_area \n"
" .code32 \n"
@@ -89,3 +88,4 @@ void restore_tls(tls_t *ptls)
if (stack32)
free_compat_syscall_stack(stack32);
}
+#endif
diff --git a/criu/arch/x86/sys-exec-tbl.c b/criu/arch/x86/sys-exec-tbl.c
index ca45ef0d3126..f52578736f29 100644
--- a/criu/arch/x86/sys-exec-tbl.c
+++ b/criu/arch/x86/sys-exec-tbl.c
@@ -1,15 +1,15 @@
-#ifdef CONFIG_X86_64
static struct syscall_exec_desc sc_exec_table_64[] = {
#include "sys-exec-tbl-64.c"
{ }, /* terminator */
};
-#endif
+#ifdef CONFIG_COMPAT
static struct syscall_exec_desc sc_exec_table_32[] = {
#include "sys-exec-tbl-32.c"
{ }, /* terminator */
};
+#endif
struct syscall_exec_desc;
@@ -26,7 +26,7 @@ find_syscall_table(char *name, struct syscall_exec_desc *tbl)
#define ARCH_HAS_FIND_SYSCALL
/* overwrite default to search in two tables above */
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_COMPAT
struct syscall_exec_desc * find_syscall(char *name, struct parasite_ctl *ctl)
{
if (seized_native(ctl))
@@ -38,6 +38,6 @@ struct syscall_exec_desc * find_syscall(char *name, struct parasite_ctl *ctl)
struct syscall_exec_desc *
find_syscall(char *name, __always_unused struct parasite_ctl *ctl)
{
- return find_syscall_table(name, sc_exec_table_32);
+ return find_syscall_table(name, sc_exec_table_64);
}
#endif
diff --git a/criu/parasite-syscall.c b/criu/parasite-syscall.c
index 824037c0b4df..170d4752b8b6 100644
--- a/criu/parasite-syscall.c
+++ b/criu/parasite-syscall.c
@@ -1490,7 +1490,7 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
if (seized_native(ctl))
parasite_size = pie_size(parasite_native);
-#ifdef CONFIG_X86_64 /* compat blob isn't defined for other archs */
+#ifdef CONFIG_COMPAT
else
parasite_size = pie_size(parasite_compat);
#endif
@@ -1514,7 +1514,7 @@ struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
if (seized_native(ctl))
init_parasite_ctl(ctl, native);
-#ifdef CONFIG_X86_64 /* compat blob isn't defined for other archs */
+#ifdef CONFIG_COMPAT
else
init_parasite_ctl(ctl, compat);
#endif
diff --git a/criu/pie/Makefile b/criu/pie/Makefile
index 57c71fb2ab68..12ce3e5462c8 100644
--- a/criu/pie/Makefile
+++ b/criu/pie/Makefile
@@ -2,7 +2,7 @@
# restorer is always native (64-bit)
parasite_target := native
-ifeq ($(ARCH),x86)
+ifeq ($(CONFIG_COMPAT),y)
parasite_target += compat
endif
@@ -14,8 +14,11 @@ restorer-obj-y += ./$(ARCH_DIR)/restorer.o
ifeq ($(ARCH),x86)
restorer-obj-e += ./$(ARCH_DIR)/syscalls-64.built-in.o
- restorer-obj-y += ./$(ARCH_DIR)/call32.o
- restorer-obj-y += ./$(ARCH_DIR)/sigaction_compat_pie.o
+
+ ifeq ($(CONFIG_COMPAT),y)
+ restorer-obj-y += ./$(ARCH_DIR)/call32.o
+ restorer-obj-y += ./$(ARCH_DIR)/sigaction_compat_pie.o
+ endif
native-obj-y += ./$(ARCH_DIR)/parasite-head-64.o
native-obj-e += ./$(ARCH_DIR)/syscalls-64.built-in.o
diff --git a/criu/pie/Makefile.library b/criu/pie/Makefile.library
index b5825e069a62..331eecd82778 100644
--- a/criu/pie/Makefile.library
+++ b/criu/pie/Makefile.library
@@ -6,11 +6,12 @@ CFLAGS += -Wa,--noexecstack -fno-stack-protector -DCR_NOGLIBC
CFLAGS_native += -fpie
ifeq ($(ARCH),x86)
- target += compat
+ ifeq ($(CONFIG_COMPAT),y)
+ target += compat
+ native-lib-y += util-vdso-elf32.o
+ endif
CFLAGS_native += -DCONFIG_X86_64
CFLAGS_compat += -fno-pic -m32 -DCONFIG_X86_32
-
- native-lib-y += util-vdso-elf32.o
CFLAGS_util-vdso-elf32.o += -DCONFIG_X86_32
endif
diff --git a/criu/pie/parasite-blob.h b/criu/pie/parasite-blob.h
index 796d36ed23e6..ddafd05f50ed 100644
--- a/criu/pie/parasite-blob.h
+++ b/criu/pie/parasite-blob.h
@@ -1,5 +1,5 @@
#include "parasite-native-blob.h"
-#ifdef CONFIG_X86_64
+#ifdef CONFIG_COMPAT
# include "parasite-compat-blob.h"
#endif
--
2.9.0
More information about the CRIU
mailing list