Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp2744544ybh; Mon, 9 Mar 2020 12:06:59 -0700 (PDT) X-Google-Smtp-Source: ADFU+vtcyYte/Nm67/q8N7C++byc67Km52YO7bqH63PuWz+aB0PaPEyMd0GipVrJL3eP1Bu1MTEF X-Received: by 2002:a9d:3f4b:: with SMTP id m69mr13190280otc.146.1583780819294; Mon, 09 Mar 2020 12:06:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1583780819; cv=none; d=google.com; s=arc-20160816; b=ntzE4zIx7BvZvWJVeLONU6MQR6AUOIOxldbHgpMOumRTpuTwOeJZR9tlpvePjjBkL5 tuuLoLfoDnd0SRO8A+pacwu1QNuK0mX7OwyX6xcOk9AkjO/rAJs0EsYAGndAwm09HB16 aGxEZQHMjqqEucMZuXZ/S5lsLQCZfKpSB5votDACgmv73rLW1lZhxW+oFIhlmJcm6Hva sot7ZrVgIz0QGlTK2biATqFKHCCgSpD9WoDcLriYCc1CDApla6/6D/RXGcvrncyaujRh 5ANaJj5NoG2sXczsuOxLcj0kGEJd2+pHqfNXOoUOhiwjZtlt+5TaSShPGU6Sh+9/jBbb iehQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=ESjGuEh/7vDIgTOakNw1fEVh5przYruzl5Pm0sEzWcg=; b=wvGP3EE7rz0nWAPGquxke3ldV0lRMLlsutuZYih2CrmVGjdnZFRvmrA3cs5rLwAN63 WP/z2b1dOIrVU+9GT1VXqKaF06iHHv+xn8Qalt1/VI84ALpv+wqKndhk4gCSlOo0nh5N m6B082tU7U4ESiaziWr/JuEEAU8DDTGvQvMlQwrNTG6t2rHQ+Pw7RqZVQe2B4+NLaOfD FoUa3Hk6xNfnsCLnXciq0ma7ps0M2fL7AoEHJ1Wi/0SuRSMHixakE4LB1Ddc32f+L9t/ hzybEasQQ1Rg8+XohLUJ/9OjMe02lV5UQdjY9fXLXTDr6Xn/B1Z8ql6s+8FxggBSGp5W curw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=gBP08WFE; 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 sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t12si4435202oij.179.2020.03.09.12.06.47; Mon, 09 Mar 2020 12:06:59 -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=@kernel.org header.s=default header.b=gBP08WFE; 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 sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727581AbgCITEZ (ORCPT + 99 others); Mon, 9 Mar 2020 15:04:25 -0400 Received: from mail.kernel.org ([198.145.29.99]:47610 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727504AbgCITEY (ORCPT ); Mon, 9 Mar 2020 15:04:24 -0400 Received: from paulmck-ThinkPad-P72.home (50-39-105-78.bvtn.or.frontiernet.net [50.39.105.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 69A8124649; Mon, 9 Mar 2020 19:04:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1583780663; bh=SuqZcniL6Mh79xD1b/d7wwQ5rY3JNaHiSM5OGEKD6ds=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gBP08WFEBXUkr0GTIFpuIcKxdmj5n3aaDQDqEWj6pwF1nqbx57B/h/k9nagRHUuQ0 DZKWNroImamE9HKOIimOtdpe2h2bQCMfeAx5W+LdBe4WgT1dIFX4HgaYSz15CWsi8O gOeFg6P2GA5EKIFqiEu5BYTvSg6bxJDAsQvt33Gw= From: paulmck@kernel.org To: linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, kernel-team@fb.com, mingo@kernel.org Cc: elver@google.com, andreyknvl@google.com, glider@google.com, dvyukov@google.com, cai@lca.pw, boqun.feng@gmail.com, "Paul E . McKenney" Subject: [PATCH kcsan 06/32] include/linux: Add instrumented.h infrastructure Date: Mon, 9 Mar 2020 12:03:54 -0700 Message-Id: <20200309190420.6100-6-paulmck@kernel.org> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20200309190359.GA5822@paulmck-ThinkPad-P72> References: <20200309190359.GA5822@paulmck-ThinkPad-P72> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Marco Elver This adds instrumented.h, which provides generic wrappers for memory access instrumentation that the compiler cannot emit for various sanitizers. Currently this unifies KASAN and KCSAN instrumentation. In future this will also include KMSAN instrumentation. Note that, copy_{to,from}_user should use special instrumentation, since we should be able to instrument both source and destination memory accesses if both are kernel memory. The current patch only instruments the memory access where the address is always in kernel space, however, both may in fact be kernel addresses when a compat syscall passes an argument allocated in the kernel to a real syscall. In a future change, both KASAN and KCSAN should check both addresses in such cases, as well as KMSAN will make use of both addresses. [It made more sense to provide the completed function signature, rather than updating it and changing all locations again at a later time.] Suggested-by: Arnd Bergmann Signed-off-by: Marco Elver Acked-by: Alexander Potapenko Reviewed-by: Dmitry Vyukov Signed-off-by: Paul E. McKenney --- include/linux/instrumented.h | 109 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 include/linux/instrumented.h diff --git a/include/linux/instrumented.h b/include/linux/instrumented.h new file mode 100644 index 0000000..43e6ea5 --- /dev/null +++ b/include/linux/instrumented.h @@ -0,0 +1,109 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * This header provides generic wrappers for memory access instrumentation that + * the compiler cannot emit for: KASAN, KCSAN. + */ +#ifndef _LINUX_INSTRUMENTED_H +#define _LINUX_INSTRUMENTED_H + +#include +#include +#include +#include + +/** + * instrument_read - instrument regular read access + * + * Instrument a regular read access. The instrumentation should be inserted + * before the actual read happens. + * + * @ptr address of access + * @size size of access + */ +static __always_inline void instrument_read(const volatile void *v, size_t size) +{ + kasan_check_read(v, size); + kcsan_check_read(v, size); +} + +/** + * instrument_write - instrument regular write access + * + * Instrument a regular write access. The instrumentation should be inserted + * before the actual write happens. + * + * @ptr address of access + * @size size of access + */ +static __always_inline void instrument_write(const volatile void *v, size_t size) +{ + kasan_check_write(v, size); + kcsan_check_write(v, size); +} + +/** + * instrument_atomic_read - instrument atomic read access + * + * Instrument an atomic read access. The instrumentation should be inserted + * before the actual read happens. + * + * @ptr address of access + * @size size of access + */ +static __always_inline void instrument_atomic_read(const volatile void *v, size_t size) +{ + kasan_check_read(v, size); + kcsan_check_atomic_read(v, size); +} + +/** + * instrument_atomic_write - instrument atomic write access + * + * Instrument an atomic write access. The instrumentation should be inserted + * before the actual write happens. + * + * @ptr address of access + * @size size of access + */ +static __always_inline void instrument_atomic_write(const volatile void *v, size_t size) +{ + kasan_check_write(v, size); + kcsan_check_atomic_write(v, size); +} + +/** + * instrument_copy_to_user - instrument reads of copy_to_user + * + * Instrument reads from kernel memory, that are due to copy_to_user (and + * variants). The instrumentation must be inserted before the accesses. + * + * @to destination address + * @from source address + * @n number of bytes to copy + */ +static __always_inline void +instrument_copy_to_user(void __user *to, const void *from, unsigned long n) +{ + kasan_check_read(from, n); + kcsan_check_read(from, n); +} + +/** + * instrument_copy_from_user - instrument writes of copy_from_user + * + * Instrument writes to kernel memory, that are due to copy_from_user (and + * variants). The instrumentation should be inserted before the accesses. + * + * @to destination address + * @from source address + * @n number of bytes to copy + */ +static __always_inline void +instrument_copy_from_user(const void *to, const void __user *from, unsigned long n) +{ + kasan_check_write(to, n); + kcsan_check_write(to, n); +} + +#endif /* _LINUX_INSTRUMENTED_H */ -- 2.9.5