From patchwork Thu Oct 27 16:27:09 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 79752 Delivered-To: patch@linaro.org Received: by 10.80.142.83 with SMTP id 19csp740318edx; Thu, 27 Oct 2016 09:27:42 -0700 (PDT) X-Received: by 10.98.149.149 with SMTP id c21mr16229018pfk.100.1477585662639; Thu, 27 Oct 2016 09:27:42 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 80si8697856pfr.161.2016.10.27.09.27.42; Thu, 27 Oct 2016 09:27:42 -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; dkim=pass header.i=@linaro.org; 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; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964831AbcJ0Q11 (ORCPT + 27 others); Thu, 27 Oct 2016 12:27:27 -0400 Received: from mail-wm0-f48.google.com ([74.125.82.48]:37907 "EHLO mail-wm0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934533AbcJ0Q1V (ORCPT ); Thu, 27 Oct 2016 12:27:21 -0400 Received: by mail-wm0-f48.google.com with SMTP id n67so56647829wme.1 for ; Thu, 27 Oct 2016 09:27:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9TSl8mqsF1esBQ8B8UdWHe2J7bMzjyaSCx7N2U3KMJI=; b=MYejy9OQppRX0+FowokI4bxGUOEim74rCnc1gVdELUsO3hvT0g9OK1yx9j2SZ26ueD VuksoBotafw64XwEdBuvogVW6WGyj8slTXTAKOV03wWfuqpxo9EWNm+eovkBiCAPTX0B AcKgpUtDNGx3DWCX9jajUiADnd+gjU5newGAk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=9TSl8mqsF1esBQ8B8UdWHe2J7bMzjyaSCx7N2U3KMJI=; b=L+PP7ysyzuaOFj5xB84XHXW4vu22MdMHmQXRcoQhNujolXj4hPRN5GBjPCGalPkXIj 4CYccnOr+g3RwD9e5jkWnAhrU9vz2QQXZR0M1l7e59CzRl7uBXNLkSJ8uokVeL0jZ5BK 2yc3ls1yOx8yLYs/Ms0FtAjuxcEKXjmKlif+nBcIdTd5+EeDPYghWOrk15jaOj37k5R7 MfQbOerDJ9jieOkPf0yjF1MrruIHiVjE//EdqCwR+eFr0wsi46JGPUdJ15JfaDv7vpND whfKXwDqPqpEjonjrUBXDlFYwa3fZLNYot5EH7/Zn4b+6QbPkRbdUi4P1jLsFLdvlbm4 XfMw== X-Gm-Message-State: ABUngveJoBj0ovqnSIOscjB9yAMUxF35F3Ebb3iUzxZ/iIuWBaSbpXEdP4Jy4EZYWmsdYFAK X-Received: by 10.195.11.134 with SMTP id ei6mr7544898wjd.176.1477585640472; Thu, 27 Oct 2016 09:27:20 -0700 (PDT) Received: from localhost.localdomain ([105.150.227.229]) by smtp.gmail.com with ESMTPSA id a5sm9355809wjv.6.2016.10.27.09.27.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 27 Oct 2016 09:27:19 -0700 (PDT) From: Ard Biesheuvel To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, mpe@ellerman.id.au, jeyu@redhat.com Cc: will.deacon@arm.com, rusty@rustcorp.com.au, akpm@linux-foundation.org, benh@kernel.crashing.org, paulus@samba.org, Ard Biesheuvel Subject: [PATCH v3 1/3] powerpc/reloc32: fix corrupted modversion CRCs Date: Thu, 27 Oct 2016 17:27:09 +0100 Message-Id: <1477585631-18574-2-git-send-email-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1477585631-18574-1-git-send-email-ard.biesheuvel@linaro.org> References: <1477585631-18574-1-git-send-email-ard.biesheuvel@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit 0e0ed6406e61 ("powerpc/modules: Module CRC relocation fix causes perf issues") fixed an issue with relocatable PIE kernels in a way that essentially reintroduced the issue again for 32-bit builds. Since the chosen approach does is not applicable to 32-bit, fix the issue by updating the runtime relocation routine to ignore the load offset for the interval [__start___kcrctab, __stop___kcrctab_gpl_future), which is where the CRCs reside. This ensures that the values of the CRC pseudo-symbols are no longer made dependent on the runtime load offset. Signed-off-by: Ard Biesheuvel --- arch/powerpc/kernel/reloc_32.S | 36 +++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) -- 2.7.4 diff --git a/arch/powerpc/kernel/reloc_32.S b/arch/powerpc/kernel/reloc_32.S index f366fedb0872..150686b9febb 100644 --- a/arch/powerpc/kernel/reloc_32.S +++ b/arch/powerpc/kernel/reloc_32.S @@ -87,12 +87,12 @@ eodyn: /* End of Dyn Table scan */ * Work out the current offset from the link time address of .rela * section. * cur_offset[r7] = rela.run[r9] - rela.link [r7] - * _stext.link[r12] = _stext.run[r10] - cur_offset[r7] - * final_offset[r3] = _stext.final[r3] - _stext.link[r12] + * _stext.link[r11] = _stext.run[r10] - cur_offset[r7] + * final_offset[r3] = _stext.final[r3] - _stext.link[r11] */ subf r7, r7, r9 /* cur_offset */ - subf r12, r7, r10 - subf r3, r12, r3 /* final_offset */ + subf r11, r7, r10 + subf r3, r11, r3 /* final_offset */ subf r8, r6, r8 /* relaz -= relaent */ /* @@ -101,6 +101,21 @@ eodyn: /* End of Dyn Table scan */ * r13 - points to the symbol table */ +#ifdef CONFIG_MODVERSIONS + /* + * Treat R_PPC_RELATIVE relocations differently when they target the + * interval [__start___kcrctab, __stop___kcrctab_gpl_future): in this + * case, the relocated quantities are CRC pseudo-symbols, which should + * be preserved as-is, rather than be modified to take the runtime + * offset into account. + */ + lwz r10, (p_kcrc_start - 0b)(r12) + lwz r11, (p_kcrc_stop - 0b)(r12) + subf r12, r7, r12 /* link time addr of 0b */ + add r10, r10, r12 + add r11, r11, r12 +#endif + /* * Check if we have a relocation based on symbol * r5 will hold the value of the symbol. @@ -135,7 +150,15 @@ get_type: bne hi16 lwz r4, 0(r9) /* r_offset */ lwz r0, 8(r9) /* r_addend */ +#ifdef CONFIG_MODVERSIONS + cmplw r4, r10 + blt do_add + cmplw r4, r11 + blt skip_add +do_add: +#endif add r0, r0, r3 /* final addend */ +skip_add: stwx r0, r4, r7 /* memory[r4+r7]) = (u32)r0 */ b nxtrela /* continue */ @@ -207,3 +230,8 @@ p_dyn: .long __dynamic_start - 0b p_rela: .long __rela_dyn_start - 0b p_sym: .long __dynamic_symtab - 0b p_st: .long _stext - 0b + +#ifdef CONFIG_MODVERSIONS +p_kcrc_start: .long __start___kcrctab - 0b +p_kcrc_stop: .long __stop___kcrctab_gpl_future - 0b +#endif