From nobody Fri Oct 31 04:31:07 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=valinux.co.jp); dmarc=pass(p=none dis=none) header.from=valinux.co.jp ARC-Seal: i=2; a=rsa-sha256; t=1751725680; cv=pass; d=zohomail.com; s=zohoarc; b=QNVF4+yJiyMGSRicfAqedLCKHGOjpx5qN66CKs6J+LD3605wDoCbK5r+SXvmURCvlO78Xj7xp2h7lZ1QNZT9QflKDjmOcFFNmBVUfO72NwzHSI4KYl3PHCsDP9E83RuAOT3Lcu3ZJxYOPFGvFHmX2OmMjn23piTaqQoc3ji4gZo= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1751725680; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Nnrprq8cKz+z61aN0ctsSnuccFtU6U8bKDUu7U3f/8M=; b=A8PXzmIWBNgX66+mCK1YxSZ3RII95fLDGiCB/CFApxZjwFimJ5eETWgrnik64FPGRYnSMzis3IPRZNk+jRRlz5mvJVoyxVy6tSbBuj0jOUH4y/B3MDlsBTMLqpl42hOnHLR6lswkwI8JWkLV+1/UnxU9PePewj8HbXB4bb7S3zM= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=valinux.co.jp); dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 17517256805193.9494217797199553; Sat, 5 Jul 2025 07:28:00 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1034241.1407163 (Exim 4.92) (envelope-from ) id 1uY3rW-0006Dv-3x; Sat, 05 Jul 2025 14:27:30 +0000 Received: by outflank-mailman (output) from mailman id 1034241.1407163; Sat, 05 Jul 2025 14:27:30 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1uY3rV-0006Dl-VJ; Sat, 05 Jul 2025 14:27:29 +0000 Received: by outflank-mailman (input) for mailman id 1034241; Sat, 05 Jul 2025 14:27:28 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1uY3rU-00055Q-2R for xen-devel@lists.xenproject.org; Sat, 05 Jul 2025 14:27:28 +0000 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazlp170110002.outbound.protection.outlook.com [2a01:111:f403:c405::2]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 2c603b62-59ac-11f0-a315-13f23c93f187; Sat, 05 Jul 2025 16:27:26 +0200 (CEST) Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) by TYWP286MB1974.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:165::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8901.24; Sat, 5 Jul 2025 14:27:22 +0000 Received: from OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a]) by OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM ([fe80::80f1:db56:4a11:3f7a%5]) with mapi id 15.20.8901.023; Sat, 5 Jul 2025 14:27:22 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 2c603b62-59ac-11f0-a315-13f23c93f187 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ys7ouQXjJukv5QFgSsrYD8Rh9azgdrgel6H+KjBChBdstfXDahAUKhthz3az5kTaS8ZfvGJvnX6AR1zhybreIiytN/YAx1yW/UbQwaacDwThjHb0wSjaqYx5LdeeDf8bl/Wq5PPi+PlLM1LnuZ+Zh33/o5y75vPA16kfuc42hnSbuH0H+zYCbzW8YgjA3dO/5FI347MgvKSSJzBmo3DBReJpEx0+okfUGwzHxbpIrVDtduZfzRK1HC1KG9XqhvrVgQtC79ctriVyGL6n/0DKZMkPyr2CabfHu9kcBooO2hUh6RhxO55LQ30ySHxpgSzdnnIon8VNgGxtltkHCP8MMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Nnrprq8cKz+z61aN0ctsSnuccFtU6U8bKDUu7U3f/8M=; b=Z8xwkc6rTSD2/xS5HwJCL7jjZNG6zR980hFIdCclrCk4nZ9YNppg5fZAVW03Q0lxxQiNbad5Th7+tXFUSy4nX+iuks5iPyIvGJw/HwaN1qnNZv52NRLrNhbNxcCDGnHIOONuQQ6nQz/xbp21cahi7hmKTf6dqZW9kSw3FWSpQzBkgwUDe8gnhegmY0+rNrRm2k/2oj+sWse6BQzrqIHQP9gQAM17c5pvrMcyn+W8OyYMPG9gg+l7b0XTM+FICfSJcJQuyE6IdPcq8HVHahNgjzqoUKuW2uyvhp6tjtQYFC3W0LhKU50nX99EX/QM0pLEW201/AekVF4M9WRnXFM/+Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Nnrprq8cKz+z61aN0ctsSnuccFtU6U8bKDUu7U3f/8M=; b=ZtUSqfZyS316wF45bG7OmzgtLLiqvZ4ByYUZof+A72gfE7yryuLGSoyBJgaC2kBwKmGcA1sOm7SGTnaJfDh6HWyMGbocy+alhhcARhTao6zK9GRFrtcBeC/8jZZ/ysiDKor4pukusU2QbKXoq+xvWe+18udxhvZv2i+ugMDmO0k= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; From: Koichiro Den To: xen-devel@lists.xenproject.org Cc: Koichiro Den , Anthony PERARD , Juergen Gross , Andrew Cooper , Michal Orzel , Jan Beulich , Julien Grall , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= , Stefano Stabellini , Bertrand Marquis , Volodymyr Babchuk Subject: [PATCH v2 5/5] xen/arm: Support ARM standard PV time for domains created via toolstack Date: Sat, 5 Jul 2025 23:27:03 +0900 Message-ID: <20250705142703.2769819-6-den@valinux.co.jp> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250705142703.2769819-1-den@valinux.co.jp> References: <20250705142703.2769819-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0077.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b3::9) To OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:10d::7) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OS3P286MB0979:EE_|TYWP286MB1974:EE_ X-MS-Office365-Filtering-Correlation-Id: 4e0c3ca5-72a8-4c0d-2ec1-08ddbbd00e12 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|10070799003|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?d2kAyN3UUiVqQngOtNUdEtfvxACZeEVJDX8MUwuhX9oBnbPTXF3oxIpXtaOn?= =?us-ascii?Q?SNZF6wLXoX46FiGPxALymdmDszxqKpysi+YbSz1vU4j7L5caFRdx8YIDH4cS?= =?us-ascii?Q?CfomUXtswu5IkUwLalCf+AEyGMu7GbrZW38uVyDs02+FJqzbAGwPMzoFFicj?= =?us-ascii?Q?Q1zeiOgEBnx8OwzLp9i+at9hEsMeOyQ9npCtI6u+IOzfwaNfUCWBMDWNaTEC?= =?us-ascii?Q?u9DKRFFtkRPKc462gFNNifUxJFn+UTzUYCZkZGJo+WrOr+YLM8UVu2QpZMjs?= =?us-ascii?Q?24GwG7kXNdj6lgNT/r1bLQMaejOIHvUzcm/E0MKRSNTjeLyRxsJlXt15EDHj?= =?us-ascii?Q?enMfXQnKEIRrghgSyjYXdCsJuyzjhD9sRRfnMZrl0c9U+zMsH2Yani9sQBrF?= =?us-ascii?Q?87BMBhLzK/31aIX1OLdk6JdzqiF3oUQfyUG2+evoZ/xEzloY8VMl8EvppT+z?= =?us-ascii?Q?703GAi91iqQd/bc6wYNXPUN1wFoJRIPdSQBssIZNCfXJ3r3MVCdWsFjoBi7n?= =?us-ascii?Q?tXiLjGLcIcD4nykm+xDajy3BjEmIRwnhGRvyQ1kcBo97xkU6tZdrRKkM2c7/?= =?us-ascii?Q?5yFC3htN9ercCFCzdTF676b8jSLrh+m4Iycj7XLtheykloSZXxMyhAx2oq3+?= =?us-ascii?Q?ix9ousvLVY+HTrL9UKPfyAbub+7TQNPkxv1+T6HcWZzHeP/JYDHsPQstw9Au?= =?us-ascii?Q?KVZO5/kmvqtqTcxkaY7Wv3fmtd64Mpqi+7nxvRrmIRKrvGJiWwdRplxfwdEg?= =?us-ascii?Q?UZyqeXq2N9RTeO4CnHXrnN24UtTt2y08RAXP84YnZisI/N9WN/vAbcrLQBbb?= =?us-ascii?Q?ZDGdsG4RsWoiHhL6qDbfuriesXb5bqFxKkp7Z6jie0YDy/e/7QSn886N5G+Y?= =?us-ascii?Q?0yKg6ZEj//WvIgHGd52Nyd8SJInhxKkmShYbB4OXn9ZRxipnC8qEbwuH2bj9?= =?us-ascii?Q?4TS5fWDseI4H848TuDNRE5NPpG6wAF4PeGtwi3XOX6exYXIzN1o8II9HLIUh?= =?us-ascii?Q?GXUprhKxbWSKKRWbbJw/7UeGcl2p2he7KRXLheEcTj0R5ZSv4tL6JREg6xdn?= =?us-ascii?Q?hJQ1pT0NVGERv2mIwqbqqntFr4/Nx6NmZswEvycrIAQcZYE5itb618StDcuy?= =?us-ascii?Q?s4Jo3l5PEXSdXH9uLoHwD8nHkDF+9m87Y/qshwGlVtVMB0C9Y1s8UIjI0tP4?= =?us-ascii?Q?21z9BYZ6nTpJpNQKlb/WqowjZ7DN87Vn8moDdXPqbR+qZ9Fugfmy88EJSEZC?= =?us-ascii?Q?GTII6fMfGIsb7pY1ry86kJBhDjf129oOIfC1MMOumrXAgMBsMPFHqGzpwmIY?= =?us-ascii?Q?Mx26bsmprcIGs8MU0tq0kDpNRPNmYEQw7E+pWZ6TyLXxiN4CL/OSY/rjkCZS?= =?us-ascii?Q?G1I05Ee5RlX2TnafSH55wOs8b5FQR36z4bjfqZPJeG6TGGNfiQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(10070799003)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?VInN9cuWmqw/hGEJmcHBTZURivVpx3b+12ANScVUCG8i3Z1zvymcAs4WrNB9?= =?us-ascii?Q?2SmAjfuS/CMTcXsE4s6V2Iji3e/tv9lpTusFtCF9fKS0c4YcojempYoP+2d8?= =?us-ascii?Q?1bFpjGASszEJ0Z5qEjfbw1TQvhKWKSONTb+CxaPZ8BWYN7fZl71Xjw3fXNuc?= =?us-ascii?Q?Y6mNHAcNxHBSvmjLuHSfkaD0fTCW4cdmgv931Uy9zYFTOlBO4C7QSC2yRSW/?= =?us-ascii?Q?4u+gcJIcKufL8/3mJc9sJDUirzDnmSqcw/QYsRYhIIXNbI0e9KlaP7d2djCQ?= =?us-ascii?Q?gbx1/O1ko0bX7q/u4rlsUmpYuK0fuKQuMlUjCflrNwoTxS3429xIFRjpxWyj?= =?us-ascii?Q?E0URvcxTIgHDmSdSZQPAEDMo/+qkHkshnAfVUyntl64KIxPXh+gYw3wuRJ4B?= =?us-ascii?Q?IuLhdGiBZY/CQ776n7gCq/UWxgw+maO4Vihd4BiSAGm6bV2KRd9ZXVD31lMS?= =?us-ascii?Q?So3OyBEC0FqxmNTT6ZDDe8948d8TRNL2LE8BD7iDRCETMTu3/vxsNoTdEA0E?= =?us-ascii?Q?T7ftwZoRm+QOSOXtiRUFkF/AcKW8833NzCJmz704PRaEHEksZdtEhU+AYF8x?= =?us-ascii?Q?OIk6b5+eA8/A3itZkEfuFbwobBggSCJivXrqGLNC2P5HpJ5VUFmhFeO/F500?= =?us-ascii?Q?TY9y4+mwEb90xtNQszzz/9X0L+FlZgoipMFw+KNx6LOvnA8Z0T+eS1vFpxaP?= =?us-ascii?Q?4hVWq/lwBn7MjKVTJMmu1uAEEvZJibHJfI1atIDI8EnB1HOPkEFLH2vfwEXF?= =?us-ascii?Q?/qEIJc4D13ibiQBHGNgvYj1zTJ323iNC17fEXId9VRTEkZmxxSfuKmNUHPst?= =?us-ascii?Q?/b2Dk0xhr27rZ5eRZqlf4Ejpw3yK0RFRpS/l4K5vVHB7i41qWOo9fhqRMsdE?= =?us-ascii?Q?ekWIsK8nVMIeDiD/E7onm7wBt+7AV/eL70LCwO7mTnO+n4OSmZySPomvQ7lA?= =?us-ascii?Q?EWMhJUS4JMk9O6A1Rv9XVv3kAKFrIXRhUOLE+cv29F0ebXH4pb4WD1uPy3VL?= =?us-ascii?Q?JzfVnWDUQG0VGMkXt+f5WiV5+JKnuxlNhDk3o4UHb9+le3fzDY5iOm7+Kqpp?= =?us-ascii?Q?OMpkfdFeZCi1Gr/guspcrb2PkQSGt7e8bI1vpIJJ+efDxWTqfkKwSOzkgJHg?= =?us-ascii?Q?C1omkEFutWASUW4vsTSvOp29j0O0Ecl9XAec+xk2Y2kHY1vSGkxC+8W18NNU?= =?us-ascii?Q?IGnNtZGh+yiRCTbF/vcVJf/DOyNJwc/Ndz9bTh5F25kHnIxSNmjVVibUXsIJ?= =?us-ascii?Q?dP2/YVqSqN/WeBlhQ5us3TB9TG/MSYbWDzzKjkMLHv0Ifcj0bGiBlAZPXf4M?= =?us-ascii?Q?Wqz5Iuc0D6vtiV6gjC0TGm/XvZT8dSWzGGq7Lw4cA8BCqgE3k3V9CCOHLIu9?= =?us-ascii?Q?6KcQxNgwtl1Leax/7Iqb1dYLs1dA8inzFYTu2gpiJzlwjDYzTIP08aXnf1o7?= =?us-ascii?Q?HWyx/hr8vJLkRl/Su3A4+Ogv/79a3vCSI7JufWQKrZjTmKlToiZk8/Lzp5bC?= =?us-ascii?Q?QjSk4ACPu+YlqjXpnDsrrTTNZjIesbBsu0P/tHjDwmxhvZ/qS1RXz7eFLwJ8?= =?us-ascii?Q?FD16uwmmfx8KzcFoUJVZMNg3Ht2epAQmsvLWMaZlg3coUYQmvce9yDnBhe4O?= =?us-ascii?Q?ADdWQkJ0NSTLC24C41LvYkk=3D?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 4e0c3ca5-72a8-4c0d-2ec1-08ddbbd00e12 X-MS-Exchange-CrossTenant-AuthSource: OS3P286MB0979.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jul 2025 14:27:22.1140 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: OHNhY70+QhFJfRmtUesGYkVPllbh3LVagZW+u3pCZsarITwG+f8cCkMduGGReFH8h0FP0KKhTu+FX3QgxxJhvA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWP286MB1974 X-ZohoMail-DKIM: pass (identity @valinux.co.jp) X-ZM-MESSAGEID: 1751725681560116600 Content-Type: text/plain; charset="utf-8" Implement ARM DEN 0057A PV time support for domains created via the toolstack, utilizing the newly introduced XENMAPSPACE_pv_time. Signed-off-by: Koichiro Den --- tools/libs/light/libxl_arm.c | 185 ++++++++++++++++++++++++++++------- xen/arch/arm/mm.c | 14 +++ xen/include/public/memory.h | 1 + 3 files changed, 167 insertions(+), 33 deletions(-) diff --git a/tools/libs/light/libxl_arm.c b/tools/libs/light/libxl_arm.c index 4a19a8d22bdf..33251520c07a 100644 --- a/tools/libs/light/libxl_arm.c +++ b/tools/libs/light/libxl_arm.c @@ -684,6 +684,40 @@ static int make_memory_nodes(libxl__gc *gc, void *fdt, return 0; } =20 +static int make_resv_memory_node(libxl__gc *gc, void *fdt, + const struct xc_dom_image *dom) +{ + int res; + + if (strcmp(dom->guest_type, "xen-3.0-aarch64")) + /* + * The stolen time shared memory region for ARM DEN 0057A is curre= ntly + * the only user of /reserved-memory node when a domain is created= via + * the toolstack, and it requires both the hypervisor and the doma= in to + * be AArch64. + */ + return 0; + + res =3D fdt_begin_node(fdt, "reserved-memory"); + if (res) return res; + + res =3D fdt_property_cell(fdt, "#address-cells", GUEST_ROOT_ADDRESS_CE= LLS); + if (res) return res; + + res =3D fdt_property_cell(fdt, "#size-cells", GUEST_ROOT_SIZE_CELLS); + if (res) return res; + + /* reg 0 is a placeholder for PV time region */ + res =3D fdt_property_reg_placeholder(gc, fdt, GUEST_ROOT_ADDRESS_CELLS, + GUEST_ROOT_SIZE_CELLS, 1); + if (res) return res; + + res =3D fdt_end_node(fdt); + if (res) return res; + + return 0; +} + static int make_gicv2_node(libxl__gc *gc, void *fdt, uint64_t gicd_base, uint64_t gicd_size, uint64_t gicc_base, uint64_t gicc_size) @@ -1352,6 +1386,7 @@ next_resize: FDT( make_psci_node(gc, fdt) ); =20 FDT( make_memory_nodes(gc, fdt, dom) ); + FDT( make_resv_memory_node(gc, fdt, dom) ); =20 switch (info->arch_arm.gic_version) { case LIBXL_GIC_VERSION_V2: @@ -1519,6 +1554,9 @@ static void finalise_one_node(libxl__gc *gc, void *fd= t, const char *uname, =20 #define EXT_REGION_MIN_SIZE xen_mk_ullong(0x0004000000) /* 64MB */ =20 +/* As per ARM DEN 0057A, stolen time memory regions are 64-byte aligned */ +#define PV_REGIONS_PER_PAGE (XC_PAGE_SIZE / 64) + static int compare_iomem(const void *a, const void *b) { const libxl_iomem_range *x =3D a, *y =3D b; @@ -1530,24 +1568,92 @@ static int compare_iomem(const void *a, const void = *b) return 0; } =20 -static int finalize_hypervisor_node(libxl__gc *gc, - libxl_domain_build_info *b_info, - struct xc_dom_image *dom) +static int get_pv_region(libxl_domain_build_info *b_info, + struct xc_dom_image *dom, + uint64_t *start, uint64_t end, + uint64_t *region_base, uint64_t *region_size) +{ + unsigned int npages =3D DIV_ROUNDUP(b_info->max_vcpus, PV_REGIONS_PER_= PAGE); + unsigned int len =3D npages * XC_PAGE_SIZE; + uint32_t domid =3D dom->guest_domid; + xc_interface *xch =3D dom->xch; + unsigned long idx =3D 0; + uint64_t size; + int rc; + + if (*start >=3D end) + return -1; + size =3D end - *start; + if (size < len) + return -1; + + for (; npages; npages--, idx++) { + rc =3D xc_domain_add_to_physmap(xch, domid, XENMAPSPACE_pv_time, i= dx, + (*start >> XC_PAGE_SHIFT) + idx); + if (rc) + return rc; + } + + region_base[0] =3D *start; + region_size[0] =3D len; + *start +=3D len; + return 0; +} + +static void get_ext_region(uint64_t start, uint64_t end, uint64_t *region_= base, + uint64_t *region_size, unsigned int *nr_regions) +{ + uint64_t size; + + start =3D ALIGN_UP_TO_2MB(start); + if (start >=3D end) + return; + + size =3D end - start; + if (size < EXT_REGION_MIN_SIZE) + return; + + region_base[*nr_regions] =3D start; + region_size[*nr_regions] =3D size; + (*nr_regions)++; +} + +static int finalize_extra_regions(libxl__gc *gc, + libxl_domain_build_info *b_info, + struct xc_dom_image *dom) { void *fdt =3D dom->devicetree_blob; - uint64_t region_base[MAX_NR_EXT_REGIONS], region_size[MAX_NR_EXT_REGIO= NS]; - uint32_t regs[(GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS) * + + /* For extended regions */ + uint64_t ext_region_base[MAX_NR_EXT_REGIONS], ext_region_size[MAX_NR_E= XT_REGIONS]; + uint32_t ext_regs[(GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS) * (MAX_NR_EXT_REGIONS + 1)]; - be32 *cells =3D ®s[0]; + be32 *ext_cells =3D &ext_regs[0]; + int hyp_offset; + + /* For pv regions */ + uint64_t pv_region_base[1], pv_region_size[1]; + uint32_t pv_regs[GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS]; + be32 *pv_cells =3D &pv_regs[0]; + int resv_offset; + const uint64_t bankbase[] =3D GUEST_RAM_BANK_BASES; const uint64_t banksize[] =3D GUEST_RAM_BANK_SIZES; unsigned int i, j, len, nr_regions =3D 0; + bool pv_region_pending =3D true; libxl_dominfo info; - int offset, rc; + int rc; =20 - offset =3D fdt_path_offset(fdt, "/hypervisor"); - if (offset < 0) - return offset; + resv_offset =3D fdt_path_offset(fdt, "/reserved-memory"); + if (!strcmp(dom->guest_type, "xen-3.0-aarch64")) { + if (resv_offset < 0) + return resv_offset; + } else + pv_region_pending =3D false; + + hyp_offset =3D fdt_path_offset(fdt, "/hypervisor"); + if (hyp_offset < 0) + return hyp_offset; =20 rc =3D libxl_domain_info(CTX, &info, dom->guest_domid); if (rc) @@ -1572,8 +1678,7 @@ static int finalize_hypervisor_node(libxl__gc *gc, } unallocated; uint64_t unallocated_size =3D 0; =20 - unallocated.start =3D bankbase[i] + - ALIGN_UP_TO_2MB((uint64_t)dom->rambank_size[i] << XC_PAGE_SHIF= T); + unallocated.start =3D bankbase[i] + ((uint64_t)dom->rambank_size[i= ] << XC_PAGE_SHIFT); =20 unallocated.end =3D ~0ULL >> (64 - info.gpaddr_bits); unallocated.end =3D min(unallocated.end, bankbase[i] + banksize[i]= - 1); @@ -1581,7 +1686,7 @@ static int finalize_hypervisor_node(libxl__gc *gc, if (unallocated.end >=3D unallocated.start) unallocated_size =3D unallocated.end - unallocated.start + 1; =20 - if (unallocated_size < EXT_REGION_MIN_SIZE) + if (unallocated_size <=3D 0) continue; =20 /* Exclude iomem */ @@ -1605,14 +1710,14 @@ static int finalize_hypervisor_node(libxl__gc *gc, if (unallocated.start > unallocated.end) break; } else { - uint64_t size =3D iomem.start - unallocated.start; - - if (size >=3D EXT_REGION_MIN_SIZE) { - region_base[nr_regions] =3D unallocated.start; - region_size[nr_regions] =3D size; - nr_regions++; + if (pv_region_pending) { + rc =3D get_pv_region(b_info, dom, &unallocated.sta= rt, iomem.start, + pv_region_base, pv_region_size); + if (!rc) + pv_region_pending =3D false; } - + get_ext_region(unallocated.start, iomem.start, ext_reg= ion_base, + ext_region_size, &nr_regions); unallocated.start =3D iomem.end + 1; =20 if (unallocated.start > unallocated.end) @@ -1624,38 +1729,52 @@ static int finalize_hypervisor_node(libxl__gc *gc, if (unallocated.end >=3D unallocated.start && nr_regions < MAX_NR_EXT_REGIONS) { - uint64_t size =3D unallocated.end - unallocated.start + 1; - - if (size >=3D EXT_REGION_MIN_SIZE) { - region_base[nr_regions] =3D unallocated.start; - region_size[nr_regions] =3D size; - nr_regions++; + if (pv_region_pending) { + rc =3D get_pv_region(b_info, dom, &unallocated.start, unal= located.end, + pv_region_base, pv_region_size); + if (!rc) + pv_region_pending =3D false; } + get_ext_region(unallocated.start, unallocated.end, ext_region_= base, + ext_region_size, &nr_regions); } } =20 + if (!strcmp(dom->guest_type, "xen-3.0-aarch64")) { + if (pv_region_pending) { + LOG(ERROR, "The PV time region cannot be allocated, not enough= space"); + return ERROR_FAIL; + } + set_range(&pv_cells, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CEL= LS, + pv_region_base[0], pv_region_size[0]); + len =3D sizeof(pv_regs[0]) * (GUEST_ROOT_ADDRESS_CELLS + GUEST_ROO= T_SIZE_CELLS); + rc =3D fdt_setprop(fdt, resv_offset, "reg", pv_regs, len); + if (rc) + return rc; + } + /* * The region 0 for grant table space must be always present. If we ma= naged * to allocate the extended regions then insert them as regions 1...N. */ - set_range(&cells, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS, + set_range(&ext_cells, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS, GUEST_GNTTAB_BASE, GUEST_GNTTAB_SIZE); =20 for (i =3D 0; i < nr_regions; i++) { LOG(DEBUG, "Extended region %u: %#"PRIx64"->%#"PRIx64"", - i, region_base[i], region_base[i] + region_size[i] - 1); + i, ext_region_base[i], ext_region_base[i] + ext_region_size[i]= - 1); =20 - set_range(&cells, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CELLS, - region_base[i], region_size[i]); + set_range(&ext_cells, GUEST_ROOT_ADDRESS_CELLS, GUEST_ROOT_SIZE_CE= LLS, + ext_region_base[i], ext_region_size[i]); } =20 if (!nr_regions) LOG(WARN, "The extended regions cannot be allocated, not enough sp= ace"); =20 - len =3D sizeof(regs[0]) * (GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_= CELLS) * + len =3D sizeof(ext_regs[0]) * (GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_S= IZE_CELLS) * (nr_regions + 1); =20 - return fdt_setprop(fdt, offset, "reg", regs, len); + return fdt_setprop(fdt, hyp_offset, "reg", ext_regs, len); } =20 int libxl__arch_domain_finalise_hw_description(libxl__gc *gc, @@ -1698,7 +1817,7 @@ int libxl__arch_domain_finalise_hw_description(libxl_= _gc *gc, =20 } =20 - res =3D finalize_hypervisor_node(gc, &d_config->b_info, dom); + res =3D finalize_extra_regions(gc, &d_config->b_info, dom); if (res) return res; =20 diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 0613c1916936..4741472ea1a0 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -180,7 +180,21 @@ int xenmem_add_to_physmap_one( case XENMAPSPACE_dev_mmio: rc =3D map_dev_mmio_page(d, gfn, _mfn(idx)); return rc; + case XENMAPSPACE_pv_time: +#ifdef CONFIG_ARM_64 + ASSERT(IS_POWER_OF_TWO(sizeof(struct pv_time_region))); + if ( idx >=3D DIV_ROUND_UP(d->max_vcpus * sizeof(struct pv_time_re= gion), + PAGE_SIZE) ) + return -EINVAL; + + if ( idx =3D=3D 0 ) + d->arch.pv_time_regions_gfn =3D gfn; =20 + mfn =3D virt_to_mfn(d->arch.pv_time_regions[idx]); + t =3D p2m_ram_ro; + + break; +#endif default: return -ENOSYS; } diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h index bd9fc37b5297..4daa703e882e 100644 --- a/xen/include/public/memory.h +++ b/xen/include/public/memory.h @@ -217,6 +217,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); Stage-2 using the Normal Memory Inner/Outer Write-Back Cacheable memory attribute. */ +#define XENMAPSPACE_pv_time 6 /* PV time shared region (ARM64 only) */ /* ` } */ =20 /* --=20 2.48.1