From patchwork Wed Nov 15 22:05:16 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Salyzyn X-Patchwork-Id: 10060447 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 471876023A for ; Wed, 15 Nov 2017 22:09:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3D1DD29ED7 for ; Wed, 15 Nov 2017 22:09:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2F4912A327; Wed, 15 Nov 2017 22:09:11 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A1E2529ED7 for ; Wed, 15 Nov 2017 22:09:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=sJNO2AGe/XPDO3Vcyo61pHaL/4MTv8KRfXFzBv1580o=; b=MHrzfCaCbyXfK2M3V8wwoyO+3g GBkf3kJMOesdhO3uOybWiYJqy9C//bPO80ZJXeS9MHwW34XuW3Imz0l9oXT10c2xLGYkCrlOKF+Cn 4hi5mqr/a9nJ9P8hPEw2a8vGCuKjO/uqCGTIsD652Zwy2EapmP8kX5tQKBVvU/21WHXRYUspz3Ieq 5XSF7D75N45LYmKKKJofNG6BDwHXPIEFyxphmvkK3kBsvUyoee1HEGtxQ2CcaJIgxPtE0VJdE5nQS iEkI3tNT4qjttvUtuMcoz98eZtBl8SuCIckxQmFeuNDZkr8fPS2C3Wc0i2xL9nDvpbe9NgZztc2Aj jU0K2gHg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1eF5rq-0000Cx-4J; Wed, 15 Nov 2017 22:09:10 +0000 Received: from mail-io0-x241.google.com ([2607:f8b0:4001:c06::241]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1eF5qS-0007Sv-S8 for linux-arm-kernel@lists.infradead.org; Wed, 15 Nov 2017 22:08:53 +0000 Received: by mail-io0-x241.google.com with SMTP id t11so3161878iof.13 for ; Wed, 15 Nov 2017 14:07:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=android.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9h+THAFwGS7L4BBKWQCpHDF+XJuvz4hnFtKuEtamwV8=; b=ZNwAH1RYoMTiZa7HTFMOMJGiBF95X8wW4fZZOoOJDINsNYu883w1criNo0jZz2vRjl KZHUtY9R57X0CdVHqOYoLuFD9kOGX0lvSP7K6XdCWqfeEMkBNr7dajRO+Xfq8DI66FaG SzEX3IRCXJ8+PplVXFfmVOBT4LRlAQ9cSRMLLEcrHEbfzr79hD2H6ahNvAKpOmiAQ8qI zsVkL+c454U/f1InQuDTrNR3fVG46fJxYziN8/IWZqXbidsw2liI5atMDwXpAP5ZKbDY Kj+LmbODnAU5SkOO4qc+tFrB2AZiMa8uEljKjnhIzTZEInw6XG76OvlbD70Uh/zJkmi8 Dc2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9h+THAFwGS7L4BBKWQCpHDF+XJuvz4hnFtKuEtamwV8=; b=h87gH39RRNeyYyKB3pU9Rho4akjj/kdk8Qp+WOVlYNVFx2m9f3c5gAMtFAFt0ZCC3j rQVdelvuN+kabrS4Ik73wGdmG5WhRtOzCdUcL+9hlgBlmADr80q1QKc9SlouMEZJ5MC+ K+ELR5FzMs/TLI7B/DxZjPnXuq/Pn3RJu+ZnX05xn/3ZkjygTax1mQhD0GbFncPQonMe rbNjf2Bp8MGi416Xqjhr0UD4NfBGNIiwQH8ZWQPZjd0v4vxrosCKgVbgo5QQvm2h+oG6 mwXQ/IfKc8S8YqoIbYn6EBspsSGzSIwKp87Ov2/rnz9e0K8m5yzwv1MQ2/DnNGTUEJz7 ysLQ== X-Gm-Message-State: AJaThX7Q4XPtDfBRhXBxqC5ADgvpfESqxIIVI1iJE06R8u3hBc8bIYS0 ze2HChWst+DSj4iZp0yL3n6dag== X-Google-Smtp-Source: AGs4zMbalP3p0VRjjAX6ckn/lJOOuHQEJktMin4ft9Z/hdHt1DyJUl8dJwj4Py1c5asvsDAPI3D/HA== X-Received: by 10.107.7.169 with SMTP id g41mr14159718ioi.38.1510783644040; Wed, 15 Nov 2017 14:07:24 -0800 (PST) Received: from nebulus.mtv.corp.google.com ([2620:0:1000:1612:b4fb:6752:f21f:3502]) by smtp.gmail.com with ESMTPSA id 14sm5224751itj.34.2017.11.15.14.07.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 15 Nov 2017 14:07:23 -0800 (PST) From: Mark Salyzyn To: linux-kernel@vger.kernel.org Subject: [PATCH 6/6] arm64: Wire up and expose the new compat vDSO Date: Wed, 15 Nov 2017 14:05:16 -0800 Message-Id: <20171115220529.14458-7-salyzyn@android.com> X-Mailer: git-send-email 2.15.0.448.gf294e3d99a-goog In-Reply-To: <20171115220529.14458-1-salyzyn@android.com> References: <20171115220529.14458-1-salyzyn@android.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171115_140745_574432_B3D7D181 X-CRM114-Status: GOOD ( 18.61 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ard Biesheuvel , Catalin Marinas , Kevin Brodsky , Will Deacon , Mark Salyzyn , AKASHI Takahiro , "Eric W. Biederman" , Greg Kroah-Hartman , Dave Martin , linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Kevin Brodsky Expose the new compat vDSO via the COMPAT_VDSO config option. The option is not enabled in defconfig because we really need a 32-bit compiler this time, and we rely on the user to provide it themselves by setting CROSS_COMPILE_ARM32. Therefore enabling the option by default would make little sense, since the user must explicitly set a non-standard environment variable anyway. CONFIG_COMPAT_VDSO is not directly used in the code, because we want to ignore it (build as if it were not set) if the user didn't set CROSS_COMPILE_ARM32. If the variable has been set to a valid prefix, CONFIG_VDSO32 will be set; this is the option that the code and Makefiles test. For more flexibility, like CROSS_COMPILE, CROSS_COMPILE_ARM32 can also be set via CONFIG_CROSS_COMPILE_ARM32 (the environment variable overrides the config option, as expected). Signed-off-by: Kevin Brodsky Signed-off-by: Mark Salyzyn Cc: Catalin Marinas Cc: Will Deacon Cc: Dave Martin Cc: "Eric W. Biederman" Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org --- arch/arm64/Kconfig | 24 ++++++++++++++++++++++++ arch/arm64/Makefile | 35 +++++++++++++++++++++++++++++++++-- arch/arm64/kernel/Makefile | 3 +++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index d8a4fda50477..379d0154b363 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -1183,6 +1183,30 @@ config SYSVIPC_COMPAT def_bool y depends on COMPAT && SYSVIPC +config COMPAT_VDSO + bool "32-bit vDSO" + depends on COMPAT + default n + help + Warning: a 32-bit toolchain is necessary to build the vDSO. You + must explicitly define which toolchain should be used by setting + CROSS_COMPILE_ARM32 to the prefix of the 32-bit toolchain (same format + as CROSS_COMPILE). If CROSS_COMPILE_ARM32 is empty, a warning will be + printed and the kernel will be built as if COMPAT_VDSO had not been + set. If CROSS_COMPILE_ARM32 is set to an invalid prefix, compilation + will be aborted. + + Provide a vDSO to 32-bit processes. It includes the symbols provided + by the vDSO from the 32-bit kernel, so that a 32-bit libc can use + the compat vDSO without modification. It also provides sigreturn + trampolines, replacing the sigreturn page. + +config CROSS_COMPILE_ARM32 + string "32-bit toolchain prefix" + help + Same as setting CROSS_COMPILE_ARM32 in the environment, but saved for + future builds. The environment variable overrides this config option. + endmenu menu "Power management options" diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 939b310913cf..baf36f0a992d 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -45,10 +45,39 @@ $(warning Detected assembler with broken .inst; disassembly will be unreliable) endif endif -KBUILD_CFLAGS += -mgeneral-regs-only $(lseinstr) $(brokengasinst) +ifeq ($(CONFIG_COMPAT_VDSO), y) + CROSS_COMPILE_ARM32 ?= $(CONFIG_CROSS_COMPILE_ARM32:"%"=%) + + # Check that the user has provided a valid prefix for the 32-bit toolchain. + # To prevent selecting the system $(cc-name) by default, the prefix is not + # allowed to be empty, unlike CROSS_COMPILE. In the unlikely event that the + # system $(cc-name) is actually the 32-bit ARM compiler to be used, the + # variable can be set to the dirname (e.g. CROSS_COMPILE_ARM32=/usr/bin/). + # Note: this Makefile is read both before and after regenerating the config + # (if needed). Any warning appearing before the config has been regenerated + # should be ignored. If the error is triggered and you set + # CONFIG_CROSS_COMPILE_ARM32, set CROSS_COMPILE_ARM32 to an appropriate value + # when invoking make and fix CONFIG_CROSS_COMPILE_ARM32. + ifeq ($(CROSS_COMPILE_ARM32),) + $(error CROSS_COMPILE_ARM32 not defined or empty, the compat vDSO will not be built) + else ifeq ($(cc-name),clang) + export CLANG_TRIPLE_ARM32 ?= $(CROSS_COMPILE_ARM32) + export CLANG_TARGET_ARM32 := --target=$(notdir $(CLANG_TRIPLE_ARM32:%-=%)) + export CONFIG_VDSO32 := y + vdso32 := -DCONFIG_VDSO32=1 + else ifeq ($(shell which $(CROSS_COMPILE_ARM32)$(cc-name) 2> /dev/null),) + $(error $(CROSS_COMPILE_ARM32)$(cc-name) not found, check CROSS_COMPILE_ARM32) + else + export CROSS_COMPILE_ARM32 + export CONFIG_VDSO32 := y + vdso32 := -DCONFIG_VDSO32=1 + endif +endif + +KBUILD_CFLAGS += -mgeneral-regs-only $(lseinstr) $(brokengasinst) $(vdso32) KBUILD_CFLAGS += -fno-asynchronous-unwind-tables KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads) -KBUILD_AFLAGS += $(lseinstr) $(brokengasinst) +KBUILD_AFLAGS += $(lseinstr) $(brokengasinst) $(vdso32) KBUILD_CFLAGS += $(call cc-option,-mabi=lp64) KBUILD_AFLAGS += $(call cc-option,-mabi=lp64) @@ -157,6 +186,8 @@ archclean: prepare: vdso_prepare vdso_prepare: prepare0 $(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso include/generated/vdso-offsets.h + $(if $(CONFIG_VDSO32),$(Q)$(MAKE) $(build)=arch/arm64/kernel/vdso32 \ + include/generated/vdso32-offsets.h) define archhelp echo '* Image.gz - Compressed kernel image (arch/$(ARCH)/boot/Image.gz)' diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 6e969f3cde6c..5db2b239cd68 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -30,7 +30,9 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_COMPAT) += sys32.o signal32.o \ sys_compat.o entry32.o +ifneq ($(CONFIG_VDSO32),y) arm64-obj-$(CONFIG_COMPAT) += sigreturn32.o +endif arm64-obj-$(CONFIG_KUSER_HELPERS) += kuser32.o arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o @@ -58,6 +60,7 @@ arm64-reloc-test-y := reloc_test_core.o reloc_test_syms.o arm64-obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-y += $(arm64-obj-y) vdso/ probes/ +obj-$(CONFIG_VDSO32) += vdso32/ obj-m += $(arm64-obj-m) head-y := head.o extra-y += $(head-y) vmlinux.lds