diff --git a/Makefile.config b/Makefile.config index ec6c2d145..0e557805c 100644 --- a/Makefile.config +++ b/Makefile.config @@ -21,12 +21,14 @@ $(CONFIG_FILE): ifeq ($(SRCARCH),x86) # CONFIG_COMPAT is only for x86 now, no need for compile-test other archs -ifeq ($(call try-cc,$(FEATURE_TEST_X86_COMPAT),-m32),true) +ifeq ($(call try-asm,$(FEATURE_TEST_X86_COMPAT)),true) export CONFIG_COMPAT := y FEATURE_DEFINES += -DCONFIG_COMPAT else - $(info Note: Building without ia32 C/R, missed package(s):) - $(info $(info) libc6-dev-i386 and/or gcc-multilib) + $(info Note: Building without ia32 C/R, missed ia32 support in gcc) + $(info $(info) That may be related to missing gcc-multilib in your) + $(info $(info) distribution or you may have Debian with buggy toolchain) + $(info $(info) (issue https://github.com/xemul/criu/issues/315)) endif endif diff --git a/scripts/feature-tests.mak b/scripts/feature-tests.mak index ad50eb4ad..12bf54181 100644 --- a/scripts/feature-tests.mak +++ b/scripts/feature-tests.mak @@ -90,13 +90,36 @@ int main(int argc, char *argv[], char *envp[]) endef define FEATURE_TEST_X86_COMPAT +#define __ALIGN .align 4, 0x90 +#define ENTRY(name) \ + .globl name; \ + .type name, @function; \ + __ALIGN; \ + name: -/* Test for glibc-devel.i686 presence */ -#include +#define END(sym) \ + .size sym, . - sym -int main(int argc, char **argv) -{ - return 0; -} +#define __USER32_CS 0x23 +#define __USER_CS 0x33 + .text + +ENTRY(call32_from_64) + /* Switch into compatibility mode */ + pushq \$$__USER32_CS + pushq \$$1f + lretq +1: + .code32 + /* Run function and switch back */ + call *%esi + jmp \$$__USER_CS,\$$1f + .code64 +1: +END(call32_from_64) + +ENTRY(main) + nop +END(main) endef