From patchwork Thu Nov 16 13:46:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 13457919 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 89874C54FB9 for ; Thu, 16 Nov 2023 13:46:23 +0000 (UTC) Received: from list by lists.xenproject.org with outflank-mailman.634230.989610 (Exim 4.92) (envelope-from ) id 1r3chC-0003f7-9w; Thu, 16 Nov 2023 13:46:14 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 634230.989610; Thu, 16 Nov 2023 13:46:14 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1r3chC-0003f0-6p; Thu, 16 Nov 2023 13:46:14 +0000 Received: by outflank-mailman (input) for mailman id 634230; Thu, 16 Nov 2023 13:46:13 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1r3chB-0003dG-4t for xen-devel@lists.xenproject.org; Thu, 16 Nov 2023 13:46:13 +0000 Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on20615.outbound.protection.outlook.com [2a01:111:f400:7d00::615]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 804fbd85-8486-11ee-9b0e-b553b5be7939; Thu, 16 Nov 2023 14:46:11 +0100 (CET) Received: from DU2PR04MB8790.eurprd04.prod.outlook.com (2603:10a6:10:2e1::23) by PAXPR04MB8973.eurprd04.prod.outlook.com (2603:10a6:102:20c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7025.8; Thu, 16 Nov 2023 13:46:09 +0000 Received: from DU2PR04MB8790.eurprd04.prod.outlook.com ([fe80::eb8e:fa24:44c1:5d44]) by DU2PR04MB8790.eurprd04.prod.outlook.com ([fe80::eb8e:fa24:44c1:5d44%3]) with mapi id 15.20.7002.019; Thu, 16 Nov 2023 13:46:09 +0000 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: 804fbd85-8486-11ee-9b0e-b553b5be7939 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Pe27FRw9NVn0wSXmJ/J0iW4hOvotUrHXE+bruOKDZJi+4um16Zm2uTUqknyTuXHhjVfcOmBKIJPsZDJTtfUWswr1Eqd7fbGY2PlogxhcK82x8V8eMXcO/F2i9eMnE+p+2nxD2qrIHgoItkwtGQJOFIkqQSZIwlqzF+Z8gWXzrx0AL6Ncor480xmP3KqAnm4zZkrS2Qlj6wyrxyBtadE2WeNO0/EAf9bMHUURLPM1QD/a+zAR1kvv+lnZCZ0NgweTrZt2uKSJ4xpI5P6e6im4i48sM07np2IeCuv8TVmL47YaBPgLgY8TY+W0m0mcux3oyYtBdAUd6UNOsyE0Ua0ZyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=aQ35HW5/VXYEY1+3qai12wgann+ykzB/YgLcoRE3Z2A=; b=YypLyMtfSSZ4h0Zz3m6zbEXGUzmMLYLkPfhoqjzkBlckupHDxMs8uXWheBcD9kE/lbQ95J8vQlPKvgL51tdRdvJFD9uZxfrfWyHAmJimf40mJKbeOx0LtBOIUEbodnc7Wg34kdGQG0Bsts8gnd3gY/SSGOW+gaupX7Qnhg4N8IOFLUbLLPRH5cwhl43EthEooiijv6p49Aoz9mcwPQ3T7m2+LEhXT/hWLFruu0ofnPn+3JQFfuZix+0zuj7uHMT/mdMP1NNDTC0EmZ7lH7NQOAzdQmx2vL7qPOxLsKWPo2XTFFh9ghqr+F6Lqp6W2Fh0cqgm24Hu4XG8/g3rXDkjvQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=aQ35HW5/VXYEY1+3qai12wgann+ykzB/YgLcoRE3Z2A=; b=IO8YaVec+JU9yP0oH//oSZXa7qvx5K258qvw9kHRHREby520ITh0t5NCQS6XZbgpf5ny3n4j3DSlww8LFpVwwTRsJTy1aF0M4qYo/tF7U76hy8lokC1CZbegIGPHje2Ga3XhOTmqHUVFa7QJzhFgqrZC/nSJY+cSyPtvyf9J7QamxqdvzQrFNCslOQdAovrneJwpNHl7LpsOTJBAfLauDIEHA86k/9S/FYhcCpf0rXMfYH5rdYyGmATwts+TVHjEkVz0i7q5j1oAhvafmqgEiaLpL4wQinUFeuxmVVhDUsJINZ/n6Fut7fdwLV854WYDL5BF9n+2s8fgMXeWt9q5fg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com; Message-ID: <9810305d-4b36-4e23-b807-a7a00f0ba6b6@suse.com> Date: Thu, 16 Nov 2023 14:46:08 +0100 User-Agent: Mozilla Thunderbird Subject: [PATCH v2 1/5] x86/HVM: introduce hvm_point_entry() Content-Language: en-US From: Jan Beulich To: "xen-devel@lists.xenproject.org" Cc: Andrew Cooper , Wei Liu , =?utf-8?q?Roger_Pau_Monn=C3=A9?= References: <08e0708c-17e2-4a5e-aaf7-5f60a40f76db@suse.com> Autocrypt: addr=jbeulich@suse.com; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL In-Reply-To: <08e0708c-17e2-4a5e-aaf7-5f60a40f76db@suse.com> X-ClientProxiedBy: FR0P281CA0011.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:15::16) To DU2PR04MB8790.eurprd04.prod.outlook.com (2603:10a6:10:2e1::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DU2PR04MB8790:EE_|PAXPR04MB8973:EE_ X-MS-Office365-Filtering-Correlation-Id: 6ff9fc7b-6111-4301-79a2-08dbe6aa6379 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: e3qhI7JW26AfM8ghP3Z1xB1gCDj/zdp3mD67d+QxFX0ee1OY4ykwXeRontvX03ZX8QGSTV2EHRY1k3VznjkKZUGopAZa73+CE2OpQYiduc5wcMmBOYbytl/FGz+wVlbwAksrM3F4uYlSfoF2UFjdkqm3ZZDW5QJ1Jelufgw5m9gtBhOnpxlMGNK1S+P0RmE7ubkk5LdLl3G6JjVo07OWYTubmm5I8fJqolgKkwp9PlgHkJNdHljZu9kVaZty2vKRf/a6keciaumqTl2p0SasPVuS4ABJJZDx/NjaEnglAo0NBbgRN1OUYO9IVA5j8w7N2AfQs9GemunI695CCiSFAnhyUwMsseDgkhaIpJerfZ+CGDfBCyYKdVtzsGxE4lpJR6NFNqhYmZ/nlCWUHNzWRhornI6AK4XuOL0qwuQBwuyGrtfWjtNsdVyuyKNkuvVtH6t4RClycPY47B85W3H+8sSiagteW5I2U6ia2xfs2GMIiGE7BPmd8+q2pkAqDPCAz9YjajFLMiXUEtIYJIM1dmOGvYwLR3E9PxvQaNiYnxS4UAsqlEFrWnUIaB6LUAkVSa+KFVHG8l9VcXulJKUur34PikzpPIzhzhFNN4CfHXtIcdj1CqOmZB0kzy26XLcS08kXO2m/DKymyMh89qKlhg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DU2PR04MB8790.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(136003)(346002)(39860400002)(366004)(396003)(376002)(230922051799003)(451199024)(64100799003)(186009)(1800799009)(38100700002)(5660300002)(2906002)(31696002)(8676002)(4326008)(86362001)(8936002)(41300700001)(31686004)(6916009)(2616005)(316002)(54906003)(66556008)(66946007)(66476007)(478600001)(83380400001)(26005)(6486002)(36756003)(6506007)(6512007)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?1CkBcZxVXdEQQvTzTcM/IPBE8WkI?= =?utf-8?q?alxFqKOvUxVqyLIvQTeZr908uYham60kYtgbLQxhotcDPNliLTJXmGDpAyLYhmOr3?= =?utf-8?q?Gxp+Oh8RXqv26MNkNzPal/tF6JCNREwC5Ogm4ZFX30wasd9W8h9fF82DdHtuaES7f?= =?utf-8?q?8FaIPDfS8Q9Ib4LfEkxHARPDRp1exOtDPl5eYBSlE4e2fsnB3Ytbloufx6EVvVgHl?= =?utf-8?q?WkjV5OKZ3CNej3Eh8okt++jSZcvP038TxboMqozPWwbnvhdeVjKaVGU5oyMiLeHnw?= =?utf-8?q?Z6NBKIXKTQr2fqjDXORBLk0TqCNVwQTEhwa1Uaexi0e7j2NNXuTJJPGo0LxkZt7Lp?= =?utf-8?q?U5ivVFqwAom8bm7kh9Bu9aMpMI4A+fOq9jQbR0J0oanOC65z0wAU2aKsKSSX9mVYl?= =?utf-8?q?TfWMzAG/hy+03GPoT+2ao8oUHrNhhfG9PDwiKHuyZE2UsWBkgxyl9q1wnOeQl5+Sf?= =?utf-8?q?vEoIOREzrU2dwEdEeioJIcE1uUFRKZS/9GkeERQORkraA6ZU/+QAq9C/UGL73XwBV?= =?utf-8?q?KJAteGYZr9uCCcc7vprwmpvv48foGSsGp2P9JVtqis5yAo5EU01tAn6dg/+3gCWro?= =?utf-8?q?NlMJOrqBqPxiJKuKti+4wiMb8Fezn0aVFbBZp3qcVDSSgzXCJNNlD0CramDCjBYSy?= =?utf-8?q?el192TCN20+HtOaTAMaW2JJQfpFgRPEXygYAM0ni3KvqRoJvdEKxLhBZRwUaTuC+g?= =?utf-8?q?eo8xpaR4s+Fd3Uj1vj6gBd3KeBOOmgUZCNJhWLG7oYFguMm1oSagnYqKdzR8HylVY?= =?utf-8?q?NfCDgJrgepTvDZDgMWsgNC8mEQ52S1IghiY1NFV7uDq0ir0i8zb+gMiQIbIbG7VrA?= =?utf-8?q?N+NtK6NEjRULXOurPHmz6iBhKl+/wXPMoH4mr4F+LCIMkiU9VZRhcdgtYQmx57S25?= =?utf-8?q?t+upCvQlDXtOuXjXQy0pGSfCLMcRWunySqOs7MlkjMT24HCfTE2EAjk7bq3VKrgiY?= =?utf-8?q?lwY2WOOYETNFcww7VFEDPxwhgr4PNxCx6KCuPvQAF3O3/zvkWjUZIXd7iO59tyPfD?= =?utf-8?q?GDoeT6a8LTXsrpJpEA5o16Qi3vkL+uOL9JJHijMAUikO5CmAI/sI0Mb4ejM07eCeP?= =?utf-8?q?TVz74nQ1YcyHUnca39jOORHcfYPbf19sDNfeaxYVMFppGe+Osn2Dc0jCwx0rhj6aM?= =?utf-8?q?aJSEwhRcO2wHi3ZsIKNqIm/5rCvWHUlBRGOsnu7S7+S1XQQL1ONUA6du7txhb5RvH?= =?utf-8?q?j7mQ9Qzy02nVGkDob2JWvSULVcsinzCXPZEC3c3zLmyOqSr6p558sbSalG+3xx2Db?= =?utf-8?q?ARk7/fYPRYYkqNTq8hJ9RWq041Dxe1CY1ZNRvkqohHu4jNa8n1Wd5VhwskaWHw2fO?= =?utf-8?q?7wavzxFescJfqsIDNP49BFeawI+r/aLLSybqOiD1xrziDGJTVkI1BYqhE3IrE+H4I?= =?utf-8?q?e2xNKD5VVddbSIoGck2mTry6obIyi0WGsh7gIOG3NDNczChM3yLg8QZdFucDDezvO?= =?utf-8?q?HtKNt/2JVftQdgjRMnDJoobDrYgvXeJdNUJHRpXoX82yUAbeDlLVNO5hWHHnTHPgY?= =?utf-8?q?rlb+OZdAPivY?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6ff9fc7b-6111-4301-79a2-08dbe6aa6379 X-MS-Exchange-CrossTenant-AuthSource: DU2PR04MB8790.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Nov 2023 13:46:09.1947 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f7a17af6-1c5c-4a36-aa8b-f5be247aa4ba X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: n7I8HxJx4gzryg0W7r+C64KZIp/4AhK/xKE8bMgOZPYK+gIv/ZTCBaZeQ6vooXXLSmdxzPgRzmD0eq/DeRUeLA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8973 ... to accompany hvm_read_entry() when actual copying isn't desirable. This allows to remove open-coded stream accesses from hpet_load(), along with using the helper in hvm_load() itself. Since arch_hvm_load()'s declaration would need changing, and since the function is not used from elsewhere, purge the declaration. With that it makes little sense to keep arch_hvm_save()'s around; convert that function to static then at the same time. In hpet_load() simplify the specific case of error return that's in context anyway: There's no need to hold the lock when only updating a local variable. Signed-off-by: Jan Beulich Acked-by: Andrew Cooper --- v2: New. --- a/xen/arch/x86/hvm/hpet.c +++ b/xen/arch/x86/hvm/hpet.c @@ -637,7 +637,7 @@ static int cf_check hpet_save(struct vcp static int cf_check hpet_load(struct domain *d, hvm_domain_context_t *h) { HPETState *hp = domain_vhpet(d); - struct hvm_hw_hpet *rec; + const struct hvm_hw_hpet *rec; uint64_t cmp; uint64_t guest_time; int i; @@ -645,17 +645,12 @@ static int cf_check hpet_load(struct dom if ( !has_vhpet(d) ) return -ENODEV; - write_lock(&hp->lock); - /* Reload the HPET registers */ - if ( _hvm_check_entry(h, HVM_SAVE_CODE(HPET), HVM_SAVE_LENGTH(HPET), 1) ) - { - write_unlock(&hp->lock); + rec = hvm_point_entry(HPET, h); + if ( !rec ) return -EINVAL; - } - rec = (struct hvm_hw_hpet *)&h->data[h->cur]; - h->cur += HVM_SAVE_LENGTH(HPET); + write_lock(&hp->lock); #define C(x) hp->hpet.x = rec->x C(capability); --- a/xen/arch/x86/hvm/save.c +++ b/xen/arch/x86/hvm/save.c @@ -15,7 +15,7 @@ #include -void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr) +static void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr) { uint32_t eax, ebx, ecx, edx; @@ -30,7 +30,7 @@ void arch_hvm_save(struct domain *d, str d->arch.hvm.sync_tsc = rdtsc(); } -int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr) +static int arch_hvm_load(struct domain *d, const struct hvm_save_header *hdr) { uint32_t eax, ebx, ecx, edx; @@ -277,7 +277,7 @@ int hvm_save(struct domain *d, hvm_domai int hvm_load(struct domain *d, hvm_domain_context_t *h) { - struct hvm_save_header hdr; + const struct hvm_save_header *hdr; struct hvm_save_descriptor *desc; hvm_load_handler handler; struct vcpu *v; @@ -286,11 +286,12 @@ int hvm_load(struct domain *d, hvm_domai if ( d->is_dying ) return -EINVAL; - /* Read the save header, which must be first */ - if ( hvm_load_entry(HEADER, h, &hdr) != 0 ) + /* Get at the save header, which must be first */ + hdr = hvm_point_entry(HEADER, h); + if ( !hdr ) return -ENODATA; - rc = arch_hvm_load(d, &hdr); + rc = arch_hvm_load(d, hdr); if ( rc ) return rc; --- a/xen/arch/x86/include/asm/hvm/save.h +++ b/xen/arch/x86/include/asm/hvm/save.h @@ -39,6 +39,21 @@ void _hvm_write_entry(struct hvm_domain_ int _hvm_check_entry(struct hvm_domain_context *h, uint16_t type, uint32_t len, bool strict_length); +/* + * Unmarshalling: check, then return pointer. Evaluates to non-NULL on success. + * This macro requires the save entry to be the same size as the dest structure. + */ +#define hvm_point_entry(x, h) ({ \ + const void *ptr = NULL; \ + BUILD_BUG_ON(HVM_SAVE_HAS_COMPAT(x)); \ + if ( _hvm_check_entry(h, HVM_SAVE_CODE(x), \ + HVM_SAVE_LENGTH(x), true) == 0 ) \ + { \ + ptr = &(h)->data[(h)->cur]; \ + h->cur += HVM_SAVE_LENGTH(x); \ + } \ + ptr; }) + /* Unmarshalling: copy the contents in a type-safe way */ void _hvm_read_entry(struct hvm_domain_context *h, void *dest, uint32_t dest_len); @@ -127,9 +142,4 @@ int hvm_save_one(struct domain *d, unsig XEN_GUEST_HANDLE_64(uint8) handle, uint64_t *bufsz); int hvm_load(struct domain *d, hvm_domain_context_t *h); -/* Arch-specific definitions. */ -struct hvm_save_header; -void arch_hvm_save(struct domain *d, struct hvm_save_header *hdr); -int arch_hvm_load(struct domain *d, struct hvm_save_header *hdr); - #endif /* __XEN_HVM_SAVE_H__ */