Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp46679pxb; Mon, 13 Sep 2021 12:31:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyI0Fv9uozg1KQzgHtuwDnyFVFQJD0fyUZpqS6UIR5vHuEp4a50htU/9QIeOfnRg0DEbbYW X-Received: by 2002:a17:906:a24d:: with SMTP id bi13mr14523840ejb.481.1631561518459; Mon, 13 Sep 2021 12:31:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631561518; cv=none; d=google.com; s=arc-20160816; b=XIq+3TOOmbOR7n5GQhsjTA0cgKZZWZu1lCTZZwwFKGNZjrW1ESNCab6BNJB0fzG6NK 7je1deJ0J2VJ5cNrtj2121WlBeePIE1tn8fPuQimU2xK3bf/+h0Fmfw8gzJRh494bmvK 0DGYBpSmHNfyyeDERhYlMYuY7FrPu5kFG54TYWQVVYH9zHwYdciZ4GDra1I88+5BYGDi 2PBskJEig0HdxKUpgRGjdupKiV/tfZGbMYTo0Xg52mZiIasUkPv+qfYsiJYiRRpJuzPF n4d7z7I4xVGIa+JQX4hQE7NT5T/ANWFOCuzVAwE7LCSR28CD5XCvM+INvOL1+6XPZOYW NqTg== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=jopUG/SeHEA5uFt+5nsm8OgDT6Paq3esorxxG0kXYPs=; b=L5GZ28AkfaHLxbzJhc3D/OGeoYAWrdlbf5qHsXF3ONqIAmdXbHxw6o3hcZjrQAppsa i4vRPJ5JCpX85Ib7ukEwFSlZdWOMToruLwfXK8J0E8g/9yxQb1pYsccdINuqz9t115AL sugrNuaoRc6n5y8k7aMUOZ29fFveFAnRa1xGO3l7SGMDAgUM7szBjf11Yg0WxDTD+e8o K4rOdpazTcJsP31zPirTahDkuRGGkmdZP3Sa3MyrgfHkDhxDBkxoxEL95R1nL8NKibL/ t4V4Tyj1dGFE6KKUZrVL1CizOL3A7v4hFSN4G7JJKxViSbQFLepcm9oQowFVREwYFRMR aF7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=lqMdu8WL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d23si7759067eds.175.2021.09.13.12.31.34; Mon, 13 Sep 2021 12:31:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=lqMdu8WL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242569AbhIMNgs (ORCPT + 99 others); Mon, 13 Sep 2021 09:36:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:53278 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242453AbhIMNbe (ORCPT ); Mon, 13 Sep 2021 09:31:34 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id A9EF66121E; Mon, 13 Sep 2021 13:25:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1631539526; bh=hwfcFQGt+j1oFzGL5KVR9/sCTRm6IadwUzw7D15jG0E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lqMdu8WLQmj7K84pGtjQrJpdcxHVmkCsl+RBIYYkqrscMACnODiuwXUKBidbvX9CR ZOKSRa2Bs14B7f7HaOo8VTUjv1w432Ph9Bv9RmrRQUErT9cIVsncFh3DUdpiaC9tyc M0+wfjMfCsO2BgvKL6qwBYYtjNk4pa4PokEPKpQg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alexandru Elisei , Chen-Yu Tsai , Marc Zyngier , Sasha Levin Subject: [PATCH 5.10 057/236] irqchip/gic-v3: Fix priority comparison when non-secure priorities are used Date: Mon, 13 Sep 2021 15:12:42 +0200 Message-Id: <20210913131102.299837371@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210913131100.316353015@linuxfoundation.org> References: <20210913131100.316353015@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Chen-Yu Tsai [ Upstream commit 8d474deaba2c4dd33a5e2f5be82e6798ffa6b8a5 ] When non-secure priorities are used, compared to the raw priority set, the value read back from RPR is also right-shifted by one and the highest bit set. Add a macro to do the modifications to the raw priority when doing the comparison against the RPR value. This corrects the pseudo-NMI behavior when non-secure priorities in the GIC are used. Tested on 5.10 with the "IPI as pseudo-NMI" series [1] applied on MT8195. [1] https://lore.kernel.org/linux-arm-kernel/1604317487-14543-1-git-send-email-sumit.garg@linaro.org/ Fixes: 336780590990 ("irqchip/gic-v3: Support pseudo-NMIs when SCR_EL3.FIQ == 0") Reviewed-by: Alexandru Elisei Signed-off-by: Chen-Yu Tsai [maz: Added comment contributed by Alex] Signed-off-by: Marc Zyngier Link: https://lore.kernel.org/r/20210811171505.1502090-1-wenst@chromium.org Signed-off-by: Sasha Levin --- drivers/irqchip/irq-gic-v3.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index 1005b182bab4..1bdb7acf445f 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -100,6 +100,27 @@ EXPORT_SYMBOL(gic_pmr_sync); DEFINE_STATIC_KEY_FALSE(gic_nonsecure_priorities); EXPORT_SYMBOL(gic_nonsecure_priorities); +/* + * When the Non-secure world has access to group 0 interrupts (as a + * consequence of SCR_EL3.FIQ == 0), reading the ICC_RPR_EL1 register will + * return the Distributor's view of the interrupt priority. + * + * When GIC security is enabled (GICD_CTLR.DS == 0), the interrupt priority + * written by software is moved to the Non-secure range by the Distributor. + * + * If both are true (which is when gic_nonsecure_priorities gets enabled), + * we need to shift down the priority programmed by software to match it + * against the value returned by ICC_RPR_EL1. + */ +#define GICD_INT_RPR_PRI(priority) \ + ({ \ + u32 __priority = (priority); \ + if (static_branch_unlikely(&gic_nonsecure_priorities)) \ + __priority = 0x80 | (__priority >> 1); \ + \ + __priority; \ + }) + /* ppi_nmi_refs[n] == number of cpus having ppi[n + 16] set as NMI */ static refcount_t *ppi_nmi_refs; @@ -687,7 +708,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs return; if (gic_supports_nmi() && - unlikely(gic_read_rpr() == GICD_INT_NMI_PRI)) { + unlikely(gic_read_rpr() == GICD_INT_RPR_PRI(GICD_INT_NMI_PRI))) { gic_handle_nmi(irqnr, regs); return; } -- 2.30.2