From patchwork Fri Jan 27 11:29:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Price X-Patchwork-Id: 49250 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp782745wrn; Fri, 27 Jan 2023 03:32:11 -0800 (PST) X-Google-Smtp-Source: AK7set+Ip3C/vZ7Q3Nwog97vkTq+287bqImFh+C92IgQY6bUEZTcUfMMhZoDdWwuHvSxDgNwl0rj X-Received: by 2002:a17:90b:1e4e:b0:22b:f834:3fac with SMTP id pi14-20020a17090b1e4e00b0022bf8343facmr12496886pjb.11.1674819130827; Fri, 27 Jan 2023 03:32:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674819130; cv=none; d=google.com; s=arc-20160816; b=uffqCf1gD4teJdB21JrarKf7l35YLZy9Sj//flsNoPtQ0LlFUxE6PZoAo5xUeAz5qu YU1Cwiza04Wm3vwRp4E7Hz6+TXh8l1I/jcrAe0U7UbxtvZ0PvISYhHh4b1yc20wSv25b GnO7aFu3JQXdxjPGotMVbZRJdtwp4tH4dBfH4aS1qMaqI9CiPYXadi2YX7K8xPr6tjlY mnc7/rK7iN8Po815228jqJqaWLevycjFnweQLJd1DEGKCphN2zeVISZYTl1nwcJVUvfK lGLf3mfklDdh1zi3wi0LLdLWoak0P/jqPQOu3M+S50sDHIK6Rd8tlqwfgmzlqk0xSSDm gEKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=q4/NoU6qlMn8d3Oh5+eGUIXnEv2RQDzN/vMlFJTD6nM=; b=cr4nPVOVxywU/JqU99z1IsozI6lz5ZZAawM+6p+WwaNZNIpU3NWwmAdHUH3miWVpl7 t98bxuR0YiLEED68htTXtFu6CY4YSavDwkJCFVDT7t6GC+L1H/v712lUI9u6EV1p4qCO e6PYyHR9KSjnhicqiEfB4DOMVkQNzOUs2nrbU3Gm+dl0+2lTSEeRkMra2oueERPberI4 iZTZ5HPVw7JW8b7IcmBn5szkI1mwl/Op7/wOtbCfbwwG0SQwZgA1krAaLA5byGKm27PA 7KtcACGgAkBDm6JI6RqysNjz0BLYvrmfosLGD4o2CxJekwyO5U3DvmI9JTAncP+7CUJv zM7g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b7-20020a17090a550700b0022998516fd7si4164189pji.179.2023.01.27.03.31.58; Fri, 27 Jan 2023 03:32:10 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233585AbjA0Lbq (ORCPT + 99 others); Fri, 27 Jan 2023 06:31:46 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43944 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233493AbjA0LbV (ORCPT ); Fri, 27 Jan 2023 06:31:21 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 24EA27C724; Fri, 27 Jan 2023 03:29:53 -0800 (PST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5829F1570; Fri, 27 Jan 2023 03:30:27 -0800 (PST) Received: from e122027.cambridge.arm.com (e122027.cambridge.arm.com [10.1.35.16]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 44C4A3F64C; Fri, 27 Jan 2023 03:29:42 -0800 (PST) From: Steven Price To: kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Steven Price , Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Suzuki K Poulose , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev Subject: [RFC PATCH 01/28] arm64: RME: Handle Granule Protection Faults (GPFs) Date: Fri, 27 Jan 2023 11:29:05 +0000 Message-Id: <20230127112932.38045-2-steven.price@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230127112932.38045-1-steven.price@arm.com> References: <20230127112248.136810-1-suzuki.poulose@arm.com> <20230127112932.38045-1-steven.price@arm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756175144888205988?= X-GMAIL-MSGID: =?utf-8?q?1756175144888205988?= If the host attempts to access granules that have been delegated for use in a realm these accesses will be caught and will trigger a Granule Protection Fault (GPF). A fault during a page walk signals a bug in the kernel and is handled by oopsing the kernel. A non-page walk fault could be caused by user space having access to a page which has been delegated to the kernel and will trigger a SIGBUS to allow debugging why user space is trying to access a delegated page. Signed-off-by: Steven Price --- arch/arm64/mm/fault.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 596f46dabe4e..fd84be115657 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -756,6 +756,25 @@ static int do_tag_check_fault(unsigned long far, unsigned long esr, return 0; } +static int do_gpf_ptw(unsigned long far, unsigned long esr, struct pt_regs *regs) +{ + const struct fault_info *inf = esr_to_fault_info(esr); + + die_kernel_fault(inf->name, far, esr, regs); + return 0; +} + +static int do_gpf(unsigned long far, unsigned long esr, struct pt_regs *regs) +{ + const struct fault_info *inf = esr_to_fault_info(esr); + + if (!is_el1_instruction_abort(esr) && fixup_exception(regs)) + return 0; + + arm64_notify_die(inf->name, regs, inf->sig, inf->code, far, esr); + return 0; +} + static const struct fault_info fault_info[] = { { do_bad, SIGKILL, SI_KERNEL, "ttbr address size fault" }, { do_bad, SIGKILL, SI_KERNEL, "level 1 address size fault" }, @@ -793,11 +812,11 @@ static const struct fault_info fault_info[] = { { do_alignment_fault, SIGBUS, BUS_ADRALN, "alignment fault" }, { do_bad, SIGKILL, SI_KERNEL, "unknown 34" }, { do_bad, SIGKILL, SI_KERNEL, "unknown 35" }, - { do_bad, SIGKILL, SI_KERNEL, "unknown 36" }, - { do_bad, SIGKILL, SI_KERNEL, "unknown 37" }, - { do_bad, SIGKILL, SI_KERNEL, "unknown 38" }, - { do_bad, SIGKILL, SI_KERNEL, "unknown 39" }, - { do_bad, SIGKILL, SI_KERNEL, "unknown 40" }, + { do_gpf_ptw, SIGKILL, SI_KERNEL, "Granule Protection Fault at level 0" }, + { do_gpf_ptw, SIGKILL, SI_KERNEL, "Granule Protection Fault at level 1" }, + { do_gpf_ptw, SIGKILL, SI_KERNEL, "Granule Protection Fault at level 2" }, + { do_gpf_ptw, SIGKILL, SI_KERNEL, "Granule Protection Fault at level 3" }, + { do_gpf, SIGBUS, SI_KERNEL, "Granule Protection Fault not on table walk" }, { do_bad, SIGKILL, SI_KERNEL, "unknown 41" }, { do_bad, SIGKILL, SI_KERNEL, "unknown 42" }, { do_bad, SIGKILL, SI_KERNEL, "unknown 43" },