From patchwork Wed Jul 22 08:53:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kito Cheng X-Patchwork-Id: 1333672 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=sifive.com header.i=@sifive.com header.a=rsa-sha256 header.s=google header.b=hyxqCTro; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BBTl36BcGz9sSy for ; Wed, 22 Jul 2020 18:53:19 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B07FD39CF061; Wed, 22 Jul 2020 08:53:17 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pg1-x542.google.com (mail-pg1-x542.google.com [IPv6:2607:f8b0:4864:20::542]) by sourceware.org (Postfix) with ESMTPS id 59D20389851A for ; Wed, 22 Jul 2020 08:53:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 59D20389851A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=kito.cheng@sifive.com Received: by mail-pg1-x542.google.com with SMTP id g67so834641pgc.8 for ; Wed, 22 Jul 2020 01:53:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=eeCCbS56Abx3vh/hOfKA0GdayspBj6vna/Q38IW+Rtw=; b=hyxqCTronsW9o0udMd4LkJxFuzlv3S565BMTZhyNfqIFHzqD9Vue8ZQjvO9bTdwQdv FLOqhQVtVAdQendSZcoF8KqA0HEremiHmiBgNXn6faWcIAuuV9x3+IF8FybjMJ9iZv09 V7gdHoQu+i5Qpb0xyqvS0SbEMJMTFEADEMtctOkWCgWKFcW6rlpvKl045TnlY59o8CAS aul/KQEQspqlhpHE7kdEv48tm4+jYLvw+1w0utfu3CnYlydf2ChA73S3yoWLNaLL6Z/o 73UXWB1THJre9d8LULz0jRNCYTTnB86u4CXxqPtYSgO7ZrTA86dYiB640lwCjfXskFHO /4aw== 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:mime-version :content-transfer-encoding; bh=eeCCbS56Abx3vh/hOfKA0GdayspBj6vna/Q38IW+Rtw=; b=YuW+2LbetYlh5y3ftBq8Lx43PvbA4QYemXMZhGZA4uGsTh2fJwjh/AcOjOCGRc+Xtm s+1cdk8WOQA3JKfz8S2byKHm3mrB7k2quXr6rySbpCnsyH91mhYV6wtInjUaELjJ2CxJ eJYB3O1Zl0YcrvG6pbJw5LprxAqWzY7C9MgoSRU5gXbZoKGq+V3RKMliCE8NSitAwBLF rrTW+WbFJRdMy0ERPP9SkD+rVmaSK56pMHLdmxn1J1PZHXgll1G5sWpm96CDzF4f11Do QvjNGq3/Qo9WbejJsvVwOV1XZvCegOsxDVIzUK8MeN9B+QvacHUfR0pbO61/NPTyBFqG 8PSw== X-Gm-Message-State: AOAM531njHrSAlEWh602gDJ0h78Oinbh4bcKKe006S0u4nCfgya2lTOJ Lek5Zq815HCN4j8JIaxA4UNrXKKYypU= X-Google-Smtp-Source: ABdhPJx6iUBR/nQJFTCmf0V3Bi2tIrQVEE65d1iIR8ioUciMOh1A9HEqWZ0Mda8XfLhRtoI/KU5cZg== X-Received: by 2002:a62:190a:: with SMTP id 10mr27963817pfz.29.1595407992536; Wed, 22 Jul 2020 01:53:12 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (114-34-229-221.HINET-IP.hinet.net. [114.34.229.221]) by smtp.gmail.com with ESMTPSA id b24sm20020442pgn.8.2020.07.22.01.53.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2020 01:53:11 -0700 (PDT) From: Kito Cheng To: gcc-patches@gcc.gnu.org, kito.cheng@gmail.com, rguenther@suse.de, jimw@sifive.com Subject: [PATCH] PR target/96260 - KASAN should work even back-end not porting anything. Date: Wed, 22 Jul 2020 16:53:00 +0800 Message-Id: <20200722085300.5563-1-kito.cheng@sifive.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Spam-Status: No, score=-14.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kito Cheng Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" - Most KASAN function don't need any porting anything in back-end except asan stack protection. - However kernel will given shadow offset when enable asan stack protection, so eveything in KASAN can work if shadow offset is given. - Verified with x86 and risc-v. - Verified with RISC-V linux kernel. OK for trunk and GCC 10 branch? gcc/ChangeLog: PR target/96260 * asan.c (asan_shadow_offset_set_p): New. * asan.h (asan_shadow_offset_set_p): Ditto. * toplev.c (process_options): Allow -fsanitize=kernel-address even TARGET_ASAN_SHADOW_OFFSET not implemented, only check when asan stack protection is enabled. gcc/testsuite/ChangeLog: PR target/96260 * gcc.target/riscv/pr91441.c: Update warning message. * gcc.target/riscv/pr96260.c: New. --- gcc/asan.c | 6 ++++++ gcc/asan.h | 2 ++ gcc/testsuite/gcc.target/riscv/pr91441.c | 2 +- gcc/testsuite/gcc.target/riscv/pr96260.c | 9 +++++++++ gcc/toplev.c | 21 ++++++++++++++++++++- 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/pr96260.c diff --git a/gcc/asan.c b/gcc/asan.c index 9c9aa4cae358..2e759540246f 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -344,6 +344,12 @@ asan_shadow_offset () return asan_shadow_offset_value; } +/* Returns Asan shadow offset has been set. */ +bool asan_shadow_offset_set_p () +{ + return asan_shadow_offset_computed; +} + alias_set_type asan_shadow_set = -1; /* Pointer types to 1, 2 or 4 byte integers in shadow memory. A separate diff --git a/gcc/asan.h b/gcc/asan.h index 9efd33f9b86b..114b457ef91c 100644 --- a/gcc/asan.h +++ b/gcc/asan.h @@ -129,6 +129,8 @@ asan_var_and_redzone_size (unsigned HOST_WIDE_INT size) extern bool set_asan_shadow_offset (const char *); +extern bool asan_shadow_offset_set_p (); + extern void set_sanitized_sections (const char *); extern bool asan_sanitize_stack_p (void); diff --git a/gcc/testsuite/gcc.target/riscv/pr91441.c b/gcc/testsuite/gcc.target/riscv/pr91441.c index 593a2972a0f0..2403c98bb703 100644 --- a/gcc/testsuite/gcc.target/riscv/pr91441.c +++ b/gcc/testsuite/gcc.target/riscv/pr91441.c @@ -7,4 +7,4 @@ int *f( int a) { return bar(&a); } -/* { dg-warning ".'-fsanitize=address' and '-fsanitize=kernel-address' are not supported for this target" "" { target *-*-* } 0 } */ +/* { dg-warning ".'-fsanitize=kernel-address' with stack protection is not supported without '-fasan-shadow-offset=' for this target." "" { target *-*-* } 0 } */ diff --git a/gcc/testsuite/gcc.target/riscv/pr96260.c b/gcc/testsuite/gcc.target/riscv/pr96260.c new file mode 100644 index 000000000000..229997f877b7 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/pr96260.c @@ -0,0 +1,9 @@ +/* PR target/96260 */ +/* { dg-do compile } */ +/* { dg-options "--param asan-stack=1 -fsanitize=kernel-address -fasan-shadow-offset=0x100000" } */ + +int *bar(int *); +int *f( int a) +{ + return bar(&a); +} diff --git a/gcc/toplev.c b/gcc/toplev.c index 95eea63380f6..48f13d282c52 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1835,7 +1835,7 @@ process_options (void) /* Address Sanitizer needs porting to each target architecture. */ if ((flag_sanitize & SANITIZE_ADDRESS) - && (!FRAME_GROWS_DOWNWARD || targetm.asan_shadow_offset == NULL)) + && !FRAME_GROWS_DOWNWARD) { warning_at (UNKNOWN_LOCATION, 0, "%<-fsanitize=address%> and %<-fsanitize=kernel-address%> " @@ -1843,6 +1843,25 @@ process_options (void) flag_sanitize &= ~SANITIZE_ADDRESS; } + if ((flag_sanitize & SANITIZE_USER_ADDRESS) + && targetm.asan_shadow_offset == NULL) + { + warning_at (UNKNOWN_LOCATION, 0, + "%<-fsanitize=address%> not supported for this target"); + flag_sanitize &= ~SANITIZE_ADDRESS; + } + + if ((flag_sanitize & SANITIZE_KERNEL_ADDRESS) + && (targetm.asan_shadow_offset == NULL && param_asan_stack + && !asan_shadow_offset_set_p ())) + { + warning_at (UNKNOWN_LOCATION, 0, + "%<-fsanitize=kernel-address%> with stack protection " + "is not supported without %<-fasan-shadow-offset=%> " + "for this target."); + flag_sanitize &= ~SANITIZE_ADDRESS; + } + /* Do not use IPA optimizations for register allocation if profiler is active or patchable function entries are inserted for run-time instrumentation or port does not emit prologue and epilogue as RTL. */