Received: by 10.192.165.148 with SMTP id m20csp2339002imm; Sun, 6 May 2018 12:23:50 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoVs1PFpVKgeioLNszRo2vNAC6RuAy0nROftzxcKOrjZkVuMd90tVDrcuJ+KssWyxtQ5Y5Z X-Received: by 10.98.11.210 with SMTP id 79mr34138740pfl.4.1525634629987; Sun, 06 May 2018 12:23:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525634629; cv=none; d=google.com; s=arc-20160816; b=Epz8oMPwLNYtP7y0GSs+45Wp7njp7n+/eJiDP/jzjDm+dUTSEo0RH5t1rak2TP7o65 oQDRNsWc+eTx/Cz3wYZ1aaPnCe7o9zdFoXF9YlCt7F7y33ip/mx/vfiWEVhlwIYzvCcC ROZPAGAoRtYjjBc7BuLPzc/2zwoZ5i7+Ft/VRTiNgmKVZCqJ/1ietUAFtlZssLGv9Miv NrNh5qlyWSyRzHVqMtoBAA5pouFXkk1jEiD2LUzgxuryGCyK5BZSbeFyg+NLMlq1bQeP 6KsaaTtCockX2K0i1Sb8EXPRILJiz4vedktlO9ZNeKMFuETJWA18uHUbb0kGMjGR+eNW gJvA== 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=y2xtZWYYRyWg28VTvtgPJqc8GZ+U/DYvrKmuA0pHbYs=; b=Hi1RDnrFJ+YUkRquD0R5d6Ro9LDF1oa/bOgohBZa+iK2nJ4Lb1iGeEcFonA634uxy1 8FuRYBdFjxWc3ZvIO+4wy7t37eXpYoHltIf2LGkC7ta8zIOPUdfWu6FNHL2RzkvK7tD2 rcdLiezkgLw6rhFnbQKR9HQ4m+KMDCZiutrDHdiMo4GfqVCi2L185zuGn6GbFe7p4SpU nyknZlLlAEa9pIQBg7QkeXvoJcoxGr9hYLvPrbNGRCNYnf+IhKf+2NINHjQgzmlLQT+k HHZ+omxx5e6Q5mb/q5ATybFFEabckq3ajjOXOF+Dg9CeDFpucsi/s8HVsbrFWcHorvyi KK6w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=tojZ0ut7; 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 i74si21489194pfd.105.2018.05.06.12.23.35; Sun, 06 May 2018 12:23:49 -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=tojZ0ut7; 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 S1752045AbeEFTVe (ORCPT + 99 others); Sun, 6 May 2018 15:21:34 -0400 Received: from mail.kernel.org ([198.145.29.99]:38810 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751968AbeEFTUf (ORCPT ); Sun, 6 May 2018 15:20:35 -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 790C22183B; Sun, 6 May 2018 19:20:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1525634434; bh=WvND9DPDgF3NY/mQJ5D9qsosm8XUGYf8HOody5KeOow=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tojZ0ut7AdWCnvTq6xVx/T1TPb2pfYrXcEjA8oivuMpNnZKHrI+mN8X4Hm1yJHb0n cghkcJzo4aL0EhhMj3gYJw27gqCkY1wqMJkP8mUt/P79STipPFfscX1J0ogWLfjvMq sYXc37Zab0YYRZq8r8sWyC30EFKTuVViBRiYQ5XQ= 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 5/9] xtensa: Split breakpoint validation into "check" and "commit" Date: Sun, 6 May 2018 21:19:51 +0200 Message-Id: <1525634395-23380-6-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/xtensa/kernel/hw_breakpoint.c | 60 ++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/arch/xtensa/kernel/hw_breakpoint.c b/arch/xtensa/kernel/hw_breakpoint.c index b35656a..aae055d 100644 --- a/arch/xtensa/kernel/hw_breakpoint.c +++ b/arch/xtensa/kernel/hw_breakpoint.c @@ -45,15 +45,38 @@ int arch_check_bp_in_kernelspace(struct perf_event *bp) return (va >= TASK_SIZE) && ((va + len - 1) >= TASK_SIZE); } -/* - * Construct an arch_hw_breakpoint from a perf_event. - */ -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) +{ + /* Type */ + switch (attr->bp_type) { + case HW_BREAKPOINT_X: + case HW_BREAKPOINT_R: + case HW_BREAKPOINT_W: + case HW_BREAKPOINT_RW: + break; + default: + return -EINVAL; + } + + /* Len */ + if (attr->bp_len < 1 || attr->bp_len > 64 || !is_power_of_2(attr->bp_len)) + return -EINVAL; + + /* Address */ + if (attr->bp_addr & (attr->bp_len - 1)) + 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; /* Type */ - switch (bp->attr.bp_type) { + switch (attr->bp_type) { case HW_BREAKPOINT_X: info->type = XTENSA_BREAKPOINT_EXECUTE; break; @@ -67,29 +90,30 @@ static int arch_build_bp_info(struct perf_event *bp) info->type = XTENSA_BREAKPOINT_LOAD | XTENSA_BREAKPOINT_STORE; break; default: - return -EINVAL; + WARN_ON_ONCE(1); } /* Len */ - info->len = bp->attr.bp_len; - if (info->len < 1 || info->len > 64 || !is_power_of_2(info->len)) - return -EINVAL; + info->len = attr->bp_len; /* Address */ - info->address = bp->attr.bp_addr; - if (info->address & (info->len - 1)) - return -EINVAL; - - return 0; + info->address = attr->bp_addr; } +/* + * Validate the arch-specific HW Breakpoint register settings + */ int arch_validate_hwbkpt_settings(struct perf_event *bp) { - int ret; + int err; - /* Build the arch_hw_breakpoint. */ - ret = arch_build_bp_info(bp); - return ret; + err = hw_breakpoint_arch_check(bp, &bp->attr); + if (err) + return err; + + hw_breakpoint_arch_commit(bp); + + return 0; } int hw_breakpoint_exceptions_notify(struct notifier_block *unused, -- 2.7.4