From patchwork Thu Jul 28 14:51:28 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 72983 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp894808qga; Thu, 28 Jul 2016 07:54:45 -0700 (PDT) X-Received: by 10.107.168.97 with SMTP id r94mr37280900ioe.68.1469717685038; Thu, 28 Jul 2016 07:54:45 -0700 (PDT) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id q123si13482461iof.67.2016.07.28.07.54.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Jul 2016 07:54:45 -0700 (PDT) Received-SPF: neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=neutral (google.com: 192.237.175.120 is neither permitted nor denied by best guess record for domain of xen-devel-bounces@lists.xen.org) smtp.mailfrom=xen-devel-bounces@lists.xen.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bSmfL-0002rY-4F; Thu, 28 Jul 2016 14:52:03 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bSmfJ-0002py-It for xen-devel@lists.xen.org; Thu, 28 Jul 2016 14:52:01 +0000 Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id 05/05-06162-01C1A975; Thu, 28 Jul 2016 14:52:00 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrOLMWRWlGSWpSXmKPExsVysyfVTVdAZla 4wZT1vBZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa8b/M1OZC65KVHz/dI2pgfGQYBcjF4eQwCZG id6m5ywQzmlGiadbZ7B3MXJysAloStz5/IkJxBYRkJa49vkyI0gRs0A7o8Ta/l5mkISwQJDE6 UWP2EBsFgFViQ3rFoA18Ao4S/zruAY2SEJATuLkscmsXYwcHJwCLhKvu4VAwkJAJdNnLmWcwM i9gJFhFaNGcWpRWWqRrpGBXlJRZnpGSW5iZo6uoYGxXm5qcXFiempOYlKxXnJ+7iZGoIfrGRg YdzA2n/A7xCjJwaQkyhsWOjNciC8pP6UyI7E4I76oNCe1+BCjDAeHkgSvv/SscCHBotT01Iq0 zBxgqMGkJTh4lER4J4GkeYsLEnOLM9MhUqcYFaXEeXlBEgIgiYzSPLg2WHhfYpSVEuZlZGBgE OIpSC3KzSxBlX/FKM7BqCTMmwoyhSczrwRu+iugxUxAi4tjZ4AsLklESEk1MCowGzxbw5e3c9 6if8vKBWJYK2d0rdvSqTTRtvHvVn+9H5eWbna92ipRsXIJUxt73O4pTGJv/x7SFHgx+/J1D9a U+kehwm71s1csL1ZkWh9s7PR5vve3vVWbNj18tOLZgeSz2ddWfRY8zRBhLmq+fOOdLW3WOhFf Jt1ZcO/G7Vof14uOR9Im7DZUYinOSDTUYi4qTgQAJAFdDGoCAAA= X-Env-Sender: julien.grall@arm.com X-Msg-Ref: server-14.tower-31.messagelabs.com!1469717519!52903368!1 X-Originating-IP: [217.140.101.70] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.77; banners=-,-,- X-VirusChecked: Checked Received: (qmail 6095 invoked from network); 28 Jul 2016 14:51:59 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-14.tower-31.messagelabs.com with SMTP; 28 Jul 2016 14:51:59 -0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6BADEBAF; Thu, 28 Jul 2016 07:53:16 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.218.32]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3583A3F21A; Thu, 28 Jul 2016 07:51:58 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xen.org Date: Thu, 28 Jul 2016 15:51:28 +0100 Message-Id: <1469717505-8026-6-git-send-email-julien.grall@arm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1469717505-8026-1-git-send-email-julien.grall@arm.com> References: <1469717505-8026-1-git-send-email-julien.grall@arm.com> Cc: proskurin@sec.in.tum.de, Julien Grall , sstabellini@kernel.org, steve.capper@arm.com, wei.chen@linaro.org Subject: [Xen-devel] [RFC 05/22] xen/arm: traps: Move MMIO emulation code in a separate helper X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" Currently, a stage-2 fault translation will likely access an emulated region. All the checks are pre-sanitity check for MMIO emulation. A follow-up patch will handle a new case that could lead to a stage-2 translation. To improve the clarity of the code and the changes, the current implementation is move in a separate helper. Signed-off-by: Julien Grall --- xen/arch/arm/traps.c | 58 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 46e0663..b46284c 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -2444,6 +2444,38 @@ static void do_trap_instr_abort_guest(struct cpu_user_regs *regs, inject_iabt_exception(regs, gva, hsr.len); } +static bool_t try_handle_mmio(struct cpu_user_regs *regs, + mmio_info_t *info) +{ + const struct hsr_dabt dabt = info->dabt; + int rc; + + /* stage-1 page table should never live in an emulated MMIO region */ + if ( dabt.s1ptw ) + return 0; + + /* All the instructions used on emulated MMIO region should be valid */ + if ( !dabt.valid ) + return 0; + + /* + * Erratum 766422: Thumb store translation fault to Hypervisor may + * not have correct HSR Rt value. + */ + if ( check_workaround_766422() && (regs->cpsr & PSR_THUMB) && + dabt.write ) + { + rc = decode_instruction(regs, &info->dabt); + if ( rc ) + { + gprintk(XENLOG_DEBUG, "Unable to decode instruction\n"); + return 0; + } + } + + return !!handle_mmio(info); +} + static void do_trap_data_abort_guest(struct cpu_user_regs *regs, const union hsr hsr) { @@ -2487,40 +2519,16 @@ static void do_trap_data_abort_guest(struct cpu_user_regs *regs, break; } case FSC_FLT_TRANS: - if ( dabt.s1ptw ) - goto bad_data_abort; - - /* XXX: Decode the instruction if ISS is not valid */ - if ( !dabt.valid ) - goto bad_data_abort; - - /* - * Erratum 766422: Thumb store translation fault to Hypervisor may - * not have correct HSR Rt value. - */ - if ( check_workaround_766422() && (regs->cpsr & PSR_THUMB) && - dabt.write ) - { - rc = decode_instruction(regs, &info.dabt); - if ( rc ) - { - gprintk(XENLOG_DEBUG, "Unable to decode instruction\n"); - goto bad_data_abort; - } - } - - if ( handle_mmio(&info) ) + if ( try_handle_mmio(regs, &info) ) { advance_pc(regs, hsr); return; } - break; default: gprintk(XENLOG_WARNING, "Unsupported DFSC: HSR=%#x DFSC=%#x\n", hsr.bits, dabt.dfsc); } -bad_data_abort: gdprintk(XENLOG_DEBUG, "HSR=0x%x pc=%#"PRIregister" gva=%#"PRIvaddr " gpa=%#"PRIpaddr"\n", hsr.bits, regs->pc, info.gva, info.gpa); inject_dabt_exception(regs, info.gva, hsr.len);