Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp2543823pxu; Mon, 7 Dec 2020 09:09:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJztoeakzOunHqiZH1WWI9M1TRaLba81wRnJSUZOITI9Xr29XteCn9UTiG+FZWf3aUCeO6gc X-Received: by 2002:aa7:c886:: with SMTP id p6mr21032055eds.207.1607360961828; Mon, 07 Dec 2020 09:09:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607360961; cv=none; d=google.com; s=arc-20160816; b=d21ouaaT2BkPVkBlxKM8IUf7yzs6z1LHMfzKyWafeLhLYxlsXt4QRH5ruunrq+hZ78 Bd1ntIshjeIh2GhfNWEzLKtA5km0YtyOpAn7ybYvEz+VZj7VWLzIyUhyaLLYMIFmMgnU U45iGBqZjY3RWB8JgYKgxCoNo5W/GcL2IWzqocYfCFGf1wCWCUCp6MYOPXEzDIdreq5h 3zE5XQrvhP4JHksoZBwlk+yn6GKURxZxbcRLwqt3oZa31oy6bMvsDhPoZv0s7ryDi8Ov ZboMY/0CzZAjvf8LHU75G5wWHJ35wt52GIzDUqcXY9C0sDNmkYFBd0vR+SF7d9XWP5Jl AjXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from; bh=VmB01oStAjK3CT+acOX1DNROrlL+R1ZF5xZoUi6PDWQ=; b=wgf1JtA/13LN6b5FflyifK/bX+w1HaUQqHCWlbxB2gWcDU2gZX93kXmsCoTZuwMI5E DuXF1t92xEvMVC5MzrW7f8GIn7poWqEUL/nGDNXyyHyQfVMmizet1i0vMg5RaOWdd502 Rs/cTdwVVnpxeicH4rUFsFR16fAYigNe0JqdBevaDjCm8InMIsY6oQqSXQhrRXli2i4l Xbsr2NtNngYs+dYhvsAUPffzA9meDy8+3Q69xJN7tQq2ZrnTel0ZzSHjbuIKqPF0XvQp PJUtat8YaOwXetAiKTbbugtCEeSiMrF7G0T9wihZr3WVS8qcsA9eBi7rnXXCCWvec7lC agAg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m8si8285174edp.82.2020.12.07.09.08.56; Mon, 07 Dec 2020 09:09:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726402AbgLGRG0 (ORCPT + 99 others); Mon, 7 Dec 2020 12:06:26 -0500 Received: from foss.arm.com ([217.140.110.172]:55888 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725774AbgLGRG0 (ORCPT ); Mon, 7 Dec 2020 12:06:26 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 20881101E; Mon, 7 Dec 2020 09:05:40 -0800 (PST) Received: from lakrids.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 557EC3F66B; Mon, 7 Dec 2020 09:05:39 -0800 (PST) From: Mark Rutland To: linux-kernel@vger.kernel.org Cc: Mark Rutland , Arnd Bergmann , Greg Kroah-Hartman , Kees Cook Subject: [PATCH] lkdtm: don't move ctors to .rodata Date: Mon, 7 Dec 2020 17:05:33 +0000 Message-Id: <20201207170533.10738-1-mark.rutland@arm.com> X-Mailer: git-send-email 2.11.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When building with KASAN and LKDTM, clang may implictly generate an asan.module_ctor function in the LKDTM rodata object. The Makefile moves the lkdtm_rodata_do_nothing() function into .rodata by renaming the file's .text section to .rodata, and consequently also moves the ctor function into .rodata, leading to a boot time crash (splat below) when the ctor is invoked by do_ctors(). Let's prevent this by marking the function as noinstr rather than notrace, and renaming the file's .noinstr.text to .rodata. Marking the function as noinstr will prevent tracing and kprobes, and will inhibit any undesireable compiler instrumentation. The ctor function (if any) will be placed in .text and will work correctly. Example splat before this patch is applied: [ 0.916359] Unable to handle kernel execute from non-executable memory at virtual address ffffa0006b60f5ac [ 0.922088] Mem abort info: [ 0.922828] ESR = 0x8600000e [ 0.923635] EC = 0x21: IABT (current EL), IL = 32 bits [ 0.925036] SET = 0, FnV = 0 [ 0.925838] EA = 0, S1PTW = 0 [ 0.926714] swapper pgtable: 4k pages, 48-bit VAs, pgdp=00000000427b3000 [ 0.928489] [ffffa0006b60f5ac] pgd=000000023ffff003, p4d=000000023ffff003, pud=000000023fffe003, pmd=0068000042000f01 [ 0.931330] Internal error: Oops: 8600000e [#1] PREEMPT SMP [ 0.932806] Modules linked in: [ 0.933617] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.10.0-rc7 #2 [ 0.935620] Hardware name: linux,dummy-virt (DT) [ 0.936924] pstate: 40400005 (nZcv daif +PAN -UAO -TCO BTYPE=--) [ 0.938609] pc : asan.module_ctor+0x0/0x14 [ 0.939759] lr : do_basic_setup+0x4c/0x70 [ 0.940889] sp : ffff27b600177e30 [ 0.941815] x29: ffff27b600177e30 x28: 0000000000000000 [ 0.943306] x27: 0000000000000000 x26: 0000000000000000 [ 0.944803] x25: 0000000000000000 x24: 0000000000000000 [ 0.946289] x23: 0000000000000001 x22: 0000000000000000 [ 0.947777] x21: ffffa0006bf4a890 x20: ffffa0006befb6c0 [ 0.949271] x19: ffffa0006bef9358 x18: 0000000000000068 [ 0.950756] x17: fffffffffffffff8 x16: 0000000000000000 [ 0.952246] x15: 0000000000000000 x14: 0000000000000000 [ 0.953734] x13: 00000000838a16d5 x12: 0000000000000001 [ 0.955223] x11: ffff94000da74041 x10: dfffa00000000000 [ 0.956715] x9 : 0000000000000000 x8 : ffffa0006b60f5ac [ 0.958199] x7 : f9f9f9f9f9f9f9f9 x6 : 000000000000003f [ 0.959683] x5 : 0000000000000040 x4 : 0000000000000000 [ 0.961178] x3 : ffffa0006bdc15a0 x2 : 0000000000000005 [ 0.962662] x1 : 00000000000000f9 x0 : ffffa0006bef9350 [ 0.964155] Call trace: [ 0.964844] asan.module_ctor+0x0/0x14 [ 0.965895] kernel_init_freeable+0x158/0x198 [ 0.967115] kernel_init+0x14/0x19c [ 0.968104] ret_from_fork+0x10/0x30 [ 0.969110] Code: 00000003 00000000 00000000 00000000 (00000000) [ 0.970815] ---[ end trace b5339784e20d015c ]--- Signed-off-by: Mark Rutland Cc: Arnd Bergmann Cc: Greg Kroah-Hartman Cc: Kees Cook --- drivers/misc/lkdtm/Makefile | 2 +- drivers/misc/lkdtm/rodata.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/misc/lkdtm/Makefile b/drivers/misc/lkdtm/Makefile index c70b3822013f..30c8ac24635d 100644 --- a/drivers/misc/lkdtm/Makefile +++ b/drivers/misc/lkdtm/Makefile @@ -16,7 +16,7 @@ KCOV_INSTRUMENT_rodata.o := n OBJCOPYFLAGS := OBJCOPYFLAGS_rodata_objcopy.o := \ - --rename-section .text=.rodata,alloc,readonly,load + --rename-section .noinstr.text=.rodata,alloc,readonly,load targets += rodata.o rodata_objcopy.o $(obj)/rodata_objcopy.o: $(obj)/rodata.o FORCE $(call if_changed,objcopy) diff --git a/drivers/misc/lkdtm/rodata.c b/drivers/misc/lkdtm/rodata.c index 58d180af72cf..baacb876d1d9 100644 --- a/drivers/misc/lkdtm/rodata.c +++ b/drivers/misc/lkdtm/rodata.c @@ -5,7 +5,7 @@ */ #include "lkdtm.h" -void notrace lkdtm_rodata_do_nothing(void) +void noinstr lkdtm_rodata_do_nothing(void) { /* Does nothing. We just want an architecture agnostic "return". */ } -- 2.11.0