From patchwork Fri Nov 11 09:06:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bhupinder Thakur X-Patchwork-Id: 81797 Delivered-To: patch@linaro.org Received: by 10.140.97.165 with SMTP id m34csp1166280qge; Fri, 11 Nov 2016 01:09:14 -0800 (PST) X-Received: by 10.107.201.209 with SMTP id z200mr10493874iof.220.1478855354429; Fri, 11 Nov 2016 01:09:14 -0800 (PST) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id 134si5996537itw.6.2016.11.11.01.09.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Nov 2016 01:09:14 -0800 (PST) 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; dkim=neutral (body hash did not verify) header.i=@linaro.org; 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; dmarc=fail (p=NONE dis=NONE) header.from=linaro.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 1c57nU-0004cw-CY; Fri, 11 Nov 2016 09:06:56 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c57nT-0004cq-6A for xen-devel@lists.xenproject.org; Fri, 11 Nov 2016 09:06:55 +0000 Received: from [85.158.143.35] by server-7.bemta-6.messagelabs.com id 65/13-21485-E2A85285; Fri, 11 Nov 2016 09:06:54 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprEIsWRWlGSWpSXmKPExsVyMfTASl3dLtU Ig/89ehbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8bvr+vZCzapVhz5/4ypgfGJTBcjF4eQwAxG iYnP57KBOCwC7cwSv5fNZwRxJATesUhcePOZvYuRE8iJkfj+6yYrhF0l0fTiKhOILSSgJXH01 GxWiFGtTBIdt24CdXNwsAmYSMzqkACpERFQkri3ajJYPbNAqMS/Z23sICXCAmYSb95rg4RZBF QlOi9PACvhFfCWWLHvItRaOYmb5zqZJzDyLWBkWMWoXpxaVJZapGukl1SUmZ5RkpuYmaNraGC ml5taXJyYnpqTmFSsl5yfu4kRGCYMQLCDcdlfp0OMkhxMSqK8+U2qEUJ8SfkplRmJxRnxRaU5 qcWHGGU4OJQkePd0AOUEi1LTUyvSMnOAAQuTluDgURLhvQiS5i0uSMwtzkyHSJ1itOR49eHFA yaON7teAsmODx8eMAmx5OXnpUqJ864FaRAAacgozYMbB4uqS4yyUsK8jEAHCvEUpBblZpagyr 9iFOdgVBLmfQQyhSczrwRu6yugg5iADpoRpwJyUEkiQkqqgTFJt8O1NvPw00XHRKbeN7875dv +P9ue3f0wK/Wg+iXf2+JM6pM2hZv7hVnOkM0/rzVZ8nngzKQ1GjNLOTg0Gs8p9Js8mXLWz/zD 1xlVP6Xf5tUwOCcsMvz6WXDeos98cz6m/RGf2TKb63TkoisVVfnH/r5qOpaw4c075sNsbEcUJ ZMOmLFaHWVTYinOSDTUYi4qTgQAYnVXc6UCAAA= X-Env-Sender: bhupinder.thakur@linaro.org X-Msg-Ref: server-13.tower-21.messagelabs.com!1478855212!42821986!1 X-Originating-IP: [209.85.192.169] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.0.16; banners=-,-,- X-VirusChecked: Checked Received: (qmail 42367 invoked from network); 11 Nov 2016 09:06:53 -0000 Received: from mail-pf0-f169.google.com (HELO mail-pf0-f169.google.com) (209.85.192.169) by server-13.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 11 Nov 2016 09:06:53 -0000 Received: by mail-pf0-f169.google.com with SMTP id i88so8913023pfk.2 for ; Fri, 11 Nov 2016 01:06:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=N4cruAt7TGwSuVo9+XG0Qsbp3B4swNRBgNH2VR83TNA=; b=DXB2qGiPMj7SxfSLiIVWebF3LiIgUwFs0Dm3Hiyhy9F3aRvonPK+5vMB0LjfN3Dy6o 2hm7X3xJhAvJlvVPbDNCPiBb7G9CpeVkVIdT8ulEDLDqB2+Vm3A+/oT8WnaULiGqaezh Ykz8pUABsNoWHL69/tGvcnzAQ3vckw/jHllGw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=N4cruAt7TGwSuVo9+XG0Qsbp3B4swNRBgNH2VR83TNA=; b=kaWH8yHpdc9AXdxGspGzvBSSLEUuLHXdmgOeLzeMDBULTIYDGqyps53v6fSLIlv49g eSYHIAuLFmyg0G+1EwCECkWnlMDcVnkL9OBeZo7dGOljwVy4s+zKPYZBKsLc6T4FNsBC uZLl5YGqkTt0aqrGN5pHlOFAdvVbPcurLec1TRrQ3gOJSSby9NXeGV43ucz3MZjjd6qm QYrQCKONp1P9JO3CXF9gXr9D/JgACSxxaGGD/YrH8exgAyhYCNz3sgQBGNoAOfzwQzXp yJkNBx9Oz3yh+PiEVcALx7Qrk2PqYk2FU1gcGSfhkp0vbeo/R9nA9RChmBJsWEPMmL8S iHPg== X-Gm-Message-State: ABUngvdjeIqgLkKOiAPXLpfcIyk5BtWhZY1uUGPyCNNw74EZ1vj41KGAwmNvCKVJLzq4SnFK X-Received: by 10.99.39.132 with SMTP id n126mr43396146pgn.85.1478855212207; Fri, 11 Nov 2016 01:06:52 -0800 (PST) Received: from blr-ubuntu-linaro.wlan.qualcomm.com ([202.46.23.54]) by smtp.gmail.com with ESMTPSA id v82sm10193505pfi.6.2016.11.11.01.06.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 11 Nov 2016 01:06:51 -0800 (PST) From: Bhupinder Thakur To: xen-devel@lists.xenproject.org Date: Fri, 11 Nov 2016 14:36:46 +0530 Message-Id: <1478855206-19185-1-git-send-email-bhupinder.thakur@linaro.org> X-Mailer: git-send-email 2.7.4 Cc: Julien Grall , Stefano Stabellini Subject: [Xen-devel] [PATCH] xen/arm: Add support for 16 bit VMIDs 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" VMID space is increased to 16-bits from 8-bits in ARMv8 8.1 revision. This allows more than 256 VMs to be supported by Xen. This change adds support for 16-bit VMIDs in Xen based on whether the architecture supports it. Signed-off-by: Bhupinder Thakur --- xen/arch/arm/p2m.c | 44 +++++++++++++++++++++++++++++++++++------ xen/include/asm-arm/p2m.h | 2 +- xen/include/asm-arm/processor.h | 17 +++++++++++++++- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index cc5634b..6ed7e5c 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -19,6 +19,7 @@ static unsigned int __read_mostly p2m_root_order; static unsigned int __read_mostly p2m_root_level; #define P2M_ROOT_ORDER p2m_root_order #define P2M_ROOT_LEVEL p2m_root_level +static unsigned int __read_mostly max_vmid; #else /* First level P2M is alway 2 consecutive pages */ #define P2M_ROOT_LEVEL 1 @@ -1219,7 +1220,7 @@ static int p2m_alloc_table(struct domain *d) p2m->root = page; - p2m->vttbr = page_to_maddr(p2m->root) | ((uint64_t)p2m->vmid & 0xff) << 48; + p2m->vttbr = page_to_maddr(p2m->root) | ((uint64_t)p2m->vmid << 48); /* * Make sure that all TLBs corresponding to the new VMID are flushed @@ -1230,20 +1231,47 @@ static int p2m_alloc_table(struct domain *d) return 0; } -#define MAX_VMID 256 +#ifdef CONFIG_ARM_64 +#define MAX_VMID (1UL << 16) +#else +#define MAX_VMID (1UL << 8) +#endif + #define INVALID_VMID 0 /* VMID 0 is reserved */ static spinlock_t vmid_alloc_lock = SPIN_LOCK_UNLOCKED; /* - * VTTBR_EL2 VMID field is 8 bits. Using a bitmap here limits us to - * 256 concurrent domains. + * VTTBR_EL2 VMID field is 8 or 16 bits. Aarch64 supports 16-bit VMID. + * Using a bitmap here limits us to 256 or 65536 (for Aarch64) concurrent + * domains. */ static DECLARE_BITMAP(vmid_mask, MAX_VMID); void p2m_vmid_allocator_init(void) { + unsigned int cpu; + set_bit(INVALID_VMID, vmid_mask); + + max_vmid = MAX_VMID; + +#ifdef CONFIG_ARM_64 + /* + * if any cpu does not support 16-bit VMID then restrict the + * max VMIDs which can be allocated to 256 + */ + for_each_online_cpu ( cpu ) + { + const struct cpuinfo_arm *info = &cpu_data[cpu]; + + if ( info->mm64.vmid_bits != VMID_16_BITS_SUPPORT ) + { + max_vmid = (1UL << 8); + break; + } + } +#endif } static int p2m_alloc_vmid(struct domain *d) @@ -1254,11 +1282,11 @@ static int p2m_alloc_vmid(struct domain *d) spin_lock(&vmid_alloc_lock); - nr = find_first_zero_bit(vmid_mask, MAX_VMID); + nr = find_first_zero_bit(vmid_mask, max_vmid); ASSERT(nr != INVALID_VMID); - if ( nr == MAX_VMID ) + if ( nr == max_vmid ) { rc = -EBUSY; printk(XENLOG_ERR "p2m.c: dom%d: VMID pool exhausted\n", d->domain_id); @@ -1646,6 +1674,10 @@ void __init setup_virt_paging(void) val |= VTCR_PS(pa_range); val |= VTCR_TG0_4K; + + /* set the VS bit only if 16 bit VMID is supported */ + if ( max_vmid == MAX_VMID ) + val |= VTCR_VS; val |= VTCR_SL0(pa_range_info[pa_range].sl0); val |= VTCR_T0SZ(pa_range_info[pa_range].t0sz); diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h index fdb6b47..bfcdbf1 100644 --- a/xen/include/asm-arm/p2m.h +++ b/xen/include/asm-arm/p2m.h @@ -30,7 +30,7 @@ struct p2m_domain { struct page_info *root; /* Current VMID in use */ - uint8_t vmid; + uint16_t vmid; /* Current Translation Table Base Register for the p2m */ uint64_t vttbr; diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h index 15bf890..4b6be3d 100644 --- a/xen/include/asm-arm/processor.h +++ b/xen/include/asm-arm/processor.h @@ -215,6 +215,7 @@ #define VTCR_PS(x) ((x)<<16) +#define VTCR_VS (_AC(0x1,UL)<<19) #endif #define VTCR_RES1 (_AC(1,UL)<<31) @@ -269,6 +270,11 @@ /* FSR long format */ #define FSRL_STATUS_DEBUG (_AC(0x22,UL)<<0) +#ifdef CONFIG_ARM_64 +#define VMID_8_BITS_SUPPORT 0x0 +#define VMID_16_BITS_SUPPORT 0x2 +#endif + #ifndef __ASSEMBLY__ struct cpuinfo_arm { @@ -337,7 +343,16 @@ struct cpuinfo_arm { unsigned long tgranule_64K:4; unsigned long tgranule_4K:4; unsigned long __res0:32; - }; + + unsigned long hafdbs:4; + unsigned long vmid_bits:4; + unsigned long vh:4; + unsigned long hpds:4; + unsigned long lo:4; + unsigned long pan:4; + unsigned long __res1:8; + unsigned long __res2:32; + }; } mm64; struct {