Received: by 10.192.165.148 with SMTP id m20csp2338351imm; Sun, 6 May 2018 12:22:50 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoBLRTdVCM4zGUc8UR28cUIaD9gHoo8ZvjD7qo0ZDNNf6hEabggnD/VsTvphtPyzBKALvtK X-Received: by 10.98.99.4 with SMTP id x4mr23910302pfb.94.1525634570213; Sun, 06 May 2018 12:22:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525634570; cv=none; d=google.com; s=arc-20160816; b=qN0pOdL64BIUdL9EMFM7MA++/+6OB8CHHzyR2b2P1dbNtLbn6fmW3K3KM5cFsR+Br7 aLiC/6qBF6OAXWRD0oeaFGY3VMk6mtNYm4Re5nKKwqOzNg0YYFLquWo4UQFZNvYItm1B rQ+rZrUHo+Ng0TfoATMK/vfNSpEAet2lcgBoLHfLrE9onhj7hHvUv1psal7epzlhdoS+ fp53G1a50gnXrpV20cvXGtu/e6FdBspgu1xusuoVLbYuj2z1lj2L+QNdU63SB03JwJs2 5AKupQZBJL+aKTf1Ejpl3reGf+iFUNBY+KEMDrqfROy/ROBZHHIyE2iBS5ZFIL5FERGC zeiA== 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:arc-authentication-results; bh=FH+LILLKiOhI3hlXRUQF3z5BRBDf6obtz98+tieGMy8=; b=UMsJvJPTftQqoA06U3LsAGVeMh32ko10nl0x8agH9qqvzbMxi0KC3IgVrP4SH1bc8i 4wFrknhECAStRZmlIhUW+NusrLG1zzVUSaQWJjjkk3XV72ovWVKm+J0Bbwilz+9NLxPh 4Q1CH8xC+q+qu+5dD/LdJukTTtlkOmGcVZjggrLNHV6lZcEDay83lFg63kJS3w8ZV3SR K7qgl3zculSSTo4bs2FdiZsNrnjk2XLKgxA6uNbKzn1Wtm8PPqfdAIZfxvzN1doEBMvN PSO7Cho45SuG77mavCdlFfiLcgfWlVIWhEqva5vqRQ2hAr3fRUIrFFZ4JXDS2mGAvyTk CNmA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=NEiE7Vnf; 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 s88si20667492pfa.339.2018.05.06.12.22.36; Sun, 06 May 2018 12:22:50 -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=NEiE7Vnf; 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 S1751951AbeEFTUa (ORCPT + 99 others); Sun, 6 May 2018 15:20:30 -0400 Received: from mail.kernel.org ([198.145.29.99]:38552 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751938AbeEFTUZ (ORCPT ); Sun, 6 May 2018 15:20:25 -0400 Received: from lerouge.home (LFbn-NCY-1-193-82.w83-194.abo.wanadoo.fr [83.194.41.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id EDD0D21839; Sun, 6 May 2018 19:20:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1525634424; bh=k7ipybzbPdC6zHwBsF28wjay2wXKJk6rvr8tz7Ak3nM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NEiE7Vnfb8jEBxpBt9nVbK9jak5A3lD2JP4bBVGAmihzpxb7vyq/+eLevXabE/kd+ rAsikz75z1YL9G6AXbFnuIQ7pySTQrhYMmHWSfVJeEnWR5DG9oJBYsxL5ayhj2Lpzo 61UeRZ5b+kthKHUGBtUr15Ozm7mx0k04J5jVf7Xo= From: Frederic Weisbecker To: LKML Cc: Frederic Weisbecker , Jiri Olsa , Namhyung Kim , Peter Zijlstra , Linus Torvalds , Yoshinori Sato , Benjamin Herrenschmidt , Catalin Marinas , Chris Zankel , Paul Mackerras , Thomas Gleixner , Will Deacon , Michael Ellerman , Rich Felker , Ingo Molnar , Mark Rutland , Alexander Shishkin , Andy Lutomirski , Arnaldo Carvalho de Melo , Max Filippov Subject: [PATCH 3/9] sh: Split breakpoint validation into "check" and "commit" Date: Sun, 6 May 2018 21:19:49 +0200 Message-Id: <1525634395-23380-4-git-send-email-frederic@kernel.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1525634395-23380-1-git-send-email-frederic@kernel.org> References: <1525634395-23380-1-git-send-email-frederic@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The breakpoint code mixes up attribute check and commit into a single code entity. Therefore the validation may return an error due to incorrect atributes while still leaving halfway modified architecture breakpoint struct. Prepare fox fixing this misdesign and separate both logics. Signed-off-by: Frederic Weisbecker Cc: Linus Torvalds Cc: Andy Lutomirski Cc: Yoshinori Sato Cc: Rich Felker Cc: Ingo Molnar Cc: Thomas Gleixner Cc: Will Deacon Cc: Mark Rutland Cc: Max Filippov Cc: Chris Zankel Cc: Catalin Marinas Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Michael Ellerman Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Alexander Shishkin Cc: Jiri Olsa Cc: Namhyung Kim --- arch/sh/kernel/hw_breakpoint.c | 89 ++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 39 deletions(-) diff --git a/arch/sh/kernel/hw_breakpoint.c b/arch/sh/kernel/hw_breakpoint.c index 286c3ab..c89152f 100644 --- a/arch/sh/kernel/hw_breakpoint.c +++ b/arch/sh/kernel/hw_breakpoint.c @@ -174,14 +174,53 @@ int arch_bp_generic_fields(int sh_len, int sh_type, return 0; } -static int arch_build_bp_info(struct perf_event *bp) +static int hw_breakpoint_arch_check(struct perf_event *bp, + const struct perf_event_attr *attr) +{ + unsigned int align; + + /* Check type */ + switch (attr->bp_type) { + case HW_BREAKPOINT_W: + case HW_BREAKPOINT_R: + case HW_BREAKPOINT_W | HW_BREAKPOINT_R: + break; + default: + return -EINVAL; + } + + /* Check len */ + switch (attr->bp_len) { + case HW_BREAKPOINT_LEN_1: + case HW_BREAKPOINT_LEN_2: + case HW_BREAKPOINT_LEN_4: + case HW_BREAKPOINT_LEN_8: + break; + default: + return -EINVAL; + } + + align = attr->bp_len - 1; + + /* + * Check that the low-order bits of the address are appropriate + * for the alignment implied by len. + */ + if (attr->bp_addr & align) + return -EINVAL; + + return 0; +} + +static void hw_breakpoint_arch_commit(struct perf_event *bp) { struct arch_hw_breakpoint *info = counter_arch_bp(bp); + struct perf_event_attr *attr = &bp->attr; - info->address = bp->attr.bp_addr; + info->address = attr->bp_addr; /* Len */ - switch (bp->attr.bp_len) { + switch (attr->bp_len) { case HW_BREAKPOINT_LEN_1: info->len = SH_BREAKPOINT_LEN_1; break; @@ -195,11 +234,11 @@ static int arch_build_bp_info(struct perf_event *bp) info->len = SH_BREAKPOINT_LEN_8; break; default: - return -EINVAL; + WARN_ON_ONCE(1); } /* Type */ - switch (bp->attr.bp_type) { + switch (attr->bp_type) { case HW_BREAKPOINT_R: info->type = SH_BREAKPOINT_READ; break; @@ -210,10 +249,8 @@ static int arch_build_bp_info(struct perf_event *bp) info->type = SH_BREAKPOINT_RW; break; default: - return -EINVAL; + WARN_ON_ONCE(1); } - - return 0; } /* @@ -221,39 +258,13 @@ static int arch_build_bp_info(struct perf_event *bp) */ int arch_validate_hwbkpt_settings(struct perf_event *bp) { - struct arch_hw_breakpoint *info = counter_arch_bp(bp); - unsigned int align; - int ret; + int err; - ret = arch_build_bp_info(bp); - if (ret) - return ret; + err = hw_breakpoint_arch_check(bp, &bp->attr); + if (err) + return err; - ret = -EINVAL; - - switch (info->len) { - case SH_BREAKPOINT_LEN_1: - align = 0; - break; - case SH_BREAKPOINT_LEN_2: - align = 1; - break; - case SH_BREAKPOINT_LEN_4: - align = 3; - break; - case SH_BREAKPOINT_LEN_8: - align = 7; - break; - default: - return ret; - } - - /* - * Check that the low-order bits of the address are appropriate - * for the alignment implied by len. - */ - if (info->address & align) - return -EINVAL; + hw_breakpoint_arch_commit(bp); return 0; } -- 2.7.4