Received: by 2002:a4a:301c:0:0:0:0:0 with SMTP id q28-v6csp1153537oof; Tue, 25 Sep 2018 08:56:38 -0700 (PDT) X-Google-Smtp-Source: ACcGV60nAngLEeeozhUN9G3HP+fKY9Fbem7PsGeIih3qoWR0uaNmEi7NZA+xnMMpQwejfsl+oZHF X-Received: by 2002:a62:920d:: with SMTP id o13-v6mr1769962pfd.177.1537890998450; Tue, 25 Sep 2018 08:56:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537890998; cv=none; d=google.com; s=arc-20160816; b=rYkUfwJ6nAradyOL8iMfBufe1FIPP4h5+Bsj6l1+SDHi9lYFb/FldzXlXq4lq/f5LE IX6aHnY14dZixr4KR2uB2A4pf9kF1xeBRBm7lf7CPRMZhjeY0DYR2li2o0C9kHyXrUR8 aQHOuAjL3mRynddAIYymoYPfL1z7/UAbJS9xHWVXRPv5Rt2JK/N94I1/VdfjNyL9ZOGI kaPy70keVnXMLnwGoysvbYbjr5bQ2LmkFK6cIwFSLuKJaikoWDs67iHA1siKIrYvL0hw YNSv7QTwl0lTFOCgBNbJqdteCueX1z98ZXk8yQKOL1XSt+ScvmWOfV4Lu2ra3xmTNNfY Cbxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:references:cc:to:from:subject; bh=pIELDkGd4t85abV+2QNyvciRrjzYNQVWI0kNhEKHv1c=; b=Hi3YH702czcFOjbxS/UHKdoORx+itYniq3eVx/tcREgIfi1C7jhR7vrWeH9SmNArUa KD1ce6RTirOb7I3lwC7bDAm1fTwlZF0o7+uh4NrzcfhJ3nCLlTovmZFBN8jHZ302dpJc WJWHfl6STZPeElAgSaeGJYLQetENG3A2X21zi6bY7uIvvfoOx6wt7LBBUbujT+HkjfR+ dtNqGLVEqFgJqwpU3aq4SCtV89FjPXfhOoDeEqYx90yNsuFSrFi1hOa/vgWyHSsjEc7r jGT6rmMDmhmP7zwM+9pTAm3FeV9wos4P6qY/o+ms0o0g+pXV396BMNCxfjjctLIWLwy0 PYWw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 29-v6si2629225pgv.292.2018.09.25.08.56.23; Tue, 25 Sep 2018 08:56:38 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729271AbeIYWEW (ORCPT + 99 others); Tue, 25 Sep 2018 18:04:22 -0400 Received: from pegase1.c-s.fr ([93.17.236.30]:36142 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728598AbeIYWEW (ORCPT ); Tue, 25 Sep 2018 18:04:22 -0400 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 42KQfP36m4z9ttCN; Tue, 25 Sep 2018 17:56:13 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id VWKtvftEA17n; Tue, 25 Sep 2018 17:56:13 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 42KQfP2JxNz9ttCH; Tue, 25 Sep 2018 17:56:13 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 0F0288B7E2; Tue, 25 Sep 2018 17:56:12 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id X-QZQqJaEXGv; Tue, 25 Sep 2018 17:56:12 +0200 (CEST) Received: from PO15451 (unknown [192.168.232.3]) by messagerie.si.c-s.fr (Postfix) with ESMTP id E646E8B7C8; Tue, 25 Sep 2018 17:56:09 +0200 (CEST) Subject: Re: [PATCH v3 2/2] powerpc/64: add stack protector support From: Christophe LEROY To: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Andrew Donnellan Cc: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org References: <2b934594d21ade67a4092637cf9e6b7d2d131187.1537801613.git.christophe.leroy@c-s.fr> Message-ID: <0797fc91-6400-2508-1cc0-4bba78aafbbb@c-s.fr> Date: Tue, 25 Sep 2018 17:56:09 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Snowpatch reports failure on pmac32_defconfig, as follows: arch/powerpc/platforms/powermac/bootx_init.o: In function `bootx_printf': /var/lib/jenkins-slave/workspace/snowpatch/snowpatch-linux-sparse/linux/arch/powerpc/platforms/powermac/bootx_init.c:88: undefined reference to `__stack_chk_fail_local' arch/powerpc/platforms/powermac/bootx_init.o: In function `bootx_add_display_props': /var/lib/jenkins-slave/workspace/snowpatch/snowpatch-linux-sparse/linux/arch/powerpc/platforms/powermac/bootx_init.c:211: undefined reference to `__stack_chk_fail_local' arch/powerpc/platforms/powermac/bootx_init.o: In function `bootx_scan_dt_build_struct': /var/lib/jenkins-slave/workspace/snowpatch/snowpatch-linux-sparse/linux/arch/powerpc/platforms/powermac/bootx_init.c:350: undefined reference to `__stack_chk_fail_local' arch/powerpc/platforms/powermac/bootx_init.o: In function `bootx_init': /var/lib/jenkins-slave/workspace/snowpatch/snowpatch-linux-sparse/linux/arch/powerpc/platforms/powermac/bootx_init.c:598: undefined reference to `__stack_chk_fail_local' ld: .tmp_vmlinux1: hidden symbol `__stack_chk_fail_local' isn't defined ld: final link failed: Bad value Makefile:1040: recipe for target 'vmlinux' failed make: *** [vmlinux] Error 1 I don't have this issue with GCC 8.1, bootx_init.o has references to __stack_chk_fail, not to __stack_chk_fail_local Looking online, it may be due to an old build and a lack of 'make clean', could it be the case here ? Otherwise, can you retry the build to see if it's happen again ? Christophe Le 24/09/2018 à 17:15, Christophe Leroy a écrit : > On PPC64, as register r13 points to the paca_struct at all time, > this patch adds a copy of the canary there, which is copied at > task_switch. > That new canary is then used by using the following GCC options: > -mstack-protector-guard=tls > -mstack-protector-guard-reg=r13 > -mstack-protector-guard-offset=offsetof(struct paca_struct, canary)) > > Signed-off-by: Christophe Leroy > --- > arch/powerpc/Kconfig | 2 +- > arch/powerpc/Makefile | 8 ++++++++ > arch/powerpc/include/asm/paca.h | 3 +++ > arch/powerpc/include/asm/stackprotector.h | 3 +++ > arch/powerpc/kernel/asm-offsets.c | 3 +++ > arch/powerpc/kernel/entry_64.S | 4 ++++ > 6 files changed, 22 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index 3bcb05929931..602eea723624 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -180,7 +180,7 @@ config PPC > select HAVE_ARCH_SECCOMP_FILTER > select HAVE_ARCH_TRACEHOOK > select HAVE_CBPF_JIT if !PPC64 > - select HAVE_STACKPROTECTOR if $(cc-option,-mstack-protector-guard=tls) && PPC32 > + select HAVE_STACKPROTECTOR if $(cc-option,-mstack-protector-guard=tls) > select HAVE_CONTEXT_TRACKING if PPC64 > select HAVE_DEBUG_KMEMLEAK > select HAVE_DEBUG_STACKOVERFLOW > diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile > index 45b8eb4d8fe7..81552c7b46eb 100644 > --- a/arch/powerpc/Makefile > +++ b/arch/powerpc/Makefile > @@ -113,7 +113,11 @@ KBUILD_ARFLAGS += --target=elf$(BITS)-$(GNUTARGET) > endif > > cflags-$(CONFIG_STACKPROTECTOR) += -mstack-protector-guard=tls > +ifdef CONFIG_PPC64 > +cflags-$(CONFIG_STACKPROTECTOR) += -mstack-protector-guard-reg=r13 > +else > cflags-$(CONFIG_STACKPROTECTOR) += -mstack-protector-guard-reg=r2 > +endif > > LDFLAGS_vmlinux-y := -Bstatic > LDFLAGS_vmlinux-$(CONFIG_RELOCATABLE) := -pie > @@ -411,8 +415,12 @@ ifdef CONFIG_STACKPROTECTOR > prepare: stack_protector_prepare > > stack_protector_prepare: prepare0 > +ifdef CONFIG_PPC64 > + $(eval KBUILD_CFLAGS += -mstack-protector-guard-offset=$(shell awk '{if ($$2 == "PACA_CANARY") print $$3;}' include/generated/asm-offsets.h)) > +else > $(eval KBUILD_CFLAGS += -mstack-protector-guard-offset=$(shell awk '{if ($$2 == "TASK_CANARY") print $$3;}' include/generated/asm-offsets.h)) > endif > +endif > > # Use the file '.tmp_gas_check' for binutils tests, as gas won't output > # to stdout and these checks are run even on install targets. > diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h > index 6d6b3706232c..98d883e58945 100644 > --- a/arch/powerpc/include/asm/paca.h > +++ b/arch/powerpc/include/asm/paca.h > @@ -246,6 +246,9 @@ struct paca_struct { > struct slb_entry *mce_faulty_slbs; > u16 slb_save_cache_ptr; > #endif /* CONFIG_PPC_BOOK3S_64 */ > +#ifdef CONFIG_STACKPROTECTOR > + unsigned long canary; > +#endif > } ____cacheline_aligned; > > extern struct paca_struct **paca_ptrs; > diff --git a/arch/powerpc/include/asm/stackprotector.h b/arch/powerpc/include/asm/stackprotector.h > index 263e2aab1862..e81991955c0d 100644 > --- a/arch/powerpc/include/asm/stackprotector.h > +++ b/arch/powerpc/include/asm/stackprotector.h > @@ -29,6 +29,9 @@ static __always_inline void boot_init_stack_canary(void) > canary ^= LINUX_VERSION_CODE; > > current->stack_canary = canary; > +#ifdef CONFIG_PPC64 > + get_paca()->canary = canary; > +#endif > } > > #endif /* _ASM_STACKPROTECTOR_H */ > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c > index a992f7a53cf3..773dee55b3f6 100644 > --- a/arch/powerpc/kernel/asm-offsets.c > +++ b/arch/powerpc/kernel/asm-offsets.c > @@ -81,6 +81,9 @@ int main(void) > OFFSET(MM, task_struct, mm); > #ifdef CONFIG_STACKPROTECTOR > OFFSET(TASK_CANARY, task_struct, stack_canary); > +#ifdef CONFIG_PPC64 > + OFFSET(PACA_CANARY, paca_struct, canary); > +#endif > #endif > OFFSET(MMCONTEXTID, mm_struct, context.id); > #ifdef CONFIG_PPC64 > diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S > index 77a888bfcb53..573fa879d785 100644 > --- a/arch/powerpc/kernel/entry_64.S > +++ b/arch/powerpc/kernel/entry_64.S > @@ -624,6 +624,10 @@ _GLOBAL(_switch) > > addi r6,r4,-THREAD /* Convert THREAD to 'current' */ > std r6,PACACURRENT(r13) /* Set new 'current' */ > +#if defined(CONFIG_STACKPROTECTOR) > + ld r6, TASK_CANARY(r6) > + std r6, PACA_CANARY(r13) > +#endif > > ld r8,KSP(r4) /* new stack pointer */ > #ifdef CONFIG_PPC_BOOK3S_64 >