Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp212471imm; Fri, 21 Sep 2018 13:00:49 -0700 (PDT) X-Google-Smtp-Source: ANB0VdZRWhL/0D734xislMbKWjI+TbUfVC1G30LRBjpAeYVj9cOOZxwu8mHCpXXZNEFvReQvVTh0 X-Received: by 2002:a62:205d:: with SMTP id g90-v6mr22137341pfg.253.1537560049597; Fri, 21 Sep 2018 13:00:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537560049; cv=none; d=google.com; s=arc-20160816; b=to80vGINp3v8neO6DINqMEAuFiP/svZCbJ/E6NPBLTx/+BUIvA6l9gqNmrdP2EuScg 8wwlxnnWMNYQSpXuSJGcD/swFUOgC8mE8Xzqnib53uIt9u/fAE5Qk4XAmy/SSdWZl52q hEwaJv/1jCCIBLrHzLcGeRZJepM61S1nAG6Nh98RQUBOhBq0QImvpG0YZAVQKpBr2NIQ Qu6Vf0wTgJsm3OlHVtiVw/C1MUmc5MHJPHjEMmbvFI+aJTQJxAfQh2WQARP+2pvjXS3l E5n+Zb39+1isMaAa1kWREWqhDpRGJTADqg312s965VL+uxWDWw/LJFn1JfhnZiYyuhAT zrfg== 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; bh=sXroTDAXjETqgSaKAw/1rHxHCxzEx/K8FTOeOrvNf/0=; b=Tyfvhk8jIbzzAsKb5u2gRynyPBHESG8YtzOVVGFMxpETVjDQ1gMTXaP0MWxL1vxdgd LhQEs1KULYZWPONO2jCXHbqXTaPXcxN98flyD4bttUawFH5PPSvt5P3eLG2HZxS0tLkq 8IT8hS+hse6Q+B9N9+6acxGM/1JgW0YqDKEt+BxZw89dRbifMStKnKDjqfoQHMbqi+XR e/z9C8hSp+p6S7HZKO0lec8qaTtBgwiKEEzyDsyufnrai+myarZj01DmI8yjHy9RvWdj 0MeE+Xh2g/42HKZHBK+6BShf5KwNolaJe18qdN7uysiuTmVW7D3IV+DV7GNSsHTqWG9j IxWQ== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 3-v6si29861135plh.207.2018.09.21.13.00.33; Fri, 21 Sep 2018 13:00: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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391505AbeIVBur (ORCPT + 99 others); Fri, 21 Sep 2018 21:50:47 -0400 Received: from foss.arm.com ([217.140.101.70]:41366 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2391477AbeIVBuq (ORCPT ); Fri, 21 Sep 2018 21:50:46 -0400 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 5216719BF; Fri, 21 Sep 2018 13:00:22 -0700 (PDT) Received: from localhost.localdomain (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 075343F5BD; Fri, 21 Sep 2018 13:00:22 -0700 (PDT) From: Marc Zyngier To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Ard Biesheuvel , Jeremy Linton , Jeffrey Hugo , Thomas Gleixner , Jason Cooper Subject: [PATCH 10/10] irqchip/gic-v3-its: Allow use of LPI tables in reserved memory Date: Fri, 21 Sep 2018 20:59:54 +0100 Message-Id: <20180921195954.21574-11-marc.zyngier@arm.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180921195954.21574-1-marc.zyngier@arm.com> References: <20180921195954.21574-1-marc.zyngier@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If the LPI tables have been reserved with the EFI reservation mechanism, we assume that these tables are safe to use even when we find the redistributors to have LPIs enabled at boot time, meaning that kexec can now work with GICv3. You're welcome. Signed-off-by: Marc Zyngier --- drivers/irqchip/irq-gic-v3-its.c | 43 ++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 4912dc57bf07..0235b69160bc 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -1629,6 +1630,33 @@ static void its_free_prop_table(struct page *prop_page) get_order(LPI_PROPBASE_SZ)); } +static bool gic_check_reserved_range(phys_addr_t addr, unsigned long size) +{ + phys_addr_t start, end, addr_end; + u64 i; + + /* + * We don't bother checking for a kdump kernel as by + * construction, the LPI tables are out of this kernel's + * memory map. + */ + if (is_kdump_kernel()) + return true; + + addr_end = addr + size - 1; + + for_each_reserved_mem_region(i, &start, &end) { + if (addr >= start && addr_end <= end) + return true; + } + + /* Not found, not a good sign... */ + pr_warn("GICv3: Expected reserved range [%pa:%pa], not found\n", + &addr, &addr_end); + add_taint(TAINT_CRAP, LOCKDEP_STILL_OK); + return false; +} + static int gic_reserve_range(phys_addr_t addr, unsigned long size) { if (efi_enabled(EFI_CONFIG_TABLES)) @@ -1976,15 +2004,19 @@ static void its_free_pending_table(struct page *pt) } /* - * Booting with kdump and LPIs enabled is generally fine. + * Booting with kdump and LPIs enabled is generally fine. Any other + * case is wrong in the absence of firmware/EFI support. */ static bool enabled_lpis_allowed(void) { - /* Allow a kdump kernel */ - if (is_kdump_kernel()) - return true; + phys_addr_t addr; + u64 val; - return false; + /* Check whether the property table is in a reserved region */ + val = gicr_read_propbaser(gic_data_rdist_rd_base() + GICR_PROPBASER); + addr = val & GENMASK_ULL(51, 12); + + return gic_check_reserved_range(addr, LPI_PROPBASE_SZ); } static int __init allocate_lpi_tables(void) @@ -2052,6 +2084,7 @@ static void its_cpu_init_lpis(void) paddr = gicr_read_pendbaser(rbase + GICR_PENDBASER); paddr &= GENMASK_ULL(51, 16); + WARN_ON(!gic_check_reserved_range(paddr, LPI_PENDBASE_SZ)); its_free_pending_table(gic_data_rdist()->pend_page); gic_data_rdist()->pend_page = NULL; -- 2.18.0