Received: by 10.192.165.148 with SMTP id m20csp2337507imm; Sun, 6 May 2018 12:21:37 -0700 (PDT) X-Google-Smtp-Source: AB8JxZr0pAUGMImZoqWJp27cvQVOVnZqomDglRyPpd5LSggtacg72qCQlIrnAcWN/QYQgWZcctaZ X-Received: by 2002:a17:902:6181:: with SMTP id u1-v6mr34911460plj.272.1525634497195; Sun, 06 May 2018 12:21:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525634497; cv=none; d=google.com; s=arc-20160816; b=oAYou6iVvLnZEoYhi3+uH1LLcrADUZ500cz+8lUvlvqID0BB/ddtcTs4JiCehyamxo EBTaVMF6pleZfroh1m/KfSQ3CqeQgFVWk+s6hJ/mn+06c+8XCGtayXmKXDhLz56Gm+E3 Lo/+0dDErzZxr65isjjzF5KW58jjiOwEc5hQE8u8YgWapUYhORFL2ADQzQE0OjjGVI7y RJRRFOouh+XSYxTPEBZpHb09c9eSRIy07ltKk7BkbnxFjEO+Iitlh/GWVqElwNVWYHn4 1FdjBzlwVkdj8W3FjRJHrARw7EoWzRXADloDnhZ/gz33YmCfFdxNNtT60hRuA1Y9ZZW1 IWpA== 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=6a69doxZ9b2Dy88/Gtnrgjmn5strA/2WxSF50Yr0uHw=; b=IuZgEzCu25Hl3KCuFVtruIU/3UGfPyC2rgRO/U39dvpRFAju4mXCSs2oLM7o0zV1mg +QcjZrXTSCOL8kYI4ktoulcz8KSvV1VhdFXIj9cvTfelXq8Oo2qKmZEN7YIB4BCldUIa eCNJ4uL9TYFg4UWDtg2KZeDepDZai6dmCdAJnGb1SMoAhT/0c1/q74N6X04qZKohUnIi 8NpJ/AQWEuZtdifcB5ysWLwm6ymDHQs7UckEaDpQzJ0eYCaVkI4jOM8hTdJqLsjTy3ob L9R2ubvojRN7ja9dr1GDfCQJYovmJW/Wo0O4qSvqEi5gGYRtBBpxB5HNwzzngXAs47ly 5ctg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=lc8MYDBS; 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 z62-v6si16938240pgd.172.2018.05.06.12.21.22; Sun, 06 May 2018 12:21:37 -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=lc8MYDBS; 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 S1752009AbeEFTUv (ORCPT + 99 others); Sun, 6 May 2018 15:20:51 -0400 Received: from mail.kernel.org ([198.145.29.99]:39014 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751825AbeEFTUp (ORCPT ); Sun, 6 May 2018 15:20:45 -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 9442E2183F; Sun, 6 May 2018 19:20:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1525634444; bh=EhmYjBreYGE2u253EjJV8u2gfARkr70aYLSh+rs98Yw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lc8MYDBSX2AAt1pWGHo25TG36ZaVvGXxrWBpq2ioFr4av15rql0foxlXoJytyPD/0 vhx3rcxLrdR/tvAuxNnU5U6Z/L53JucyN3tnKbZdyJpMTzS4MnOSKLLHCI2KoupvBr 61fm0438nRVtDz/5ZFwfhsPvUiOEzgmAsB7MF4Kc= 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 7/9] powerpc: Split breakpoint validation into "check" and "commit" Date: Sun, 6 May 2018 21:19:53 +0200 Message-Id: <1525634395-23380-8-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/powerpc/kernel/hw_breakpoint.c | 82 ++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 29 deletions(-) diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c index 4c1012b..c39fc86 100644 --- a/arch/powerpc/kernel/hw_breakpoint.c +++ b/arch/powerpc/kernel/hw_breakpoint.c @@ -138,33 +138,20 @@ int arch_bp_generic_fields(int type, int *gen_bp_type) return 0; } -/* - * Validate the arch-specific HW Breakpoint register settings - */ -int arch_validate_hwbkpt_settings(struct perf_event *bp) +static int hw_breakpoint_arch_check(struct perf_event *bp, + const struct perf_event_attr *attr) { - int ret = -EINVAL, length_max; - struct arch_hw_breakpoint *info = counter_arch_bp(bp); + int length_max; if (!bp) - return ret; + return -EINVAL; - info->type = HW_BRK_TYPE_TRANSLATE; - if (bp->attr.bp_type & HW_BREAKPOINT_R) - info->type |= HW_BRK_TYPE_READ; - if (bp->attr.bp_type & HW_BREAKPOINT_W) - info->type |= HW_BRK_TYPE_WRITE; - if (info->type == HW_BRK_TYPE_TRANSLATE) - /* must set alteast read or write */ - return ret; - if (!(bp->attr.exclude_user)) - info->type |= HW_BRK_TYPE_USER; - if (!(bp->attr.exclude_kernel)) - info->type |= HW_BRK_TYPE_KERNEL; - if (!(bp->attr.exclude_hv)) - info->type |= HW_BRK_TYPE_HYP; - info->address = bp->attr.bp_addr; - info->len = bp->attr.bp_len; + /* Must set at least read or write */ + if (!(attr->bp_type & (HW_BREAKPOINT_R | HW_BREAKPOINT_W))) + return -EINVAL; + + if (!ppc_breakpoint_available()) + return -ENODEV; /* * Since breakpoint length can be a maximum of HW_BREAKPOINT_LEN(8) @@ -172,19 +159,56 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) * HW_BREAKPOINT_ALIGN by rounding off to the lower address, the * 'symbolsize' should satisfy the check below. */ - if (!ppc_breakpoint_available()) - return -ENODEV; length_max = 8; /* DABR */ if (cpu_has_feature(CPU_FTR_DAWR)) { length_max = 512 ; /* 64 doublewords */ /* DAWR region can't cross 512 boundary */ - if ((bp->attr.bp_addr >> 10) != - ((bp->attr.bp_addr + bp->attr.bp_len - 1) >> 10)) + if ((attr->bp_addr >> 10) != + ((attr->bp_addr + attr->bp_len - 1) >> 10)) return -EINVAL; } - if (info->len > - (length_max - (info->address & HW_BREAKPOINT_ALIGN))) + if (attr->bp_len > + (length_max - (attr->bp_addr & HW_BREAKPOINT_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->type = HW_BRK_TYPE_TRANSLATE; + if (attr->bp_type & HW_BREAKPOINT_R) + info->type |= HW_BRK_TYPE_READ; + if (attr->bp_type & HW_BREAKPOINT_W) + info->type |= HW_BRK_TYPE_WRITE; + + if (!attr->exclude_user) + info->type |= HW_BRK_TYPE_USER; + if (!attr->exclude_kernel) + info->type |= HW_BRK_TYPE_KERNEL; + if (!attr->exclude_hv) + info->type |= HW_BRK_TYPE_HYP; + + info->address = attr->bp_addr; + info->len = attr->bp_len; +} + +/* + * Validate the arch-specific HW Breakpoint register settings + */ +int arch_validate_hwbkpt_settings(struct perf_event *bp) +{ + int err; + + err = hw_breakpoint_arch_check(bp, &bp->attr); + if (err) + return err; + + hw_breakpoint_arch_commit(bp); + return 0; } -- 2.7.4