From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760312; cv=none; d=zohomail.com; s=zohoarc; b=CxCKL7zHN4IgAL/qkHg7T4QcTmBpZ5a3kCqPotbnYGqaoDFHrxLRXAvNgRWELLiz6QjYFaZMfNITiOn1cFdW5BC/5gPj5UyJzXnhfmdRGQM9tIvfmu41Zrc5a8AHrXmHjZPPz/EZlRMhEoVdmH2mHplahlV9cqzM4HA+Vd9UdDU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760312; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=iJAG3VmFOAxVypzFNIVnH0KDV5tVihjCdvOL1waeJvA=; b=SFlmCplpno4VTRlA2WcZZBdCt/8ZZ6e4FP8hGmLp9iQ56b9aT2rb0OZjqxztiSx9eCYDLEQTl1w6Pb/Vzgr+ob825WR+/y/HEHSqP0n8UXCVOlRtPGaxZKc9C8ZHED2eadZ4cWjo99gMnWxmU2rrnbCKKkrZRV4D1KCWOhLHsbI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760312406640.8857740984623; Thu, 2 Mar 2023 04:31:52 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5Q-0007di-6c; Thu, 02 Mar 2023 07:31:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5F-0007RT-61 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:00 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi57-0002qK-92 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:30:50 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-375-Micq5NleNJqLc2hq-wFOCg-1; Thu, 02 Mar 2023 07:30:43 -0500 Received: by mail-wm1-f70.google.com with SMTP id l20-20020a05600c1d1400b003e10d3e1c23so1206634wms.1 for ; Thu, 02 Mar 2023 04:30:42 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id q6-20020a1ce906000000b003e0015c8618sm2789925wmc.6.2023.03.02.04.30.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:30:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760244; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=iJAG3VmFOAxVypzFNIVnH0KDV5tVihjCdvOL1waeJvA=; b=VkcKLa7ZWaLUPAWrPI5G1lkM/sBzFxNNgIWqBtvarV8RvdHaXMKf7cVPmiVb7oIqGGgvsq W5R8hRFmr2W9gMD5TdLjDKl/mfvvPKH68s42q4GaW9oqE5JjtGinY7WbztsZZXs8qdNK+Z n0UI/EtgGNPR+7WbwTNLVnvUCJlNjMw= X-MC-Unique: Micq5NleNJqLc2hq-wFOCg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iJAG3VmFOAxVypzFNIVnH0KDV5tVihjCdvOL1waeJvA=; b=YBdXr2RthCaSqWlWYfi3mw300E9nu9Cdd8sgE8LgK59+GgBO7gtjPE9hVyngHfqRiA 62kGMup10g08n/XSxu93XSssnYMWKBuUoHuVlKfa6ZA7+ZOZxLtSnGzUJceBxdqeEtmu M5DjIgDnB49MTeY0rJ/7gJL2f+qx0pBXVUBGovHO2kgoZ/o9O121HpUoLBVPtoIbbJcL 9pFx9y8EPqHVdLDiPXo9poOwo1qLxb2sJ3+kshr5nA9hlHS1F5uI0ILVFOn0xCHmwbz0 gxFI14Ei8udXAqHBUDhdUK38K/7W+e/A4xpzU9ArTHKydFfszfs/Fdza+Odtt9/bR5NA ij9Q== X-Gm-Message-State: AO0yUKWNr+CIqQjHB7bARpwGV/Mhrem4e9PjXdrM2TqMQGZJhA0ylZjI arJ3LWSBLl+FazBPjEs30qeeDjvnwl1y9cMDobMHU5JdkJbLDdFHrB8Pyga3rqtS8f6QPLv6/Ks 46GEE4stGOQFWJWbkWg/2Aw4orIk2lRlahOYhCTg0z1dpImnja18DdpqaGopHbcnUYyTsVXSdgY 0= X-Received: by 2002:a05:600c:90a:b0:3eb:2b88:5af1 with SMTP id m10-20020a05600c090a00b003eb2b885af1mr7582646wmp.18.1677760238994; Thu, 02 Mar 2023 04:30:38 -0800 (PST) X-Google-Smtp-Source: AK7set+3wBOuW3ltxdk39SV485bM1x6krga55PfqTL3McHt+aUw7544QBW/DRz7KwkbtPt/i7G+RsQ== X-Received: by 2002:a05:600c:90a:b0:3eb:2b88:5af1 with SMTP id m10-20020a05600c090a00b003eb2b885af1mr7582555wmp.18.1677760236767; Thu, 02 Mar 2023 04:30:36 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 01/62] include: import Xen public headers to hw/xen/interface Date: Thu, 2 Mar 2023 13:29:28 +0100 Message-Id: <20230302123029.153265-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760313078100009 Content-Type: text/plain; charset="utf-8" From: Joao Martins There's already a partial set here; update them and pull in a more complete set. To start with, define __XEN_TOOLS__ in hw/xen/xen.h to ensure that any internal definitions needed by Xen toolstack libraries are present regardless of the order in which the headers are included. A reckoning will come later, once we make the PV backends work in emulation and untangle the headers for Xen-native vs. generic parts. Signed-off-by: Joao Martins [dwmw2: Update to Xen public headers from 4.16.2 release, add some in io/, define __XEN_TOOLS__ in hw/xen/xen.h, move to hw/xen/interface/] Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- include/hw/xen/interface/arch-arm.h | 510 ++++++++ include/hw/xen/interface/arch-x86/cpuid.h | 118 ++ .../hw/xen/interface/arch-x86/xen-x86_32.h | 194 +++ .../hw/xen/interface/arch-x86/xen-x86_64.h | 241 ++++ include/hw/xen/interface/arch-x86/xen.h | 398 +++++++ include/hw/xen/interface/event_channel.h | 388 ++++++ include/hw/xen/interface/features.h | 143 +++ include/hw/xen/interface/grant_table.h | 650 ++++++++++ include/hw/xen/interface/hvm/hvm_op.h | 395 +++++++ include/hw/xen/interface/hvm/params.h | 318 +++++ include/hw/xen/interface/io/blkif.h | 14 +- include/hw/xen/interface/io/console.h | 10 + include/hw/xen/interface/io/fbif.h | 20 + include/hw/xen/interface/io/kbdif.h | 10 + include/hw/xen/interface/io/netif.h | 94 +- include/hw/xen/interface/io/ring.h | 99 +- include/hw/xen/interface/io/usbif.h | 353 ++++-- include/hw/xen/interface/io/xenbus.h | 10 + include/hw/xen/interface/io/xs_wire.h | 153 +++ include/hw/xen/interface/memory.h | 754 ++++++++++++ include/hw/xen/interface/physdev.h | 383 ++++++ include/hw/xen/interface/sched.h | 202 ++++ include/hw/xen/interface/trace.h | 341 ++++++ include/hw/xen/interface/vcpu.h | 248 ++++ include/hw/xen/interface/version.h | 113 ++ include/hw/xen/interface/xen-compat.h | 46 + include/hw/xen/interface/xen.h | 1049 +++++++++++++++++ include/hw/xen/xen.h | 16 +- 28 files changed, 7134 insertions(+), 136 deletions(-) create mode 100644 include/hw/xen/interface/arch-arm.h create mode 100644 include/hw/xen/interface/arch-x86/cpuid.h create mode 100644 include/hw/xen/interface/arch-x86/xen-x86_32.h create mode 100644 include/hw/xen/interface/arch-x86/xen-x86_64.h create mode 100644 include/hw/xen/interface/arch-x86/xen.h create mode 100644 include/hw/xen/interface/event_channel.h create mode 100644 include/hw/xen/interface/features.h create mode 100644 include/hw/xen/interface/hvm/hvm_op.h create mode 100644 include/hw/xen/interface/hvm/params.h create mode 100644 include/hw/xen/interface/io/xs_wire.h create mode 100644 include/hw/xen/interface/memory.h create mode 100644 include/hw/xen/interface/physdev.h create mode 100644 include/hw/xen/interface/sched.h create mode 100644 include/hw/xen/interface/trace.h create mode 100644 include/hw/xen/interface/vcpu.h create mode 100644 include/hw/xen/interface/version.h create mode 100644 include/hw/xen/interface/xen-compat.h create mode 100644 include/hw/xen/interface/xen.h diff --git a/include/hw/xen/interface/arch-arm.h b/include/hw/xen/interface= /arch-arm.h new file mode 100644 index 000000000000..94b31511ddea --- /dev/null +++ b/include/hw/xen/interface/arch-arm.h @@ -0,0 +1,510 @@ +/*************************************************************************= ***** + * arch-arm.h + * + * Guest OS interface to ARM Xen. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright 2011 (C) Citrix Systems + */ + +#ifndef __XEN_PUBLIC_ARCH_ARM_H__ +#define __XEN_PUBLIC_ARCH_ARM_H__ + +/* + * `incontents 50 arm_abi Hypercall Calling Convention + * + * A hypercall is issued using the ARM HVC instruction. + * + * A hypercall can take up to 5 arguments. These are passed in + * registers, the first argument in x0/r0 (for arm64/arm32 guests + * respectively irrespective of whether the underlying hypervisor is + * 32- or 64-bit), the second argument in x1/r1, the third in x2/r2, + * the forth in x3/r3 and the fifth in x4/r4. + * + * The hypercall number is passed in r12 (arm) or x16 (arm64). In both + * cases the relevant ARM procedure calling convention specifies this + * is an inter-procedure-call scratch register (e.g. for use in linker + * stubs). This use does not conflict with use during a hypercall. + * + * The HVC ISS must contain a Xen specific TAG: XEN_HYPERCALL_TAG. + * + * The return value is in x0/r0. + * + * The hypercall will clobber x16/r12 and the argument registers used + * by that hypercall (except r0 which is the return value) i.e. in + * addition to x16/r12 a 2 argument hypercall will clobber x1/r1 and a + * 4 argument hypercall will clobber x1/r1, x2/r2 and x3/r3. + * + * Parameter structs passed to hypercalls are laid out according to + * the Procedure Call Standard for the ARM Architecture (AAPCS, AKA + * EABI) and Procedure Call Standard for the ARM 64-bit Architecture + * (AAPCS64). Where there is a conflict the 64-bit standard should be + * used regardless of guest type. Structures which are passed as + * hypercall arguments are always little endian. + * + * All memory which is shared with other entities in the system + * (including the hypervisor and other guests) must reside in memory + * which is mapped as Normal Inner Write-Back Outer Write-Back Inner-Share= able. + * This applies to: + * - hypercall arguments passed via a pointer to guest memory. + * - memory shared via the grant table mechanism (including PV I/O + * rings etc). + * - memory shared with the hypervisor (struct shared_info, struct + * vcpu_info, the grant table, etc). + * + * Any cache allocation hints are acceptable. + */ + +/* + * `incontents 55 arm_hcall Supported Hypercalls + * + * Xen on ARM makes extensive use of hardware facilities and therefore + * only a subset of the potential hypercalls are required. + * + * Since ARM uses second stage paging any machine/physical addresses + * passed to hypercalls are Guest Physical Addresses (Intermediate + * Physical Addresses) unless otherwise noted. + * + * The following hypercalls (and sub operations) are supported on the + * ARM platform. Other hypercalls should be considered + * unavailable/unsupported. + * + * HYPERVISOR_memory_op + * All generic sub-operations + * + * HYPERVISOR_domctl + * All generic sub-operations, with the exception of: + * * XEN_DOMCTL_irq_permission (not yet implemented) + * + * HYPERVISOR_sched_op + * All generic sub-operations, with the exception of: + * * SCHEDOP_block -- prefer wfi hardware instruction + * + * HYPERVISOR_console_io + * All generic sub-operations + * + * HYPERVISOR_xen_version + * All generic sub-operations + * + * HYPERVISOR_event_channel_op + * All generic sub-operations + * + * HYPERVISOR_physdev_op + * Exactly these sub-operations are supported: + * PHYSDEVOP_pci_device_add + * PHYSDEVOP_pci_device_remove + * + * HYPERVISOR_sysctl + * All generic sub-operations, with the exception of: + * * XEN_SYSCTL_page_offline_op + * * XEN_SYSCTL_get_pmstat + * * XEN_SYSCTL_pm_op + * + * HYPERVISOR_hvm_op + * Exactly these sub-operations are supported: + * * HVMOP_set_param + * * HVMOP_get_param + * + * HYPERVISOR_grant_table_op + * All generic sub-operations + * + * HYPERVISOR_vcpu_op + * Exactly these sub-operations are supported: + * * VCPUOP_register_vcpu_info + * * VCPUOP_register_runstate_memory_area + * + * HYPERVISOR_argo_op + * All generic sub-operations + * + * Other notes on the ARM ABI: + * + * - struct start_info is not exported to ARM guests. + * + * - struct shared_info is mapped by ARM guests using the + * HYPERVISOR_memory_op sub-op XENMEM_add_to_physmap, passing + * XENMAPSPACE_shared_info as space parameter. + * + * - All the per-cpu struct vcpu_info are mapped by ARM guests using the + * HYPERVISOR_vcpu_op sub-op VCPUOP_register_vcpu_info, including cpu0 + * struct vcpu_info. + * + * - The grant table is mapped using the HYPERVISOR_memory_op sub-op + * XENMEM_add_to_physmap, passing XENMAPSPACE_grant_table as space + * parameter. The memory range specified under the Xen compatible + * hypervisor node on device tree can be used as target gpfn for the + * mapping. + * + * - Xenstore is initialized by using the two hvm_params + * HVM_PARAM_STORE_PFN and HVM_PARAM_STORE_EVTCHN. They can be read + * with the HYPERVISOR_hvm_op sub-op HVMOP_get_param. + * + * - The paravirtualized console is initialized by using the two + * hvm_params HVM_PARAM_CONSOLE_PFN and HVM_PARAM_CONSOLE_EVTCHN. They + * can be read with the HYPERVISOR_hvm_op sub-op HVMOP_get_param. + * + * - Event channel notifications are delivered using the percpu GIC + * interrupt specified under the Xen compatible hypervisor node on + * device tree. + * + * - The device tree Xen compatible node is fully described under Linux + * at Documentation/devicetree/bindings/arm/xen.txt. + */ + +#define XEN_HYPERCALL_TAG 0XEA1 + +#define int64_aligned_t int64_t __attribute__((aligned(8))) +#define uint64_aligned_t uint64_t __attribute__((aligned(8))) + +#ifndef __ASSEMBLY__ +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef union { type *p; unsigned long q; } \ + __guest_handle_ ## name; \ + typedef union { type *p; uint64_aligned_t q; } \ + __guest_handle_64_ ## name + +/* + * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field + * in a struct in memory. On ARM is always 8 bytes sizes and 8 bytes + * aligned. + * XEN_GUEST_HANDLE_PARAM represents a guest pointer, when passed as an + * hypercall argument. It is 4 bytes on aarch32 and 8 bytes on aarch64. + */ +#define __DEFINE_XEN_GUEST_HANDLE(name, type) \ + ___DEFINE_XEN_GUEST_HANDLE(name, type); \ + ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) +#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, na= me) +#define __XEN_GUEST_HANDLE(name) __guest_handle_64_ ## name +#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) +#define XEN_GUEST_HANDLE_PARAM(name) __guest_handle_ ## name +#define set_xen_guest_handle_raw(hnd, val) \ + do { \ + __typeof__(&(hnd)) _sxghr_tmp =3D &(hnd); \ + _sxghr_tmp->q =3D 0; \ + _sxghr_tmp->p =3D val; \ + } while ( 0 ) +#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) + +typedef uint64_t xen_pfn_t; +#define PRI_xen_pfn PRIx64 +#define PRIu_xen_pfn PRIu64 + +/* + * Maximum number of virtual CPUs in legacy multi-processor guests. + * Only one. All other VCPUS must use VCPUOP_register_vcpu_info. + */ +#define XEN_LEGACY_MAX_VCPUS 1 + +typedef uint64_t xen_ulong_t; +#define PRI_xen_ulong PRIx64 + +#if defined(__XEN__) || defined(__XEN_TOOLS__) +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) +/* Anonymous union includes both 32- and 64-bit names (e.g., r0/x0). */ +# define __DECL_REG(n64, n32) union { \ + uint64_t n64; \ + uint32_t n32; \ + } +#else +/* Non-gcc sources must always use the proper 64-bit name (e.g., x0). */ +#define __DECL_REG(n64, n32) uint64_t n64 +#endif + +struct vcpu_guest_core_regs +{ + /* Aarch64 Aarch32 */ + __DECL_REG(x0, r0_usr); + __DECL_REG(x1, r1_usr); + __DECL_REG(x2, r2_usr); + __DECL_REG(x3, r3_usr); + __DECL_REG(x4, r4_usr); + __DECL_REG(x5, r5_usr); + __DECL_REG(x6, r6_usr); + __DECL_REG(x7, r7_usr); + __DECL_REG(x8, r8_usr); + __DECL_REG(x9, r9_usr); + __DECL_REG(x10, r10_usr); + __DECL_REG(x11, r11_usr); + __DECL_REG(x12, r12_usr); + + __DECL_REG(x13, sp_usr); + __DECL_REG(x14, lr_usr); + + __DECL_REG(x15, __unused_sp_hyp); + + __DECL_REG(x16, lr_irq); + __DECL_REG(x17, sp_irq); + + __DECL_REG(x18, lr_svc); + __DECL_REG(x19, sp_svc); + + __DECL_REG(x20, lr_abt); + __DECL_REG(x21, sp_abt); + + __DECL_REG(x22, lr_und); + __DECL_REG(x23, sp_und); + + __DECL_REG(x24, r8_fiq); + __DECL_REG(x25, r9_fiq); + __DECL_REG(x26, r10_fiq); + __DECL_REG(x27, r11_fiq); + __DECL_REG(x28, r12_fiq); + + __DECL_REG(x29, sp_fiq); + __DECL_REG(x30, lr_fiq); + + /* Return address and mode */ + __DECL_REG(pc64, pc32); /* ELR_EL2 */ + uint64_t cpsr; /* SPSR_EL2 */ + + union { + uint64_t spsr_el1; /* AArch64 */ + uint32_t spsr_svc; /* AArch32 */ + }; + + /* AArch32 guests only */ + uint32_t spsr_fiq, spsr_irq, spsr_und, spsr_abt; + + /* AArch64 guests only */ + uint64_t sp_el0; + uint64_t sp_el1, elr_el1; +}; +typedef struct vcpu_guest_core_regs vcpu_guest_core_regs_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_guest_core_regs_t); + +#undef __DECL_REG + +struct vcpu_guest_context { +#define _VGCF_online 0 +#define VGCF_online (1<<_VGCF_online) + uint32_t flags; /* VGCF_* */ + + struct vcpu_guest_core_regs user_regs; /* Core CPU registers */ + + uint64_t sctlr; + uint64_t ttbcr, ttbr0, ttbr1; +}; +typedef struct vcpu_guest_context vcpu_guest_context_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t); + +/* + * struct xen_arch_domainconfig's ABI is covered by + * XEN_DOMCTL_INTERFACE_VERSION. + */ +#define XEN_DOMCTL_CONFIG_GIC_NATIVE 0 +#define XEN_DOMCTL_CONFIG_GIC_V2 1 +#define XEN_DOMCTL_CONFIG_GIC_V3 2 + +#define XEN_DOMCTL_CONFIG_TEE_NONE 0 +#define XEN_DOMCTL_CONFIG_TEE_OPTEE 1 + +struct xen_arch_domainconfig { + /* IN/OUT */ + uint8_t gic_version; + /* IN */ + uint16_t tee_type; + /* IN */ + uint32_t nr_spis; + /* + * OUT + * Based on the property clock-frequency in the DT timer node. + * The property may be present when the bootloader/firmware doesn't + * set correctly CNTFRQ which hold the timer frequency. + * + * As it's not possible to trap this register, we have to replicate + * the value in the guest DT. + * + * =3D 0 =3D> property not present + * > 0 =3D> Value of the property + * + */ + uint32_t clock_frequency; +}; +#endif /* __XEN__ || __XEN_TOOLS__ */ + +struct arch_vcpu_info { +}; +typedef struct arch_vcpu_info arch_vcpu_info_t; + +struct arch_shared_info { +}; +typedef struct arch_shared_info arch_shared_info_t; +typedef uint64_t xen_callback_t; + +#endif + +#if defined(__XEN__) || defined(__XEN_TOOLS__) + +/* PSR bits (CPSR, SPSR) */ + +#define PSR_THUMB (1<<5) /* Thumb Mode enable */ +#define PSR_FIQ_MASK (1<<6) /* Fast Interrupt mask */ +#define PSR_IRQ_MASK (1<<7) /* Interrupt mask */ +#define PSR_ABT_MASK (1<<8) /* Asynchronous Abort mask */ +#define PSR_BIG_ENDIAN (1<<9) /* arm32: Big Endian Mode */ +#define PSR_DBG_MASK (1<<9) /* arm64: Debug Exception mask */ +#define PSR_IT_MASK (0x0600fc00) /* Thumb If-Then Mask */ +#define PSR_JAZELLE (1<<24) /* Jazelle Mode */ + +/* 32 bit modes */ +#define PSR_MODE_USR 0x10 +#define PSR_MODE_FIQ 0x11 +#define PSR_MODE_IRQ 0x12 +#define PSR_MODE_SVC 0x13 +#define PSR_MODE_MON 0x16 +#define PSR_MODE_ABT 0x17 +#define PSR_MODE_HYP 0x1a +#define PSR_MODE_UND 0x1b +#define PSR_MODE_SYS 0x1f + +/* 64 bit modes */ +#define PSR_MODE_BIT 0x10 /* Set iff AArch32 */ +#define PSR_MODE_EL3h 0x0d +#define PSR_MODE_EL3t 0x0c +#define PSR_MODE_EL2h 0x09 +#define PSR_MODE_EL2t 0x08 +#define PSR_MODE_EL1h 0x05 +#define PSR_MODE_EL1t 0x04 +#define PSR_MODE_EL0t 0x00 + +#define PSR_GUEST32_INIT (PSR_ABT_MASK|PSR_FIQ_MASK|PSR_IRQ_MASK|PSR_MODE= _SVC) +#define PSR_GUEST64_INIT (PSR_ABT_MASK|PSR_FIQ_MASK|PSR_IRQ_MASK|PSR_MODE_= EL1h) + +#define SCTLR_GUEST_INIT xen_mk_ullong(0x00c50078) + +/* + * Virtual machine platform (memory layout, interrupts) + * + * These are defined for consistency between the tools and the + * hypervisor. Guests must not rely on these hardcoded values but + * should instead use the FDT. + */ + +/* Physical Address Space */ + +/* + * vGIC mappings: Only one set of mapping is used by the guest. + * Therefore they can overlap. + */ + +/* vGIC v2 mappings */ +#define GUEST_GICD_BASE xen_mk_ullong(0x03001000) +#define GUEST_GICD_SIZE xen_mk_ullong(0x00001000) +#define GUEST_GICC_BASE xen_mk_ullong(0x03002000) +#define GUEST_GICC_SIZE xen_mk_ullong(0x00002000) + +/* vGIC v3 mappings */ +#define GUEST_GICV3_GICD_BASE xen_mk_ullong(0x03001000) +#define GUEST_GICV3_GICD_SIZE xen_mk_ullong(0x00010000) + +#define GUEST_GICV3_RDIST_REGIONS 1 + +#define GUEST_GICV3_GICR0_BASE xen_mk_ullong(0x03020000) /* vCPU0..127= */ +#define GUEST_GICV3_GICR0_SIZE xen_mk_ullong(0x01000000) + +/* + * 256 MB is reserved for VPCI configuration space based on calculation + * 256 buses x 32 devices x 8 functions x 4 KB =3D 256 MB + */ +#define GUEST_VPCI_ECAM_BASE xen_mk_ullong(0x10000000) +#define GUEST_VPCI_ECAM_SIZE xen_mk_ullong(0x10000000) + +/* ACPI tables physical address */ +#define GUEST_ACPI_BASE xen_mk_ullong(0x20000000) +#define GUEST_ACPI_SIZE xen_mk_ullong(0x02000000) + +/* PL011 mappings */ +#define GUEST_PL011_BASE xen_mk_ullong(0x22000000) +#define GUEST_PL011_SIZE xen_mk_ullong(0x00001000) + +/* Guest PCI-PCIe memory space where config space and BAR will be availabl= e.*/ +#define GUEST_VPCI_ADDR_TYPE_MEM xen_mk_ullong(0x02000000) +#define GUEST_VPCI_MEM_ADDR xen_mk_ullong(0x23000000) +#define GUEST_VPCI_MEM_SIZE xen_mk_ullong(0x10000000) + +/* + * 16MB =3D=3D 4096 pages reserved for guest to use as a region to map its + * grant table in. + */ +#define GUEST_GNTTAB_BASE xen_mk_ullong(0x38000000) +#define GUEST_GNTTAB_SIZE xen_mk_ullong(0x01000000) + +#define GUEST_MAGIC_BASE xen_mk_ullong(0x39000000) +#define GUEST_MAGIC_SIZE xen_mk_ullong(0x01000000) + +#define GUEST_RAM_BANKS 2 + +/* + * The way to find the extended regions (to be exposed to the guest as unu= sed + * address space) relies on the fact that the regions reserved for the RAM + * below are big enough to also accommodate such regions. + */ +#define GUEST_RAM0_BASE xen_mk_ullong(0x40000000) /* 3GB of low RAM @ 1G= B */ +#define GUEST_RAM0_SIZE xen_mk_ullong(0xc0000000) + +/* 4GB @ 4GB Prefetch Memory for VPCI */ +#define GUEST_VPCI_ADDR_TYPE_PREFETCH_MEM xen_mk_ullong(0x42000000) +#define GUEST_VPCI_PREFETCH_MEM_ADDR xen_mk_ullong(0x100000000) +#define GUEST_VPCI_PREFETCH_MEM_SIZE xen_mk_ullong(0x100000000) + +#define GUEST_RAM1_BASE xen_mk_ullong(0x0200000000) /* 1016GB of RAM @ 8= GB */ +#define GUEST_RAM1_SIZE xen_mk_ullong(0xfe00000000) + +#define GUEST_RAM_BASE GUEST_RAM0_BASE /* Lowest RAM address */ +/* Largest amount of actual RAM, not including holes */ +#define GUEST_RAM_MAX (GUEST_RAM0_SIZE + GUEST_RAM1_SIZE) +/* Suitable for e.g. const uint64_t ramfoo[] =3D GUEST_RAM_BANK_FOOS; */ +#define GUEST_RAM_BANK_BASES { GUEST_RAM0_BASE, GUEST_RAM1_BASE } +#define GUEST_RAM_BANK_SIZES { GUEST_RAM0_SIZE, GUEST_RAM1_SIZE } + +/* Current supported guest VCPUs */ +#define GUEST_MAX_VCPUS 128 + +/* Interrupts */ +#define GUEST_TIMER_VIRT_PPI 27 +#define GUEST_TIMER_PHYS_S_PPI 29 +#define GUEST_TIMER_PHYS_NS_PPI 30 +#define GUEST_EVTCHN_PPI 31 + +#define GUEST_VPL011_SPI 32 + +/* PSCI functions */ +#define PSCI_cpu_suspend 0 +#define PSCI_cpu_off 1 +#define PSCI_cpu_on 2 +#define PSCI_migrate 3 + +#endif + +#ifndef __ASSEMBLY__ +/* Stub definition of PMU structure */ +typedef struct xen_pmu_arch { uint8_t dummy; } xen_pmu_arch_t; +#endif + +#endif /* __XEN_PUBLIC_ARCH_ARM_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/arch-x86/cpuid.h b/include/hw/xen/int= erface/arch-x86/cpuid.h new file mode 100644 index 000000000000..ce46305bee99 --- /dev/null +++ b/include/hw/xen/interface/arch-x86/cpuid.h @@ -0,0 +1,118 @@ +/*************************************************************************= ***** + * arch-x86/cpuid.h + * + * CPUID interface to Xen. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2007 Citrix Systems, Inc. + * + * Authors: + * Keir Fraser + */ + +#ifndef __XEN_PUBLIC_ARCH_X86_CPUID_H__ +#define __XEN_PUBLIC_ARCH_X86_CPUID_H__ + +/* + * For compatibility with other hypervisor interfaces, the Xen cpuid leaves + * can be found at the first otherwise unused 0x100 aligned boundary start= ing + * from 0x40000000. + * + * e.g If viridian extensions are enabled for an HVM domain, the Xen cpuid + * leaves will start at 0x40000100 + */ + +#define XEN_CPUID_FIRST_LEAF 0x40000000 +#define XEN_CPUID_LEAF(i) (XEN_CPUID_FIRST_LEAF + (i)) + +/* + * Leaf 1 (0x40000x00) + * EAX: Largest Xen-information leaf. All leaves up to an including @EAX + * are supported by the Xen host. + * EBX-EDX: "XenVMMXenVMM" signature, allowing positive identification + * of a Xen host. + */ +#define XEN_CPUID_SIGNATURE_EBX 0x566e6558 /* "XenV" */ +#define XEN_CPUID_SIGNATURE_ECX 0x65584d4d /* "MMXe" */ +#define XEN_CPUID_SIGNATURE_EDX 0x4d4d566e /* "nVMM" */ + +/* + * Leaf 2 (0x40000x01) + * EAX[31:16]: Xen major version. + * EAX[15: 0]: Xen minor version. + * EBX-EDX: Reserved (currently all zeroes). + */ + +/* + * Leaf 3 (0x40000x02) + * EAX: Number of hypercall transfer pages. This register is always guaran= teed + * to specify one hypercall page. + * EBX: Base address of Xen-specific MSRs. + * ECX: Features 1. Unused bits are set to zero. + * EDX: Features 2. Unused bits are set to zero. + */ + +/* Does the host support MMU_PT_UPDATE_PRESERVE_AD for this guest? */ +#define _XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD 0 +#define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD (1u<<0) + +/* + * Leaf 4 (0x40000x03) + * Sub-leaf 0: EAX: bit 0: emulated tsc + * bit 1: host tsc is known to be reliable + * bit 2: RDTSCP instruction available + * EBX: tsc_mode: 0=3Ddefault (emulate if necessary), 1=3Demul= ate, + * 2=3Dno emulation, 3=3Dno emulation + TSC_AUX= support + * ECX: guest tsc frequency in kHz + * EDX: guest tsc incarnation (migration count) + * Sub-leaf 1: EAX: tsc offset low part + * EBX: tsc offset high part + * ECX: multiplicator for tsc->ns conversion + * EDX: shift amount for tsc->ns conversion + * Sub-leaf 2: EAX: host tsc frequency in kHz + */ + +/* + * Leaf 5 (0x40000x04) + * HVM-specific features + * Sub-leaf 0: EAX: Features + * Sub-leaf 0: EBX: vcpu id (iff EAX has XEN_HVM_CPUID_VCPU_ID_PRESENT fla= g) + * Sub-leaf 0: ECX: domain id (iff EAX has XEN_HVM_CPUID_DOMID_PRESENT fla= g) + */ +#define XEN_HVM_CPUID_APIC_ACCESS_VIRT (1u << 0) /* Virtualized APIC regis= ters */ +#define XEN_HVM_CPUID_X2APIC_VIRT (1u << 1) /* Virtualized x2APIC acc= esses */ +/* Memory mapped from other domains has valid IOMMU entries */ +#define XEN_HVM_CPUID_IOMMU_MAPPINGS (1u << 2) +#define XEN_HVM_CPUID_VCPU_ID_PRESENT (1u << 3) /* vcpu id is present in = EBX */ +#define XEN_HVM_CPUID_DOMID_PRESENT (1u << 4) /* domid is present in EC= X */ + +/* + * Leaf 6 (0x40000x05) + * PV-specific parameters + * Sub-leaf 0: EAX: max available sub-leaf + * Sub-leaf 0: EBX: bits 0-7: max machine address width + */ + +/* Max. address width in bits taking memory hotplug into account. */ +#define XEN_CPUID_MACHINE_ADDRESS_WIDTH_MASK (0xffu << 0) + +#define XEN_CPUID_MAX_NUM_LEAVES 5 + +#endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */ diff --git a/include/hw/xen/interface/arch-x86/xen-x86_32.h b/include/hw/xe= n/interface/arch-x86/xen-x86_32.h new file mode 100644 index 000000000000..19d7388633ec --- /dev/null +++ b/include/hw/xen/interface/arch-x86/xen-x86_32.h @@ -0,0 +1,194 @@ +/*************************************************************************= ***** + * xen-x86_32.h + * + * Guest OS interface to x86 32-bit Xen. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2004-2007, K A Fraser + */ + +#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ +#define __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ + +/* + * Hypercall interface: + * Input: %ebx, %ecx, %edx, %esi, %edi, %ebp (arguments 1-6) + * Output: %eax + * Access is via hypercall page (set up by guest loader or via a Xen MSR): + * call hypercall_page + hypercall-number * 32 + * Clobbered: Argument registers (e.g., 2-arg hypercall clobbers %ebx,%ecx) + */ + +/* + * These flat segments are in the Xen-private section of every GDT. Since = these + * are also present in the initial GDT, many OSes will be able to avoid + * installing their own GDT. + */ +#define FLAT_RING1_CS 0xe019 /* GDT index 259 */ +#define FLAT_RING1_DS 0xe021 /* GDT index 260 */ +#define FLAT_RING1_SS 0xe021 /* GDT index 260 */ +#define FLAT_RING3_CS 0xe02b /* GDT index 261 */ +#define FLAT_RING3_DS 0xe033 /* GDT index 262 */ +#define FLAT_RING3_SS 0xe033 /* GDT index 262 */ + +#define FLAT_KERNEL_CS FLAT_RING1_CS +#define FLAT_KERNEL_DS FLAT_RING1_DS +#define FLAT_KERNEL_SS FLAT_RING1_SS +#define FLAT_USER_CS FLAT_RING3_CS +#define FLAT_USER_DS FLAT_RING3_DS +#define FLAT_USER_SS FLAT_RING3_SS + +#define __HYPERVISOR_VIRT_START_PAE 0xF5800000 +#define __MACH2PHYS_VIRT_START_PAE 0xF5800000 +#define __MACH2PHYS_VIRT_END_PAE 0xF6800000 +#define HYPERVISOR_VIRT_START_PAE xen_mk_ulong(__HYPERVISOR_VIRT_STAR= T_PAE) +#define MACH2PHYS_VIRT_START_PAE xen_mk_ulong(__MACH2PHYS_VIRT_START= _PAE) +#define MACH2PHYS_VIRT_END_PAE xen_mk_ulong(__MACH2PHYS_VIRT_END_P= AE) + +/* Non-PAE bounds are obsolete. */ +#define __HYPERVISOR_VIRT_START_NONPAE 0xFC000000 +#define __MACH2PHYS_VIRT_START_NONPAE 0xFC000000 +#define __MACH2PHYS_VIRT_END_NONPAE 0xFC400000 +#define HYPERVISOR_VIRT_START_NONPAE \ + xen_mk_ulong(__HYPERVISOR_VIRT_START_NONPAE) +#define MACH2PHYS_VIRT_START_NONPAE \ + xen_mk_ulong(__MACH2PHYS_VIRT_START_NONPAE) +#define MACH2PHYS_VIRT_END_NONPAE \ + xen_mk_ulong(__MACH2PHYS_VIRT_END_NONPAE) + +#define __HYPERVISOR_VIRT_START __HYPERVISOR_VIRT_START_PAE +#define __MACH2PHYS_VIRT_START __MACH2PHYS_VIRT_START_PAE +#define __MACH2PHYS_VIRT_END __MACH2PHYS_VIRT_END_PAE + +#ifndef HYPERVISOR_VIRT_START +#define HYPERVISOR_VIRT_START xen_mk_ulong(__HYPERVISOR_VIRT_START) +#endif + +#define MACH2PHYS_VIRT_START xen_mk_ulong(__MACH2PHYS_VIRT_START) +#define MACH2PHYS_VIRT_END xen_mk_ulong(__MACH2PHYS_VIRT_END) +#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>= 2) +#ifndef machine_to_phys_mapping +#define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START) +#endif + +/* 32-/64-bit invariability for control interfaces (domctl/sysctl). */ +#if defined(__XEN__) || defined(__XEN_TOOLS__) +#undef ___DEFINE_XEN_GUEST_HANDLE +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef struct { type *p; } \ + __guest_handle_ ## name; \ + typedef struct { union { type *p; uint64_aligned_t q; }; } \ + __guest_handle_64_ ## name +#undef set_xen_guest_handle_raw +#define set_xen_guest_handle_raw(hnd, val) \ + do { if ( sizeof(hnd) =3D=3D 8 ) *(uint64_t *)&(hnd) =3D 0; \ + (hnd).p =3D val; \ + } while ( 0 ) +#define int64_aligned_t int64_t __attribute__((aligned(8))) +#define uint64_aligned_t uint64_t __attribute__((aligned(8))) +#define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name +#define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name) +#endif + +#ifndef __ASSEMBLY__ + +#if defined(XEN_GENERATING_COMPAT_HEADERS) +/* nothing */ +#elif defined(__XEN__) || defined(__XEN_TOOLS__) +/* Anonymous unions include all permissible names (e.g., al/ah/ax/eax). */ +#define __DECL_REG_LO8(which) union { \ + uint32_t e ## which ## x; \ + uint16_t which ## x; \ + struct { \ + uint8_t which ## l; \ + uint8_t which ## h; \ + }; \ +} +#define __DECL_REG_LO16(name) union { \ + uint32_t e ## name, _e ## name; \ + uint16_t name; \ +} +#else +/* Other sources must always use the proper 32-bit name (e.g., eax). */ +#define __DECL_REG_LO8(which) uint32_t e ## which ## x +#define __DECL_REG_LO16(name) uint32_t e ## name +#endif + +struct cpu_user_regs { + __DECL_REG_LO8(b); + __DECL_REG_LO8(c); + __DECL_REG_LO8(d); + __DECL_REG_LO16(si); + __DECL_REG_LO16(di); + __DECL_REG_LO16(bp); + __DECL_REG_LO8(a); + uint16_t error_code; /* private */ + uint16_t entry_vector; /* private */ + __DECL_REG_LO16(ip); + uint16_t cs; + uint8_t saved_upcall_mask; + uint8_t _pad0; + __DECL_REG_LO16(flags); /* eflags.IF =3D=3D !saved_upcall_mask */ + __DECL_REG_LO16(sp); + uint16_t ss, _pad1; + uint16_t es, _pad2; + uint16_t ds, _pad3; + uint16_t fs, _pad4; + uint16_t gs, _pad5; +}; +typedef struct cpu_user_regs cpu_user_regs_t; +DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t); + +#undef __DECL_REG_LO8 +#undef __DECL_REG_LO16 + +/* + * Page-directory addresses above 4GB do not fit into architectural %cr3. + * When accessing %cr3, or equivalent field in vcpu_guest_context, guests + * must use the following accessor macros to pack/unpack valid MFNs. + */ +#define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >>= 20)) +#define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) <<= 20)) + +struct arch_vcpu_info { + unsigned long cr2; + unsigned long pad[5]; /* sizeof(vcpu_info_t) =3D=3D 64 */ +}; +typedef struct arch_vcpu_info arch_vcpu_info_t; + +struct xen_callback { + unsigned long cs; + unsigned long eip; +}; +typedef struct xen_callback xen_callback_t; + +#endif /* !__ASSEMBLY__ */ + +#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/arch-x86/xen-x86_64.h b/include/hw/xe= n/interface/arch-x86/xen-x86_64.h new file mode 100644 index 000000000000..40aed14366d3 --- /dev/null +++ b/include/hw/xen/interface/arch-x86/xen-x86_64.h @@ -0,0 +1,241 @@ +/*************************************************************************= ***** + * xen-x86_64.h + * + * Guest OS interface to x86 64-bit Xen. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2004-2006, K A Fraser + */ + +#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ +#define __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ + +/* + * Hypercall interface: + * Input: %rdi, %rsi, %rdx, %r10, %r8, %r9 (arguments 1-6) + * Output: %rax + * Access is via hypercall page (set up by guest loader or via a Xen MSR): + * call hypercall_page + hypercall-number * 32 + * Clobbered: argument registers (e.g., 2-arg hypercall clobbers %rdi,%rsi) + */ + +/* + * 64-bit segment selectors + * These flat segments are in the Xen-private section of every GDT. Since = these + * are also present in the initial GDT, many OSes will be able to avoid + * installing their own GDT. + */ + +#define FLAT_RING3_CS32 0xe023 /* GDT index 260 */ +#define FLAT_RING3_CS64 0xe033 /* GDT index 262 */ +#define FLAT_RING3_DS32 0xe02b /* GDT index 261 */ +#define FLAT_RING3_DS64 0x0000 /* NULL selector */ +#define FLAT_RING3_SS32 0xe02b /* GDT index 261 */ +#define FLAT_RING3_SS64 0xe02b /* GDT index 261 */ + +#define FLAT_KERNEL_DS64 FLAT_RING3_DS64 +#define FLAT_KERNEL_DS32 FLAT_RING3_DS32 +#define FLAT_KERNEL_DS FLAT_KERNEL_DS64 +#define FLAT_KERNEL_CS64 FLAT_RING3_CS64 +#define FLAT_KERNEL_CS32 FLAT_RING3_CS32 +#define FLAT_KERNEL_CS FLAT_KERNEL_CS64 +#define FLAT_KERNEL_SS64 FLAT_RING3_SS64 +#define FLAT_KERNEL_SS32 FLAT_RING3_SS32 +#define FLAT_KERNEL_SS FLAT_KERNEL_SS64 + +#define FLAT_USER_DS64 FLAT_RING3_DS64 +#define FLAT_USER_DS32 FLAT_RING3_DS32 +#define FLAT_USER_DS FLAT_USER_DS64 +#define FLAT_USER_CS64 FLAT_RING3_CS64 +#define FLAT_USER_CS32 FLAT_RING3_CS32 +#define FLAT_USER_CS FLAT_USER_CS64 +#define FLAT_USER_SS64 FLAT_RING3_SS64 +#define FLAT_USER_SS32 FLAT_RING3_SS32 +#define FLAT_USER_SS FLAT_USER_SS64 + +#define __HYPERVISOR_VIRT_START 0xFFFF800000000000 +#define __HYPERVISOR_VIRT_END 0xFFFF880000000000 +#define __MACH2PHYS_VIRT_START 0xFFFF800000000000 +#define __MACH2PHYS_VIRT_END 0xFFFF804000000000 + +#ifndef HYPERVISOR_VIRT_START +#define HYPERVISOR_VIRT_START xen_mk_ulong(__HYPERVISOR_VIRT_START) +#define HYPERVISOR_VIRT_END xen_mk_ulong(__HYPERVISOR_VIRT_END) +#endif + +#define MACH2PHYS_VIRT_START xen_mk_ulong(__MACH2PHYS_VIRT_START) +#define MACH2PHYS_VIRT_END xen_mk_ulong(__MACH2PHYS_VIRT_END) +#define MACH2PHYS_NR_ENTRIES ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>= 3) +#ifndef machine_to_phys_mapping +#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) +#endif + +/* + * int HYPERVISOR_set_segment_base(unsigned int which, unsigned long base) + * @which =3D=3D SEGBASE_* ; @base =3D=3D 64-bit base address + * Returns 0 on success. + */ +#define SEGBASE_FS 0 +#define SEGBASE_GS_USER 1 +#define SEGBASE_GS_KERNEL 2 +#define SEGBASE_GS_USER_SEL 3 /* Set user %gs specified in base[15:0] */ + +/* + * int HYPERVISOR_iret(void) + * All arguments are on the kernel stack, in the following format. + * Never returns if successful. Current kernel context is lost. + * The saved CS is mapped as follows: + * RING0 -> RING3 kernel mode. + * RING1 -> RING3 kernel mode. + * RING2 -> RING3 kernel mode. + * RING3 -> RING3 user mode. + * However RING0 indicates that the guest kernel should return to iteself + * directly with + * orb $3,1*8(%rsp) + * iretq + * If flags contains VGCF_in_syscall: + * Restore RAX, RIP, RFLAGS, RSP. + * Discard R11, RCX, CS, SS. + * Otherwise: + * Restore RAX, R11, RCX, CS:RIP, RFLAGS, SS:RSP. + * All other registers are saved on hypercall entry and restored to user. + */ +/* Guest exited in SYSCALL context? Return to guest with SYSRET? */ +#define _VGCF_in_syscall 8 +#define VGCF_in_syscall (1<<_VGCF_in_syscall) +#define VGCF_IN_SYSCALL VGCF_in_syscall + +#ifndef __ASSEMBLY__ + +struct iret_context { + /* Top of stack (%rsp at point of hypercall). */ + uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss; + /* Bottom of iret stack frame. */ +}; + +#if defined(__XEN__) || defined(__XEN_TOOLS__) +/* Anonymous unions include all permissible names (e.g., al/ah/ax/eax/rax)= . */ +#define __DECL_REG_LOHI(which) union { \ + uint64_t r ## which ## x; \ + uint32_t e ## which ## x; \ + uint16_t which ## x; \ + struct { \ + uint8_t which ## l; \ + uint8_t which ## h; \ + }; \ +} +#define __DECL_REG_LO8(name) union { \ + uint64_t r ## name; \ + uint32_t e ## name; \ + uint16_t name; \ + uint8_t name ## l; \ +} +#define __DECL_REG_LO16(name) union { \ + uint64_t r ## name; \ + uint32_t e ## name; \ + uint16_t name; \ +} +#define __DECL_REG_HI(num) union { \ + uint64_t r ## num; \ + uint32_t r ## num ## d; \ + uint16_t r ## num ## w; \ + uint8_t r ## num ## b; \ +} +#elif defined(__GNUC__) && !defined(__STRICT_ANSI__) +/* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */ +#define __DECL_REG(name) union { \ + uint64_t r ## name, e ## name; \ + uint32_t _e ## name; \ +} +#else +/* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */ +#define __DECL_REG(name) uint64_t r ## name +#endif + +#ifndef __DECL_REG_LOHI +#define __DECL_REG_LOHI(name) __DECL_REG(name ## x) +#define __DECL_REG_LO8 __DECL_REG +#define __DECL_REG_LO16 __DECL_REG +#define __DECL_REG_HI(num) uint64_t r ## num +#endif + +struct cpu_user_regs { + __DECL_REG_HI(15); + __DECL_REG_HI(14); + __DECL_REG_HI(13); + __DECL_REG_HI(12); + __DECL_REG_LO8(bp); + __DECL_REG_LOHI(b); + __DECL_REG_HI(11); + __DECL_REG_HI(10); + __DECL_REG_HI(9); + __DECL_REG_HI(8); + __DECL_REG_LOHI(a); + __DECL_REG_LOHI(c); + __DECL_REG_LOHI(d); + __DECL_REG_LO8(si); + __DECL_REG_LO8(di); + uint32_t error_code; /* private */ + uint32_t entry_vector; /* private */ + __DECL_REG_LO16(ip); + uint16_t cs, _pad0[1]; + uint8_t saved_upcall_mask; + uint8_t _pad1[3]; + __DECL_REG_LO16(flags); /* rflags.IF =3D=3D !saved_upcall_mask */ + __DECL_REG_LO8(sp); + uint16_t ss, _pad2[3]; + uint16_t es, _pad3[3]; + uint16_t ds, _pad4[3]; + uint16_t fs, _pad5[3]; + uint16_t gs, _pad6[3]; +}; +typedef struct cpu_user_regs cpu_user_regs_t; +DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t); + +#undef __DECL_REG +#undef __DECL_REG_LOHI +#undef __DECL_REG_LO8 +#undef __DECL_REG_LO16 +#undef __DECL_REG_HI + +#define xen_pfn_to_cr3(pfn) ((unsigned long)(pfn) << 12) +#define xen_cr3_to_pfn(cr3) ((unsigned long)(cr3) >> 12) + +struct arch_vcpu_info { + unsigned long cr2; + unsigned long pad; /* sizeof(vcpu_info_t) =3D=3D 64 */ +}; +typedef struct arch_vcpu_info arch_vcpu_info_t; + +typedef unsigned long xen_callback_t; + +#endif /* !__ASSEMBLY__ */ + +#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/arch-x86/xen.h b/include/hw/xen/inter= face/arch-x86/xen.h new file mode 100644 index 000000000000..7acd94c8ebe2 --- /dev/null +++ b/include/hw/xen/interface/arch-x86/xen.h @@ -0,0 +1,398 @@ +/*************************************************************************= ***** + * arch-x86/xen.h + * + * Guest OS interface to x86 Xen. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2004-2006, K A Fraser + */ + +#include "../xen.h" + +#ifndef __XEN_PUBLIC_ARCH_X86_XEN_H__ +#define __XEN_PUBLIC_ARCH_X86_XEN_H__ + +/* Structural guest handles introduced in 0x00030201. */ +#if __XEN_INTERFACE_VERSION__ >=3D 0x00030201 +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef struct { type *p; } __guest_handle_ ## name +#else +#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \ + typedef type * __guest_handle_ ## name +#endif + +/* + * XEN_GUEST_HANDLE represents a guest pointer, when passed as a field + * in a struct in memory. + * XEN_GUEST_HANDLE_PARAM represent a guest pointer, when passed as an + * hypercall argument. + * XEN_GUEST_HANDLE_PARAM and XEN_GUEST_HANDLE are the same on X86 but + * they might not be on other architectures. + */ +#define __DEFINE_XEN_GUEST_HANDLE(name, type) \ + ___DEFINE_XEN_GUEST_HANDLE(name, type); \ + ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type) +#define DEFINE_XEN_GUEST_HANDLE(name) __DEFINE_XEN_GUEST_HANDLE(name, na= me) +#define __XEN_GUEST_HANDLE(name) __guest_handle_ ## name +#define XEN_GUEST_HANDLE(name) __XEN_GUEST_HANDLE(name) +#define XEN_GUEST_HANDLE_PARAM(name) XEN_GUEST_HANDLE(name) +#define set_xen_guest_handle_raw(hnd, val) do { (hnd).p =3D val; } while = (0) +#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val) + +#if defined(__i386__) +# ifdef __XEN__ +__DeFiNe__ __DECL_REG_LO8(which) uint32_t e ## which ## x +__DeFiNe__ __DECL_REG_LO16(name) union { uint32_t e ## name; } +# endif +#include "xen-x86_32.h" +# ifdef __XEN__ +__UnDeF__ __DECL_REG_LO8 +__UnDeF__ __DECL_REG_LO16 +__DeFiNe__ __DECL_REG_LO8(which) e ## which ## x +__DeFiNe__ __DECL_REG_LO16(name) e ## name +# endif +#elif defined(__x86_64__) +#include "xen-x86_64.h" +#endif + +#ifndef __ASSEMBLY__ +typedef unsigned long xen_pfn_t; +#define PRI_xen_pfn "lx" +#define PRIu_xen_pfn "lu" +#endif + +#define XEN_HAVE_PV_GUEST_ENTRY 1 + +#define XEN_HAVE_PV_UPCALL_MASK 1 + +/* + * `incontents 200 segdesc Segment Descriptor Tables + */ +/* + * ` enum neg_errnoval + * ` HYPERVISOR_set_gdt(const xen_pfn_t frames[], unsigned int entries); + * ` + */ +/* + * A number of GDT entries are reserved by Xen. These are not situated at = the + * start of the GDT because some stupid OSes export hard-coded selector va= lues + * in their ABI. These hard-coded values are always near the start of the = GDT, + * so Xen places itself out of the way, at the far end of the GDT. + * + * NB The LDT is set using the MMUEXT_SET_LDT op of HYPERVISOR_mmuext_op + */ +#define FIRST_RESERVED_GDT_PAGE 14 +#define FIRST_RESERVED_GDT_BYTE (FIRST_RESERVED_GDT_PAGE * 4096) +#define FIRST_RESERVED_GDT_ENTRY (FIRST_RESERVED_GDT_BYTE / 8) + + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_update_descriptor(u64 pa, u64 desc); + * ` + * ` @pa The machine physical address of the descriptor to + * ` update. Must be either a descriptor page or writable. + * ` @desc The descriptor value to update, in the same format as a + * ` native descriptor table entry. + */ + +/* Maximum number of virtual CPUs in legacy multi-processor guests. */ +#define XEN_LEGACY_MAX_VCPUS 32 + +#ifndef __ASSEMBLY__ + +typedef unsigned long xen_ulong_t; +#define PRI_xen_ulong "lx" + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_stack_switch(unsigned long ss, unsigned long esp); + * ` + * Sets the stack segment and pointer for the current vcpu. + */ + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_set_trap_table(const struct trap_info traps[]); + * ` + */ +/* + * Send an array of these to HYPERVISOR_set_trap_table(). + * Terminate the array with a sentinel entry, with traps[].address=3D=3D0. + * The privilege level specifies which modes may enter a trap via a softwa= re + * interrupt. On x86/64, since rings 1 and 2 are unavailable, we allocate + * privilege levels as follows: + * Level =3D=3D 0: Noone may enter + * Level =3D=3D 1: Kernel may enter + * Level =3D=3D 2: Kernel may enter + * Level =3D=3D 3: Everyone may enter + * + * Note: For compatibility with kernels not setting up exception handlers + * early enough, Xen will avoid trying to inject #GP (and hence crash + * the domain) when an RDMSR would require this, but no handler was + * set yet. The precise conditions are implementation specific, and + * new code may not rely on such behavior anyway. + */ +#define TI_GET_DPL(_ti) ((_ti)->flags & 3) +#define TI_GET_IF(_ti) ((_ti)->flags & 4) +#define TI_SET_DPL(_ti,_dpl) ((_ti)->flags |=3D (_dpl)) +#define TI_SET_IF(_ti,_if) ((_ti)->flags |=3D ((!!(_if))<<2)) +struct trap_info { + uint8_t vector; /* exception vector = */ + uint8_t flags; /* 0-3: privilege level; 4: clear event enable?= */ + uint16_t cs; /* code selector = */ + unsigned long address; /* code offset = */ +}; +typedef struct trap_info trap_info_t; +DEFINE_XEN_GUEST_HANDLE(trap_info_t); + +typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */ + +/* + * The following is all CPU context. Note that the fpu_ctxt block is filled + * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used. + * + * Also note that when calling DOMCTL_setvcpucontext for HVM guests, not a= ll + * information in this structure is updated, the fields read include: fpu_= ctxt + * (if VGCT_I387_VALID is set), flags, user_regs and debugreg[*]. + * + * Note: VCPUOP_initialise for HVM guests is non-symetric with + * DOMCTL_setvcpucontext, and uses struct vcpu_hvm_context from hvm/hvm_vc= pu.h + */ +struct vcpu_guest_context { + /* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR.= */ + struct { char x[512]; } fpu_ctxt; /* User-level FPU registers = */ +#define VGCF_I387_VALID (1<<0) +#define VGCF_IN_KERNEL (1<<2) +#define _VGCF_i387_valid 0 +#define VGCF_i387_valid (1<<_VGCF_i387_valid) +#define _VGCF_in_kernel 2 +#define VGCF_in_kernel (1<<_VGCF_in_kernel) +#define _VGCF_failsafe_disables_events 3 +#define VGCF_failsafe_disables_events (1<<_VGCF_failsafe_disables_events) +#define _VGCF_syscall_disables_events 4 +#define VGCF_syscall_disables_events (1<<_VGCF_syscall_disables_events) +#define _VGCF_online 5 +#define VGCF_online (1<<_VGCF_online) + unsigned long flags; /* VGCF_* flags = */ + struct cpu_user_regs user_regs; /* User-level CPU registers = */ + struct trap_info trap_ctxt[256]; /* Virtual IDT = */ + unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents= ) */ + unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents= ) */ + unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) = */ + /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */ + unsigned long ctrlreg[8]; /* CR0-CR7 (control registers)= */ + unsigned long debugreg[8]; /* DB0-DB7 (debug registers) = */ +#ifdef __i386__ + unsigned long event_callback_cs; /* CS:EIP of event callback = */ + unsigned long event_callback_eip; + unsigned long failsafe_callback_cs; /* CS:EIP of failsafe callback= */ + unsigned long failsafe_callback_eip; +#else + unsigned long event_callback_eip; + unsigned long failsafe_callback_eip; +#ifdef __XEN__ + union { + unsigned long syscall_callback_eip; + struct { + unsigned int event_callback_cs; /* compat CS of event cb = */ + unsigned int failsafe_callback_cs; /* compat CS of failsafe cb= */ + }; + }; +#else + unsigned long syscall_callback_eip; +#endif +#endif + unsigned long vm_assist; /* VMASST_TYPE_* bitmap */ +#ifdef __x86_64__ + /* Segment base addresses. */ + uint64_t fs_base; + uint64_t gs_base_kernel; + uint64_t gs_base_user; +#endif +}; +typedef struct vcpu_guest_context vcpu_guest_context_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t); + +struct arch_shared_info { + /* + * Number of valid entries in the p2m table(s) anchored at + * pfn_to_mfn_frame_list_list and/or p2m_vaddr. + */ + unsigned long max_pfn; + /* + * Frame containing list of mfns containing list of mfns containing p2= m. + * A value of 0 indicates it has not yet been set up, ~0 indicates it = has + * been set to invalid e.g. due to the p2m being too large for the 3-l= evel + * p2m tree. In this case the linear mapper p2m list anchored at p2m_v= addr + * is to be used. + */ + xen_pfn_t pfn_to_mfn_frame_list_list; + unsigned long nmi_reason; + /* + * Following three fields are valid if p2m_cr3 contains a value differ= ent + * from 0. + * p2m_cr3 is the root of the address space where p2m_vaddr is valid. + * p2m_cr3 is in the same format as a cr3 value in the vcpu register s= tate + * and holds the folded machine frame number (via xen_pfn_to_cr3) of a + * L3 or L4 page table. + * p2m_vaddr holds the virtual address of the linear p2m list. All ent= ries + * in the range [0...max_pfn[ are accessible via this pointer. + * p2m_generation will be incremented by the guest before and after ea= ch + * change of the mappings of the p2m list. p2m_generation starts at 0 = and + * a value with the least significant bit set indicates that a mapping + * update is in progress. This allows guest external software (e.g. in= Dom0) + * to verify that read mappings are consistent and whether they have c= hanged + * since the last check. + * Modifying a p2m element in the linear p2m list is allowed via an at= omic + * write only. + */ + unsigned long p2m_cr3; /* cr3 value of the p2m address space */ + unsigned long p2m_vaddr; /* virtual address of the p2m list */ + unsigned long p2m_generation; /* generation count of p2m mapping */ +#ifdef __i386__ + /* There's no room for this field in the generic structure. */ + uint32_t wc_sec_hi; +#endif +}; +typedef struct arch_shared_info arch_shared_info_t; + +#if defined(__XEN__) || defined(__XEN_TOOLS__) +/* + * struct xen_arch_domainconfig's ABI is covered by + * XEN_DOMCTL_INTERFACE_VERSION. + */ +struct xen_arch_domainconfig { +#define _XEN_X86_EMU_LAPIC 0 +#define XEN_X86_EMU_LAPIC (1U<<_XEN_X86_EMU_LAPIC) +#define _XEN_X86_EMU_HPET 1 +#define XEN_X86_EMU_HPET (1U<<_XEN_X86_EMU_HPET) +#define _XEN_X86_EMU_PM 2 +#define XEN_X86_EMU_PM (1U<<_XEN_X86_EMU_PM) +#define _XEN_X86_EMU_RTC 3 +#define XEN_X86_EMU_RTC (1U<<_XEN_X86_EMU_RTC) +#define _XEN_X86_EMU_IOAPIC 4 +#define XEN_X86_EMU_IOAPIC (1U<<_XEN_X86_EMU_IOAPIC) +#define _XEN_X86_EMU_PIC 5 +#define XEN_X86_EMU_PIC (1U<<_XEN_X86_EMU_PIC) +#define _XEN_X86_EMU_VGA 6 +#define XEN_X86_EMU_VGA (1U<<_XEN_X86_EMU_VGA) +#define _XEN_X86_EMU_IOMMU 7 +#define XEN_X86_EMU_IOMMU (1U<<_XEN_X86_EMU_IOMMU) +#define _XEN_X86_EMU_PIT 8 +#define XEN_X86_EMU_PIT (1U<<_XEN_X86_EMU_PIT) +#define _XEN_X86_EMU_USE_PIRQ 9 +#define XEN_X86_EMU_USE_PIRQ (1U<<_XEN_X86_EMU_USE_PIRQ) +#define _XEN_X86_EMU_VPCI 10 +#define XEN_X86_EMU_VPCI (1U<<_XEN_X86_EMU_VPCI) + +#define XEN_X86_EMU_ALL (XEN_X86_EMU_LAPIC | XEN_X86_EMU_HPET = | \ + XEN_X86_EMU_PM | XEN_X86_EMU_RTC | = \ + XEN_X86_EMU_IOAPIC | XEN_X86_EMU_PIC = | \ + XEN_X86_EMU_VGA | XEN_X86_EMU_IOMMU |= \ + XEN_X86_EMU_PIT | XEN_X86_EMU_USE_PIR= Q |\ + XEN_X86_EMU_VPCI) + uint32_t emulation_flags; + +/* + * Select whether to use a relaxed behavior for accesses to MSRs not expli= citly + * handled by Xen instead of injecting a #GP to the guest. Note this option + * doesn't allow the guest to read or write to the underlying MSR. + */ +#define XEN_X86_MSR_RELAXED (1u << 0) + uint32_t misc_flags; +}; + +/* Location of online VCPU bitmap. */ +#define XEN_ACPI_CPU_MAP 0xaf00 +#define XEN_ACPI_CPU_MAP_LEN ((HVM_MAX_VCPUS + 7) / 8) + +/* GPE0 bit set during CPU hotplug */ +#define XEN_ACPI_GPE0_CPUHP_BIT 2 +#endif + +/* + * Representations of architectural CPUID and MSR information. Used as the + * serialised version of Xen's internal representation. + */ +typedef struct xen_cpuid_leaf { +#define XEN_CPUID_NO_SUBLEAF 0xffffffffu + uint32_t leaf, subleaf; + uint32_t a, b, c, d; +} xen_cpuid_leaf_t; +DEFINE_XEN_GUEST_HANDLE(xen_cpuid_leaf_t); + +typedef struct xen_msr_entry { + uint32_t idx; + uint32_t flags; /* Reserved MBZ. */ + uint64_t val; +} xen_msr_entry_t; +DEFINE_XEN_GUEST_HANDLE(xen_msr_entry_t); + +#endif /* !__ASSEMBLY__ */ + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_fpu_taskswitch(int set); + * ` + * Sets (if set!=3D0) or clears (if set=3D=3D0) CR0.TS. + */ + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_set_debugreg(int regno, unsigned long value); + * + * ` unsigned long + * ` HYPERVISOR_get_debugreg(int regno); + * For 0<=3Dreg<=3D7, returns the debug register value. + * For other values of reg, returns ((unsigned long)-EINVAL). + * (Unfortunately, this interface is defective.) + */ + +/* + * Prefix forces emulation of some non-trapping instructions. + * Currently only CPUID. + */ +#ifdef __ASSEMBLY__ +#define XEN_EMULATE_PREFIX .byte 0x0f,0x0b,0x78,0x65,0x6e ; +#define XEN_CPUID XEN_EMULATE_PREFIX cpuid +#else +#define XEN_EMULATE_PREFIX ".byte 0x0f,0x0b,0x78,0x65,0x6e ; " +#define XEN_CPUID XEN_EMULATE_PREFIX "cpuid" +#endif + +/* + * Debug console IO port, also called "port E9 hack". Each character writt= en + * to this IO port will be printed on the hypervisor console, subject to l= og + * level restrictions. + */ +#define XEN_HVM_DEBUGCONS_IOPORT 0xe9 + +#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/event_channel.h b/include/hw/xen/inte= rface/event_channel.h new file mode 100644 index 000000000000..73c9f38ce1ad --- /dev/null +++ b/include/hw/xen/interface/event_channel.h @@ -0,0 +1,388 @@ +/*************************************************************************= ***** + * event_channel.h + * + * Event channels between domains. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2003-2004, K A Fraser. + */ + +#ifndef __XEN_PUBLIC_EVENT_CHANNEL_H__ +#define __XEN_PUBLIC_EVENT_CHANNEL_H__ + +#include "xen.h" + +/* + * `incontents 150 evtchn Event Channels + * + * Event channels are the basic primitive provided by Xen for event + * notifications. An event is the Xen equivalent of a hardware + * interrupt. They essentially store one bit of information, the event + * of interest is signalled by transitioning this bit from 0 to 1. + * + * Notifications are received by a guest via an upcall from Xen, + * indicating when an event arrives (setting the bit). Further + * notifications are masked until the bit is cleared again (therefore, + * guests must check the value of the bit after re-enabling event + * delivery to ensure no missed notifications). + * + * Event notifications can be masked by setting a flag; this is + * equivalent to disabling interrupts and can be used to ensure + * atomicity of certain operations in the guest kernel. + * + * Event channels are represented by the evtchn_* fields in + * struct shared_info and struct vcpu_info. + */ + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_event_channel_op(enum event_channel_op cmd, void *args) + * ` + * @cmd =3D=3D EVTCHNOP_* (event-channel operation). + * @args =3D=3D struct evtchn_* Operation-specific extra arguments (NULL i= f none). + */ + +/* ` enum event_channel_op { // EVTCHNOP_* =3D> struct evtchn_* */ +#define EVTCHNOP_bind_interdomain 0 +#define EVTCHNOP_bind_virq 1 +#define EVTCHNOP_bind_pirq 2 +#define EVTCHNOP_close 3 +#define EVTCHNOP_send 4 +#define EVTCHNOP_status 5 +#define EVTCHNOP_alloc_unbound 6 +#define EVTCHNOP_bind_ipi 7 +#define EVTCHNOP_bind_vcpu 8 +#define EVTCHNOP_unmask 9 +#define EVTCHNOP_reset 10 +#define EVTCHNOP_init_control 11 +#define EVTCHNOP_expand_array 12 +#define EVTCHNOP_set_priority 13 +#ifdef __XEN__ +#define EVTCHNOP_reset_cont 14 +#endif +/* ` } */ + +typedef uint32_t evtchn_port_t; +DEFINE_XEN_GUEST_HANDLE(evtchn_port_t); + +/* + * EVTCHNOP_alloc_unbound: Allocate a port in domain and mark as + * accepting interdomain bindings from domain . A fresh port + * is allocated in and returned as . + * NOTES: + * 1. If the caller is unprivileged then must be DOMID_SELF. + * 2. may be DOMID_SELF, allowing loopback connections. + */ +struct evtchn_alloc_unbound { + /* IN parameters */ + domid_t dom, remote_dom; + /* OUT parameters */ + evtchn_port_t port; +}; +typedef struct evtchn_alloc_unbound evtchn_alloc_unbound_t; + +/* + * EVTCHNOP_bind_interdomain: Construct an interdomain event channel betwe= en + * the calling domain and . must iden= tify + * a port that is unbound and marked as accepting bindings from the calling + * domain. A fresh port is allocated in the calling domain and returned as + * . + * + * In case the peer domain has already tried to set our event channel + * pending, before it was bound, EVTCHNOP_bind_interdomain always sets + * the local event channel pending. + * + * The usual pattern of use, in the guest's upcall (or subsequent + * handler) is as follows: (Re-enable the event channel for subsequent + * signalling and then) check for the existence of whatever condition + * is being waited for by other means, and take whatever action is + * needed (if any). + * + * NOTES: + * 1. may be DOMID_SELF, allowing loopback connections. + */ +struct evtchn_bind_interdomain { + /* IN parameters. */ + domid_t remote_dom; + evtchn_port_t remote_port; + /* OUT parameters. */ + evtchn_port_t local_port; +}; +typedef struct evtchn_bind_interdomain evtchn_bind_interdomain_t; + +/* + * EVTCHNOP_bind_virq: Bind a local event channel to VIRQ on specifi= ed + * vcpu. + * NOTES: + * 1. Virtual IRQs are classified as per-vcpu or global. See the VIRQ list + * in xen.h for the classification of each VIRQ. + * 2. Global VIRQs must be allocated on VCPU0 but can subsequently be + * re-bound via EVTCHNOP_bind_vcpu. + * 3. Per-vcpu VIRQs may be bound to at most one event channel per vcpu. + * The allocated event channel is bound to the specified vcpu and the + * binding cannot be changed. + */ +struct evtchn_bind_virq { + /* IN parameters. */ + uint32_t virq; /* enum virq */ + uint32_t vcpu; + /* OUT parameters. */ + evtchn_port_t port; +}; +typedef struct evtchn_bind_virq evtchn_bind_virq_t; + +/* + * EVTCHNOP_bind_pirq: Bind a local event channel to a real IRQ (PIRQ ). + * NOTES: + * 1. A physical IRQ may be bound to at most one event channel per domain. + * 2. Only a sufficiently-privileged domain may bind to a physical IRQ. + */ +struct evtchn_bind_pirq { + /* IN parameters. */ + uint32_t pirq; +#define BIND_PIRQ__WILL_SHARE 1 + uint32_t flags; /* BIND_PIRQ__* */ + /* OUT parameters. */ + evtchn_port_t port; +}; +typedef struct evtchn_bind_pirq evtchn_bind_pirq_t; + +/* + * EVTCHNOP_bind_ipi: Bind a local event channel to receive events. + * NOTES: + * 1. The allocated event channel is bound to the specified vcpu. The bin= ding + * may not be changed. + */ +struct evtchn_bind_ipi { + uint32_t vcpu; + /* OUT parameters. */ + evtchn_port_t port; +}; +typedef struct evtchn_bind_ipi evtchn_bind_ipi_t; + +/* + * EVTCHNOP_close: Close a local event channel . If the channel is + * interdomain then the remote end is placed in the unbound state + * (EVTCHNSTAT_unbound), awaiting a new connection. + */ +struct evtchn_close { + /* IN parameters. */ + evtchn_port_t port; +}; +typedef struct evtchn_close evtchn_close_t; + +/* + * EVTCHNOP_send: Send an event to the remote end of the channel whose loc= al + * endpoint is . + */ +struct evtchn_send { + /* IN parameters. */ + evtchn_port_t port; +}; +typedef struct evtchn_send evtchn_send_t; + +/* + * EVTCHNOP_status: Get the current status of the communication channel wh= ich + * has an endpoint at . + * NOTES: + * 1. may be specified as DOMID_SELF. + * 2. Only a sufficiently-privileged domain may obtain the status of an e= vent + * channel for which is not DOMID_SELF. + */ +struct evtchn_status { + /* IN parameters */ + domid_t dom; + evtchn_port_t port; + /* OUT parameters */ +#define EVTCHNSTAT_closed 0 /* Channel is not in use. = */ +#define EVTCHNSTAT_unbound 1 /* Channel is waiting interdom connecti= on.*/ +#define EVTCHNSTAT_interdomain 2 /* Channel is connected to remote domai= n. */ +#define EVTCHNSTAT_pirq 3 /* Channel is bound to a phys IRQ line.= */ +#define EVTCHNSTAT_virq 4 /* Channel is bound to a virtual IRQ li= ne */ +#define EVTCHNSTAT_ipi 5 /* Channel is bound to a virtual IPI li= ne */ + uint32_t status; + uint32_t vcpu; /* VCPU to which this channel is bound.= */ + union { + struct { + domid_t dom; + } unbound; /* EVTCHNSTAT_unbound */ + struct { + domid_t dom; + evtchn_port_t port; + } interdomain; /* EVTCHNSTAT_interdomain */ + uint32_t pirq; /* EVTCHNSTAT_pirq */ + uint32_t virq; /* EVTCHNSTAT_virq */ + } u; +}; +typedef struct evtchn_status evtchn_status_t; + +/* + * EVTCHNOP_bind_vcpu: Specify which vcpu a channel should notify when an + * event is pending. + * NOTES: + * 1. IPI-bound channels always notify the vcpu specified at bind time. + * This binding cannot be changed. + * 2. Per-VCPU VIRQ channels always notify the vcpu specified at bind tim= e. + * This binding cannot be changed. + * 3. All other channels notify vcpu0 by default. This default is set when + * the channel is allocated (a port that is freed and subsequently reu= sed + * has its binding reset to vcpu0). + */ +struct evtchn_bind_vcpu { + /* IN parameters. */ + evtchn_port_t port; + uint32_t vcpu; +}; +typedef struct evtchn_bind_vcpu evtchn_bind_vcpu_t; + +/* + * EVTCHNOP_unmask: Unmask the specified local event-channel port and deli= ver + * a notification to the appropriate VCPU if an event is pending. + */ +struct evtchn_unmask { + /* IN parameters. */ + evtchn_port_t port; +}; +typedef struct evtchn_unmask evtchn_unmask_t; + +/* + * EVTCHNOP_reset: Close all event channels associated with specified doma= in. + * NOTES: + * 1. may be specified as DOMID_SELF. + * 2. Only a sufficiently-privileged domain may specify other than DOMID_= SELF. + * 3. Destroys all control blocks and event array, resets event channel + * operations to 2-level ABI if called with =3D=3D DOMID_SELF an= d FIFO + * ABI was used. Guests should not bind events during EVTCHNOP_reset c= all + * as these events are likely to be lost. + */ +struct evtchn_reset { + /* IN parameters. */ + domid_t dom; +}; +typedef struct evtchn_reset evtchn_reset_t; + +/* + * EVTCHNOP_init_control: initialize the control block for the FIFO ABI. + * + * Note: any events that are currently pending will not be resent and + * will be lost. Guests should call this before binding any event to + * avoid losing any events. + */ +struct evtchn_init_control { + /* IN parameters. */ + uint64_t control_gfn; + uint32_t offset; + uint32_t vcpu; + /* OUT parameters. */ + uint8_t link_bits; + uint8_t _pad[7]; +}; +typedef struct evtchn_init_control evtchn_init_control_t; + +/* + * EVTCHNOP_expand_array: add an additional page to the event array. + */ +struct evtchn_expand_array { + /* IN parameters. */ + uint64_t array_gfn; +}; +typedef struct evtchn_expand_array evtchn_expand_array_t; + +/* + * EVTCHNOP_set_priority: set the priority for an event channel. + */ +struct evtchn_set_priority { + /* IN parameters. */ + evtchn_port_t port; + uint32_t priority; +}; +typedef struct evtchn_set_priority evtchn_set_priority_t; + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_event_channel_op_compat(struct evtchn_op *op) + * ` + * Superceded by new event_channel_op() hypercall since 0x00030202. + */ +struct evtchn_op { + uint32_t cmd; /* enum event_channel_op */ + union { + evtchn_alloc_unbound_t alloc_unbound; + evtchn_bind_interdomain_t bind_interdomain; + evtchn_bind_virq_t bind_virq; + evtchn_bind_pirq_t bind_pirq; + evtchn_bind_ipi_t bind_ipi; + evtchn_close_t close; + evtchn_send_t send; + evtchn_status_t status; + evtchn_bind_vcpu_t bind_vcpu; + evtchn_unmask_t unmask; + } u; +}; +typedef struct evtchn_op evtchn_op_t; +DEFINE_XEN_GUEST_HANDLE(evtchn_op_t); + +/* + * 2-level ABI + */ + +#define EVTCHN_2L_NR_CHANNELS (sizeof(xen_ulong_t) * sizeof(xen_ulong_t) *= 64) + +/* + * FIFO ABI + */ + +/* Events may have priorities from 0 (highest) to 15 (lowest). */ +#define EVTCHN_FIFO_PRIORITY_MAX 0 +#define EVTCHN_FIFO_PRIORITY_DEFAULT 7 +#define EVTCHN_FIFO_PRIORITY_MIN 15 + +#define EVTCHN_FIFO_MAX_QUEUES (EVTCHN_FIFO_PRIORITY_MIN + 1) + +typedef uint32_t event_word_t; + +#define EVTCHN_FIFO_PENDING 31 +#define EVTCHN_FIFO_MASKED 30 +#define EVTCHN_FIFO_LINKED 29 +#define EVTCHN_FIFO_BUSY 28 + +#define EVTCHN_FIFO_LINK_BITS 17 +#define EVTCHN_FIFO_LINK_MASK ((1 << EVTCHN_FIFO_LINK_BITS) - 1) + +#define EVTCHN_FIFO_NR_CHANNELS (1 << EVTCHN_FIFO_LINK_BITS) + +struct evtchn_fifo_control_block { + uint32_t ready; + uint32_t _rsvd; + uint32_t head[EVTCHN_FIFO_MAX_QUEUES]; +}; +typedef struct evtchn_fifo_control_block evtchn_fifo_control_block_t; + +#endif /* __XEN_PUBLIC_EVENT_CHANNEL_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/features.h b/include/hw/xen/interface= /features.h new file mode 100644 index 000000000000..9ee2f760ef9b --- /dev/null +++ b/include/hw/xen/interface/features.h @@ -0,0 +1,143 @@ +/*************************************************************************= ***** + * features.h + * + * Feature flags, reported by XENVER_get_features. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2006, Keir Fraser + */ + +#ifndef __XEN_PUBLIC_FEATURES_H__ +#define __XEN_PUBLIC_FEATURES_H__ + +/* + * `incontents 200 elfnotes_features XEN_ELFNOTE_FEATURES + * + * The list of all the features the guest supports. They are set by + * parsing the XEN_ELFNOTE_FEATURES and XEN_ELFNOTE_SUPPORTED_FEATURES + * string. The format is the feature names (as given here without the + * "XENFEAT_" prefix) separated by '|' characters. + * If a feature is required for the kernel to function then the feature na= me + * must be preceded by a '!' character. + * + * Note that if XEN_ELFNOTE_SUPPORTED_FEATURES is used, then in the + * XENFEAT_dom0 MUST be set if the guest is to be booted as dom0, + */ + +/* + * If set, the guest does not need to write-protect its pagetables, and can + * update them via direct writes. + */ +#define XENFEAT_writable_page_tables 0 + +/* + * If set, the guest does not need to write-protect its segment descriptor + * tables, and can update them via direct writes. + */ +#define XENFEAT_writable_descriptor_tables 1 + +/* + * If set, translation between the guest's 'pseudo-physical' address space + * and the host's machine address space are handled by the hypervisor. In = this + * mode the guest does not need to perform phys-to/from-machine translatio= ns + * when performing page table operations. + */ +#define XENFEAT_auto_translated_physmap 2 + +/* If set, the guest is running in supervisor mode (e.g., x86 ring 0). */ +#define XENFEAT_supervisor_mode_kernel 3 + +/* + * If set, the guest does not need to allocate x86 PAE page directories + * below 4GB. This flag is usually implied by auto_translated_physmap. + */ +#define XENFEAT_pae_pgdir_above_4gb 4 + +/* x86: Does this Xen host support the MMU_PT_UPDATE_PRESERVE_AD hypercall= ? */ +#define XENFEAT_mmu_pt_update_preserve_ad 5 + +/* x86: Does this Xen host support the MMU_{CLEAR,COPY}_PAGE hypercall? */ +#define XENFEAT_highmem_assist 6 + +/* + * If set, GNTTABOP_map_grant_ref honors flags to be placed into guest ker= nel + * available pte bits. + */ +#define XENFEAT_gnttab_map_avail_bits 7 + +/* x86: Does this Xen host support the HVM callback vector type? */ +#define XENFEAT_hvm_callback_vector 8 + +/* x86: pvclock algorithm is safe to use on HVM */ +#define XENFEAT_hvm_safe_pvclock 9 + +/* x86: pirq can be used by HVM guests */ +#define XENFEAT_hvm_pirqs 10 + +/* operation as Dom0 is supported */ +#define XENFEAT_dom0 11 + +/* Xen also maps grant references at pfn =3D mfn. + * This feature flag is deprecated and should not be used. +#define XENFEAT_grant_map_identity 12 + */ + +/* Guest can use XENMEMF_vnode to specify virtual node for memory op. */ +#define XENFEAT_memory_op_vnode_supported 13 + +/* arm: Hypervisor supports ARM SMC calling convention. */ +#define XENFEAT_ARM_SMCCC_supported 14 + +/* + * x86/PVH: If set, ACPI RSDP can be placed at any address. Otherwise RSDP + * must be located in lower 1MB, as required by ACPI Specification for IA-= PC + * systems. + * This feature flag is only consulted if XEN_ELFNOTE_GUEST_OS contains + * the "linux" string. + */ +#define XENFEAT_linux_rsdp_unrestricted 15 + +/* + * A direct-mapped (or 1:1 mapped) domain is a domain for which its + * local pages have gfn =3D=3D mfn. If a domain is direct-mapped, + * XENFEAT_direct_mapped is set; otherwise XENFEAT_not_direct_mapped + * is set. + * + * If neither flag is set (e.g. older Xen releases) the assumptions are: + * - not auto_translated domains (x86 only) are always direct-mapped + * - on x86, auto_translated domains are not direct-mapped + * - on ARM, Dom0 is direct-mapped, DomUs are not + */ +#define XENFEAT_not_direct_mapped 16 +#define XENFEAT_direct_mapped 17 + +#define XENFEAT_NR_SUBMAPS 1 + +#endif /* __XEN_PUBLIC_FEATURES_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/grant_table.h b/include/hw/xen/interf= ace/grant_table.h index 2af0cbdde353..7934d7b718a0 100644 --- a/include/hw/xen/interface/grant_table.h +++ b/include/hw/xen/interface/grant_table.h @@ -28,9 +28,659 @@ #ifndef __XEN_PUBLIC_GRANT_TABLE_H__ #define __XEN_PUBLIC_GRANT_TABLE_H__ =20 +#include "xen.h" + +/* + * `incontents 150 gnttab Grant Tables + * + * Xen's grant tables provide a generic mechanism to memory sharing + * between domains. This shared memory interface underpins the split + * device drivers for block and network IO. + * + * Each domain has its own grant table. This is a data structure that + * is shared with Xen; it allows the domain to tell Xen what kind of + * permissions other domains have on its pages. Entries in the grant + * table are identified by grant references. A grant reference is an + * integer, which indexes into the grant table. It acts as a + * capability which the grantee can use to perform operations on the + * granter's memory. + * + * This capability-based system allows shared-memory communications + * between unprivileged domains. A grant reference also encapsulates + * the details of a shared page, removing the need for a domain to + * know the real machine address of a page it is sharing. This makes + * it possible to share memory correctly with domains running in + * fully virtualised memory. + */ + +/*********************************** + * GRANT TABLE REPRESENTATION + */ + +/* Some rough guidelines on accessing and updating grant-table entries + * in a concurrency-safe manner. For more information, Linux contains a + * reference implementation for guest OSes (drivers/xen/grant_table.c, see + * http://git.kernel.org/?p=3Dlinux/kernel/git/torvalds/linux.git;a=3Dblob= ;f=3Ddrivers/xen/grant-table.c;hb=3DHEAD + * + * NB. WMB is a no-op on current-generation x86 processors. However, a + * compiler barrier will still be required. + * + * Introducing a valid entry into the grant table: + * 1. Write ent->domid. + * 2. Write ent->frame: + * GTF_permit_access: Frame to which access is permitted. + * GTF_accept_transfer: Pseudo-phys frame slot being filled by new + * frame, or zero if none. + * 3. Write memory barrier (WMB). + * 4. Write ent->flags, inc. valid type. + * + * Invalidating an unused GTF_permit_access entry: + * 1. flags =3D ent->flags. + * 2. Observe that !(flags & (GTF_reading|GTF_writing)). + * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0). + * NB. No need for WMB as reuse of entry is control-dependent on success = of + * step 3, and all architectures guarantee ordering of ctrl-dep write= s. + * + * Invalidating an in-use GTF_permit_access entry: + * This cannot be done directly. Request assistance from the domain contr= oller + * which can set a timeout on the use of a grant entry and take necessary + * action. (NB. This is not yet implemented!). + * + * Invalidating an unused GTF_accept_transfer entry: + * 1. flags =3D ent->flags. + * 2. Observe that !(flags & GTF_transfer_committed). [*] + * 3. Check result of SMP-safe CMPXCHG(&ent->flags, flags, 0). + * NB. No need for WMB as reuse of entry is control-dependent on success = of + * step 3, and all architectures guarantee ordering of ctrl-dep write= s. + * [*] If GTF_transfer_committed is set then the grant entry is 'committe= d'. + * The guest must /not/ modify the grant entry until the address of t= he + * transferred frame is written. It is safe for the guest to spin wai= ting + * for this to occur (detect by observing GTF_transfer_completed in + * ent->flags). + * + * Invalidating a committed GTF_accept_transfer entry: + * 1. Wait for (ent->flags & GTF_transfer_completed). + * + * Changing a GTF_permit_access from writable to read-only: + * Use SMP-safe CMPXCHG to set GTF_readonly, while checking !GTF_writing. + * + * Changing a GTF_permit_access from read-only to writable: + * Use SMP-safe bit-setting instruction. + */ + /* * Reference to a grant entry in a specified domain's grant table. */ typedef uint32_t grant_ref_t; =20 +/* + * A grant table comprises a packed array of grant entries in one or more + * page frames shared between Xen and a guest. + * [XEN]: This field is written by Xen and read by the sharing guest. + * [GST]: This field is written by the guest and read by Xen. + */ + +/* + * Version 1 of the grant table entry structure is maintained largely for + * backwards compatibility. New guests are recommended to support using + * version 2 to overcome version 1 limitations, but to default to version = 1. + */ +#if __XEN_INTERFACE_VERSION__ < 0x0003020a +#define grant_entry_v1 grant_entry +#define grant_entry_v1_t grant_entry_t +#endif +struct grant_entry_v1 { + /* GTF_xxx: various type and flag information. [XEN,GST] */ + uint16_t flags; + /* The domain being granted foreign privileges. [GST] */ + domid_t domid; + /* + * GTF_permit_access: GFN that @domid is allowed to map and access. [G= ST] + * GTF_accept_transfer: GFN that @domid is allowed to transfer into. [= GST] + * GTF_transfer_completed: MFN whose ownership transferred by @domid + * (non-translated guests only). [XEN] + */ + uint32_t frame; +}; +typedef struct grant_entry_v1 grant_entry_v1_t; + +/* The first few grant table entries will be preserved across grant table + * version changes and may be pre-populated at domain creation by tools. + */ +#define GNTTAB_NR_RESERVED_ENTRIES 8 +#define GNTTAB_RESERVED_CONSOLE 0 +#define GNTTAB_RESERVED_XENSTORE 1 + +/* + * Type of grant entry. + * GTF_invalid: This grant entry grants no privileges. + * GTF_permit_access: Allow @domid to map/access @frame. + * GTF_accept_transfer: Allow @domid to transfer ownership of one page fr= ame + * to this guest. Xen writes the page number to @fra= me. + * GTF_transitive: Allow @domid to transitively access a subrange of + * @trans_grant in @trans_domid. No mappings are allowed. + */ +#define GTF_invalid (0U<<0) +#define GTF_permit_access (1U<<0) +#define GTF_accept_transfer (2U<<0) +#define GTF_transitive (3U<<0) +#define GTF_type_mask (3U<<0) + +/* + * Subflags for GTF_permit_access and GTF_transitive. + * GTF_readonly: Restrict @domid to read-only mappings and accesses. [GST] + * GTF_reading: Grant entry is currently mapped for reading by @domid. [X= EN] + * GTF_writing: Grant entry is currently mapped for writing by @domid. [X= EN] + * Further subflags for GTF_permit_access only. + * GTF_PAT, GTF_PWT, GTF_PCD: (x86) cache attribute flags to be used for + * mappings of the grant [GST] + * GTF_sub_page: Grant access to only a subrange of the page. @domid + * will only be allowed to copy from the grant, and not + * map it. [GST] + */ +#define _GTF_readonly (2) +#define GTF_readonly (1U<<_GTF_readonly) +#define _GTF_reading (3) +#define GTF_reading (1U<<_GTF_reading) +#define _GTF_writing (4) +#define GTF_writing (1U<<_GTF_writing) +#define _GTF_PWT (5) +#define GTF_PWT (1U<<_GTF_PWT) +#define _GTF_PCD (6) +#define GTF_PCD (1U<<_GTF_PCD) +#define _GTF_PAT (7) +#define GTF_PAT (1U<<_GTF_PAT) +#define _GTF_sub_page (8) +#define GTF_sub_page (1U<<_GTF_sub_page) + +/* + * Subflags for GTF_accept_transfer: + * GTF_transfer_committed: Xen sets this flag to indicate that it is comm= itted + * to transferring ownership of a page frame. When a guest sees this = flag + * it must /not/ modify the grant entry until GTF_transfer_completed = is + * set by Xen. + * GTF_transfer_completed: It is safe for the guest to spin-wait on this = flag + * after reading GTF_transfer_committed. Xen will always write the fr= ame + * address, followed by ORing this flag, in a timely manner. + */ +#define _GTF_transfer_committed (2) +#define GTF_transfer_committed (1U<<_GTF_transfer_committed) +#define _GTF_transfer_completed (3) +#define GTF_transfer_completed (1U<<_GTF_transfer_completed) + +/* + * Version 2 grant table entries. These fulfil the same role as + * version 1 entries, but can represent more complicated operations. + * Any given domain will have either a version 1 or a version 2 table, + * and every entry in the table will be the same version. + * + * The interface by which domains use grant references does not depend + * on the grant table version in use by the other domain. + */ +#if __XEN_INTERFACE_VERSION__ >=3D 0x0003020a +/* + * Version 1 and version 2 grant entries share a common prefix. The + * fields of the prefix are documented as part of struct + * grant_entry_v1. + */ +struct grant_entry_header { + uint16_t flags; + domid_t domid; +}; +typedef struct grant_entry_header grant_entry_header_t; + +/* + * Version 2 of the grant entry structure. + */ +union grant_entry_v2 { + grant_entry_header_t hdr; + + /* + * This member is used for V1-style full page grants, where either: + * + * -- hdr.type is GTF_accept_transfer, or + * -- hdr.type is GTF_permit_access and GTF_sub_page is not set. + * + * In that case, the frame field has the same semantics as the + * field of the same name in the V1 entry structure. + */ + struct { + grant_entry_header_t hdr; + uint32_t pad0; + uint64_t frame; + } full_page; + + /* + * If the grant type is GTF_grant_access and GTF_sub_page is set, + * @domid is allowed to access bytes [@page_off,@page_off+@length) + * in frame @frame. + */ + struct { + grant_entry_header_t hdr; + uint16_t page_off; + uint16_t length; + uint64_t frame; + } sub_page; + + /* + * If the grant is GTF_transitive, @domid is allowed to use the + * grant @gref in domain @trans_domid, as if it was the local + * domain. Obviously, the transitive access must be compatible + * with the original grant. + * + * The current version of Xen does not allow transitive grants + * to be mapped. + */ + struct { + grant_entry_header_t hdr; + domid_t trans_domid; + uint16_t pad0; + grant_ref_t gref; + } transitive; + + uint32_t __spacer[4]; /* Pad to a power of two */ +}; +typedef union grant_entry_v2 grant_entry_v2_t; + +typedef uint16_t grant_status_t; + +#endif /* __XEN_INTERFACE_VERSION__ */ + +/*********************************** + * GRANT TABLE QUERIES AND USES + */ + +/* ` enum neg_errnoval + * ` HYPERVISOR_grant_table_op(enum grant_table_op cmd, + * ` void *args, + * ` unsigned int count) + * ` + * + * @args points to an array of a per-command data structure. The array + * has @count members + */ + +/* ` enum grant_table_op { // GNTTABOP_* =3D> struct gnttab_* */ +#define GNTTABOP_map_grant_ref 0 +#define GNTTABOP_unmap_grant_ref 1 +#define GNTTABOP_setup_table 2 +#define GNTTABOP_dump_table 3 +#define GNTTABOP_transfer 4 +#define GNTTABOP_copy 5 +#define GNTTABOP_query_size 6 +#define GNTTABOP_unmap_and_replace 7 +#if __XEN_INTERFACE_VERSION__ >=3D 0x0003020a +#define GNTTABOP_set_version 8 +#define GNTTABOP_get_status_frames 9 +#define GNTTABOP_get_version 10 +#define GNTTABOP_swap_grant_ref 11 +#define GNTTABOP_cache_flush 12 +#endif /* __XEN_INTERFACE_VERSION__ */ +/* ` } */ + +/* + * Handle to track a mapping created via a grant reference. + */ +typedef uint32_t grant_handle_t; + +/* + * GNTTABOP_map_grant_ref: Map the grant entry (,) for access + * by devices and/or host CPUs. If successful, is a tracking numb= er + * that must be presented later to destroy the mapping(s). On error, + * is a negative status code. + * NOTES: + * 1. If GNTMAP_device_map is specified then is the address + * via which I/O devices may access the granted frame. + * 2. If GNTMAP_host_map is specified then a mapping will be added at + * either a host virtual address in the current address space, or at + * a PTE at the specified machine address. The type of mapping to + * perform is selected through the GNTMAP_contains_pte flag, and the + * address is specified in . + * 3. Mappings should only be destroyed via GNTTABOP_unmap_grant_ref. If a + * host mapping is destroyed by other means then it is *NOT* guaranteed + * to be accounted to the correct grant reference! + */ +struct gnttab_map_grant_ref { + /* IN parameters. */ + uint64_t host_addr; + uint32_t flags; /* GNTMAP_* */ + grant_ref_t ref; + domid_t dom; + /* OUT parameters. */ + int16_t status; /* =3D> enum grant_status */ + grant_handle_t handle; + uint64_t dev_bus_addr; +}; +typedef struct gnttab_map_grant_ref gnttab_map_grant_ref_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_map_grant_ref_t); + +/* + * GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings + * tracked by . If or is zero, that + * field is ignored. If non-zero, they must refer to a device/host mapping + * that is tracked by + * NOTES: + * 1. The call may fail in an undefined manner if either mapping is not + * tracked by . + * 3. After executing a batch of unmaps, it is guaranteed that no stale + * mappings will remain in the device or host TLBs. + */ +struct gnttab_unmap_grant_ref { + /* IN parameters. */ + uint64_t host_addr; + uint64_t dev_bus_addr; + grant_handle_t handle; + /* OUT parameters. */ + int16_t status; /* =3D> enum grant_status */ +}; +typedef struct gnttab_unmap_grant_ref gnttab_unmap_grant_ref_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_grant_ref_t); + +/* + * GNTTABOP_setup_table: Set up a grant table for comprising at least + * pages. The frame addresses are written to the . + * Only addresses are written, even if the table is larger. + * NOTES: + * 1. may be specified as DOMID_SELF. + * 2. Only a sufficiently-privileged domain may specify !=3D DOMID_= SELF. + * 3. Xen may not support more than a single grant-table page per domain. + */ +struct gnttab_setup_table { + /* IN parameters. */ + domid_t dom; + uint32_t nr_frames; + /* OUT parameters. */ + int16_t status; /* =3D> enum grant_status */ +#if __XEN_INTERFACE_VERSION__ < 0x00040300 + XEN_GUEST_HANDLE(ulong) frame_list; +#else + XEN_GUEST_HANDLE(xen_pfn_t) frame_list; +#endif +}; +typedef struct gnttab_setup_table gnttab_setup_table_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_setup_table_t); + +/* + * GNTTABOP_dump_table: Dump the contents of the grant table to the + * xen console. Debugging use only. + */ +struct gnttab_dump_table { + /* IN parameters. */ + domid_t dom; + /* OUT parameters. */ + int16_t status; /* =3D> enum grant_status */ +}; +typedef struct gnttab_dump_table gnttab_dump_table_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_dump_table_t); + +/* + * GNTTABOP_transfer: Transfer to a foreign domain. The foreign do= main + * has previously registered its interest in the transfer via . + * + * Note that, even if the transfer fails, the specified page no longer bel= ongs + * to the calling domain *unless* the error is GNTST_bad_page. + * + * Note further that only PV guests can use this operation. + */ +struct gnttab_transfer { + /* IN parameters. */ + xen_pfn_t mfn; + domid_t domid; + grant_ref_t ref; + /* OUT parameters. */ + int16_t status; +}; +typedef struct gnttab_transfer gnttab_transfer_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_transfer_t); + + +/* + * GNTTABOP_copy: Hypervisor based copy + * source and destinations can be eithers MFNs or, for foreign domains, + * grant references. the foreign domain has to grant read/write access + * in its grant table. + * + * The flags specify what type source and destinations are (either MFN + * or grant reference). + * + * Note that this can also be used to copy data between two domains + * via a third party if the source and destination domains had previously + * grant appropriate access to their pages to the third party. + * + * source_offset specifies an offset in the source frame, dest_offset + * the offset in the target frame and len specifies the number of + * bytes to be copied. + */ + +#define _GNTCOPY_source_gref (0) +#define GNTCOPY_source_gref (1<<_GNTCOPY_source_gref) +#define _GNTCOPY_dest_gref (1) +#define GNTCOPY_dest_gref (1<<_GNTCOPY_dest_gref) + +struct gnttab_copy { + /* IN parameters. */ + struct gnttab_copy_ptr { + union { + grant_ref_t ref; + xen_pfn_t gmfn; + } u; + domid_t domid; + uint16_t offset; + } source, dest; + uint16_t len; + uint16_t flags; /* GNTCOPY_* */ + /* OUT parameters. */ + int16_t status; +}; +typedef struct gnttab_copy gnttab_copy_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_copy_t); + +/* + * GNTTABOP_query_size: Query the current and maximum sizes of the shared + * grant table. + * NOTES: + * 1. may be specified as DOMID_SELF. + * 2. Only a sufficiently-privileged domain may specify !=3D DOMID_= SELF. + */ +struct gnttab_query_size { + /* IN parameters. */ + domid_t dom; + /* OUT parameters. */ + uint32_t nr_frames; + uint32_t max_nr_frames; + int16_t status; /* =3D> enum grant_status */ +}; +typedef struct gnttab_query_size gnttab_query_size_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_query_size_t); + +/* + * GNTTABOP_unmap_and_replace: Destroy one or more grant-reference mappings + * tracked by but atomically replace the page table entry with one + * pointing to the machine address under . will be + * redirected to the null entry. + * NOTES: + * 1. The call may fail in an undefined manner if either mapping is not + * tracked by . + * 2. After executing a batch of unmaps, it is guaranteed that no stale + * mappings will remain in the device or host TLBs. + */ +struct gnttab_unmap_and_replace { + /* IN parameters. */ + uint64_t host_addr; + uint64_t new_addr; + grant_handle_t handle; + /* OUT parameters. */ + int16_t status; /* =3D> enum grant_status */ +}; +typedef struct gnttab_unmap_and_replace gnttab_unmap_and_replace_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_unmap_and_replace_t); + +#if __XEN_INTERFACE_VERSION__ >=3D 0x0003020a +/* + * GNTTABOP_set_version: Request a particular version of the grant + * table shared table structure. This operation may be used to toggle + * between different versions, but must be performed while no grants + * are active. The only defined versions are 1 and 2. + */ +struct gnttab_set_version { + /* IN/OUT parameters */ + uint32_t version; +}; +typedef struct gnttab_set_version gnttab_set_version_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_set_version_t); + + +/* + * GNTTABOP_get_status_frames: Get the list of frames used to store grant + * status for . In grant format version 2, the status is separated + * from the other shared grant fields to allow more efficient synchronizat= ion + * using barriers instead of atomic cmpexch operations. + * specify the size of vector . + * The frame addresses are returned in the . + * Only addresses are returned, even if the table is larger. + * NOTES: + * 1. may be specified as DOMID_SELF. + * 2. Only a sufficiently-privileged domain may specify !=3D DOMID_= SELF. + */ +struct gnttab_get_status_frames { + /* IN parameters. */ + uint32_t nr_frames; + domid_t dom; + /* OUT parameters. */ + int16_t status; /* =3D> enum grant_status */ + XEN_GUEST_HANDLE(uint64_t) frame_list; +}; +typedef struct gnttab_get_status_frames gnttab_get_status_frames_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_get_status_frames_t); + +/* + * GNTTABOP_get_version: Get the grant table version which is in + * effect for domain . + */ +struct gnttab_get_version { + /* IN parameters */ + domid_t dom; + uint16_t pad; + /* OUT parameters */ + uint32_t version; +}; +typedef struct gnttab_get_version gnttab_get_version_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_get_version_t); + +/* + * GNTTABOP_swap_grant_ref: Swap the contents of two grant entries. + */ +struct gnttab_swap_grant_ref { + /* IN parameters */ + grant_ref_t ref_a; + grant_ref_t ref_b; + /* OUT parameters */ + int16_t status; /* =3D> enum grant_status */ +}; +typedef struct gnttab_swap_grant_ref gnttab_swap_grant_ref_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_swap_grant_ref_t); + +/* + * Issue one or more cache maintenance operations on a portion of a + * page granted to the calling domain by a foreign domain. + */ +struct gnttab_cache_flush { + union { + uint64_t dev_bus_addr; + grant_ref_t ref; + } a; + uint16_t offset; /* offset from start of grant */ + uint16_t length; /* size within the grant */ +#define GNTTAB_CACHE_CLEAN (1u<<0) +#define GNTTAB_CACHE_INVAL (1u<<1) +#define GNTTAB_CACHE_SOURCE_GREF (1u<<31) + uint32_t op; +}; +typedef struct gnttab_cache_flush gnttab_cache_flush_t; +DEFINE_XEN_GUEST_HANDLE(gnttab_cache_flush_t); + +#endif /* __XEN_INTERFACE_VERSION__ */ + +/* + * Bitfield values for gnttab_map_grant_ref.flags. + */ + /* Map the grant entry for access by I/O devices. */ +#define _GNTMAP_device_map (0) +#define GNTMAP_device_map (1<<_GNTMAP_device_map) + /* Map the grant entry for access by host CPUs. */ +#define _GNTMAP_host_map (1) +#define GNTMAP_host_map (1<<_GNTMAP_host_map) + /* Accesses to the granted frame will be restricted to read-only access. = */ +#define _GNTMAP_readonly (2) +#define GNTMAP_readonly (1<<_GNTMAP_readonly) + /* + * GNTMAP_host_map subflag: + * 0 =3D> The host mapping is usable only by the guest OS. + * 1 =3D> The host mapping is usable by guest OS + current application. + */ +#define _GNTMAP_application_map (3) +#define GNTMAP_application_map (1<<_GNTMAP_application_map) + + /* + * GNTMAP_contains_pte subflag: + * 0 =3D> This map request contains a host virtual address. + * 1 =3D> This map request contains the machine addess of the PTE to upd= ate. + */ +#define _GNTMAP_contains_pte (4) +#define GNTMAP_contains_pte (1<<_GNTMAP_contains_pte) + +/* + * Bits to be placed in guest kernel available PTE bits (architecture + * dependent; only supported when XENFEAT_gnttab_map_avail_bits is set). + */ +#define _GNTMAP_guest_avail0 (16) +#define GNTMAP_guest_avail_mask ((uint32_t)~0 << _GNTMAP_guest_avail0) + +/* + * Values for error status returns. All errors are -ve. + */ +/* ` enum grant_status { */ +#define GNTST_okay (0) /* Normal return. = */ +#define GNTST_general_error (-1) /* General undefined error. = */ +#define GNTST_bad_domain (-2) /* Unrecognsed domain id. = */ +#define GNTST_bad_gntref (-3) /* Unrecognised or inappropriate gntre= f. */ +#define GNTST_bad_handle (-4) /* Unrecognised or inappropriate handl= e. */ +#define GNTST_bad_virt_addr (-5) /* Inappropriate virtual address to ma= p. */ +#define GNTST_bad_dev_addr (-6) /* Inappropriate device address to unm= ap.*/ +#define GNTST_no_device_space (-7) /* Out of space in I/O MMU. = */ +#define GNTST_permission_denied (-8) /* Not enough privilege for operation= . */ +#define GNTST_bad_page (-9) /* Specified page was invalid for op. = */ +#define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary.= */ +#define GNTST_address_too_big (-11) /* transfer page address too large. = */ +#define GNTST_eagain (-12) /* Operation not done; try again. = */ +#define GNTST_no_space (-13) /* Out of space (handles etc). = */ +/* ` } */ + +#define GNTTABOP_error_msgs { \ + "okay", \ + "undefined error", \ + "unrecognised domain id", \ + "invalid grant reference", \ + "invalid mapping handle", \ + "invalid virtual address", \ + "invalid device address", \ + "no spare translation slot in the I/O MMU", \ + "permission denied", \ + "bad page", \ + "copy arguments cross page boundary", \ + "page address size too large", \ + "operation not done; try again", \ + "out of space", \ +} + #endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/hvm/hvm_op.h b/include/hw/xen/interfa= ce/hvm/hvm_op.h new file mode 100644 index 000000000000..870ec5206072 --- /dev/null +++ b/include/hw/xen/interface/hvm/hvm_op.h @@ -0,0 +1,395 @@ +/* + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2007, Keir Fraser + */ + +#ifndef __XEN_PUBLIC_HVM_HVM_OP_H__ +#define __XEN_PUBLIC_HVM_HVM_OP_H__ + +#include "../xen.h" +#include "../trace.h" +#include "../event_channel.h" + +/* Get/set subcommands: extra argument =3D=3D pointer to xen_hvm_param str= uct. */ +#define HVMOP_set_param 0 +#define HVMOP_get_param 1 +struct xen_hvm_param { + domid_t domid; /* IN */ + uint16_t pad; + uint32_t index; /* IN */ + uint64_t value; /* IN/OUT */ +}; +typedef struct xen_hvm_param xen_hvm_param_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t); + +struct xen_hvm_altp2m_suppress_ve { + uint16_t view; + uint8_t suppress_ve; /* Boolean type. */ + uint8_t pad1; + uint32_t pad2; + uint64_t gfn; +}; + +struct xen_hvm_altp2m_suppress_ve_multi { + uint16_t view; + uint8_t suppress_ve; /* Boolean type. */ + uint8_t pad1; + int32_t first_error; /* Should be set to 0. */ + uint64_t first_gfn; /* Value may be updated. */ + uint64_t last_gfn; + uint64_t first_error_gfn; /* Gfn of the first error. */ +}; + +#if __XEN_INTERFACE_VERSION__ < 0x00040900 + +/* Set the logical level of one of a domain's PCI INTx wires. */ +#define HVMOP_set_pci_intx_level 2 +struct xen_hvm_set_pci_intx_level { + /* Domain to be updated. */ + domid_t domid; + /* PCI INTx identification in PCI topology (domain:bus:device:intx). */ + uint8_t domain, bus, device, intx; + /* Assertion level (0 =3D unasserted, 1 =3D asserted). */ + uint8_t level; +}; +typedef struct xen_hvm_set_pci_intx_level xen_hvm_set_pci_intx_level_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t); + +/* Set the logical level of one of a domain's ISA IRQ wires. */ +#define HVMOP_set_isa_irq_level 3 +struct xen_hvm_set_isa_irq_level { + /* Domain to be updated. */ + domid_t domid; + /* ISA device identification, by ISA IRQ (0-15). */ + uint8_t isa_irq; + /* Assertion level (0 =3D unasserted, 1 =3D asserted). */ + uint8_t level; +}; +typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t); + +#define HVMOP_set_pci_link_route 4 +struct xen_hvm_set_pci_link_route { + /* Domain to be updated. */ + domid_t domid; + /* PCI link identifier (0-3). */ + uint8_t link; + /* ISA IRQ (1-15), or 0 (disable link). */ + uint8_t isa_irq; +}; +typedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t); + +#endif /* __XEN_INTERFACE_VERSION__ < 0x00040900 */ + +/* Flushes all VCPU TLBs: @arg must be NULL. */ +#define HVMOP_flush_tlbs 5 + +/* + * hvmmem_type_t should not be defined when generating the corresponding + * compat header. This will ensure that the improperly named HVMMEM_(*) + * values are defined only once. + */ +#ifndef XEN_GENERATING_COMPAT_HEADERS + +typedef enum { + HVMMEM_ram_rw, /* Normal read/write guest RAM */ + HVMMEM_ram_ro, /* Read-only; writes are discarded */ + HVMMEM_mmio_dm, /* Reads and write go to the device model */ +#if __XEN_INTERFACE_VERSION__ < 0x00040700 + HVMMEM_mmio_write_dm, /* Read-only; writes go to the device model= */ +#else + HVMMEM_unused, /* Placeholder; setting memory to this type + will fail for code after 4.7.0 */ +#endif + HVMMEM_ioreq_server /* Memory type claimed by an ioreq server; = type + changes to this value are only allowed a= fter + an ioreq server has claimed its ownershi= p. + Only pages with HVMMEM_ram_rw are allowe= d to + change to this type; conversely, pages w= ith + this type are only allowed to be changed= back + to HVMMEM_ram_rw. */ +} hvmmem_type_t; + +#endif /* XEN_GENERATING_COMPAT_HEADERS */ + +/* Hint from PV drivers for pagetable destruction. */ +#define HVMOP_pagetable_dying 9 +struct xen_hvm_pagetable_dying { + /* Domain with a pagetable about to be destroyed. */ + domid_t domid; + uint16_t pad[3]; /* align next field on 8-byte boundary */ + /* guest physical address of the toplevel pagetable dying */ + uint64_t gpa; +}; +typedef struct xen_hvm_pagetable_dying xen_hvm_pagetable_dying_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_pagetable_dying_t); + +/* Get the current Xen time, in nanoseconds since system boot. */ +#define HVMOP_get_time 10 +struct xen_hvm_get_time { + uint64_t now; /* OUT */ +}; +typedef struct xen_hvm_get_time xen_hvm_get_time_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_time_t); + +#define HVMOP_xentrace 11 +struct xen_hvm_xentrace { + uint16_t event, extra_bytes; + uint8_t extra[TRACE_EXTRA_MAX * sizeof(uint32_t)]; +}; +typedef struct xen_hvm_xentrace xen_hvm_xentrace_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t); + +/* Following tools-only interfaces may change in future. */ +#if defined(__XEN__) || defined(__XEN_TOOLS__) + +/* Deprecated by XENMEM_access_op_set_access */ +#define HVMOP_set_mem_access 12 + +/* Deprecated by XENMEM_access_op_get_access */ +#define HVMOP_get_mem_access 13 + +#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ + +#define HVMOP_get_mem_type 15 +/* Return hvmmem_type_t for the specified pfn. */ +struct xen_hvm_get_mem_type { + /* Domain to be queried. */ + domid_t domid; + /* OUT variable. */ + uint16_t mem_type; + uint16_t pad[2]; /* align next field on 8-byte boundary */ + /* IN variable. */ + uint64_t pfn; +}; +typedef struct xen_hvm_get_mem_type xen_hvm_get_mem_type_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_type_t); + +/* Following tools-only interfaces may change in future. */ +#if defined(__XEN__) || defined(__XEN_TOOLS__) + +/* + * Definitions relating to DMOP_create_ioreq_server. (Defined here for + * backwards compatibility). + */ + +#define HVM_IOREQSRV_BUFIOREQ_OFF 0 +#define HVM_IOREQSRV_BUFIOREQ_LEGACY 1 +/* + * Use this when read_pointer gets updated atomically and + * the pointer pair gets read atomically: + */ +#define HVM_IOREQSRV_BUFIOREQ_ATOMIC 2 + +#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ + +#if defined(__i386__) || defined(__x86_64__) + +/* + * HVMOP_set_evtchn_upcall_vector: Set a that should be used for = event + * channel upcalls on the specified = . If set, + * this vector will be used in preference = to the + * domain global callback via (see + * HVM_PARAM_CALLBACK_IRQ). + */ +#define HVMOP_set_evtchn_upcall_vector 23 +struct xen_hvm_evtchn_upcall_vector { + uint32_t vcpu; + uint8_t vector; +}; +typedef struct xen_hvm_evtchn_upcall_vector xen_hvm_evtchn_upcall_vector_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_evtchn_upcall_vector_t); + +#endif /* defined(__i386__) || defined(__x86_64__) */ + +#define HVMOP_guest_request_vm_event 24 + +/* HVMOP_altp2m: perform altp2m state operations */ +#define HVMOP_altp2m 25 + +#define HVMOP_ALTP2M_INTERFACE_VERSION 0x00000001 + +struct xen_hvm_altp2m_domain_state { + /* IN or OUT variable on/off */ + uint8_t state; +}; +typedef struct xen_hvm_altp2m_domain_state xen_hvm_altp2m_domain_state_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_domain_state_t); + +struct xen_hvm_altp2m_vcpu_enable_notify { + uint32_t vcpu_id; + uint32_t pad; + /* #VE info area gfn */ + uint64_t gfn; +}; +typedef struct xen_hvm_altp2m_vcpu_enable_notify xen_hvm_altp2m_vcpu_enabl= e_notify_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_enable_notify_t); + +struct xen_hvm_altp2m_vcpu_disable_notify { + uint32_t vcpu_id; +}; +typedef struct xen_hvm_altp2m_vcpu_disable_notify xen_hvm_altp2m_vcpu_disa= ble_notify_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_disable_notify_t); + +struct xen_hvm_altp2m_view { + /* IN/OUT variable */ + uint16_t view; + uint16_t hvmmem_default_access; /* xenmem_access_t */ +}; +typedef struct xen_hvm_altp2m_view xen_hvm_altp2m_view_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_view_t); + +#if __XEN_INTERFACE_VERSION__ < 0x00040a00 +struct xen_hvm_altp2m_set_mem_access { + /* view */ + uint16_t view; + /* Memory type */ + uint16_t access; /* xenmem_access_t */ + uint32_t pad; + /* gfn */ + uint64_t gfn; +}; +typedef struct xen_hvm_altp2m_set_mem_access xen_hvm_altp2m_set_mem_access= _t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_set_mem_access_t); +#endif /* __XEN_INTERFACE_VERSION__ < 0x00040a00 */ + +struct xen_hvm_altp2m_mem_access { + /* view */ + uint16_t view; + /* Memory type */ + uint16_t access; /* xenmem_access_t */ + uint32_t pad; + /* gfn */ + uint64_t gfn; +}; +typedef struct xen_hvm_altp2m_mem_access xen_hvm_altp2m_mem_access_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_mem_access_t); + +struct xen_hvm_altp2m_set_mem_access_multi { + /* view */ + uint16_t view; + uint16_t pad; + /* Number of pages */ + uint32_t nr; + /* + * Used for continuation purposes. + * Must be set to zero upon initial invocation. + */ + uint64_t opaque; + /* List of pfns to set access for */ + XEN_GUEST_HANDLE(const_uint64) pfn_list; + /* Corresponding list of access settings for pfn_list */ + XEN_GUEST_HANDLE(const_uint8) access_list; +}; + +struct xen_hvm_altp2m_change_gfn { + /* view */ + uint16_t view; + uint16_t pad1; + uint32_t pad2; + /* old gfn */ + uint64_t old_gfn; + /* new gfn, INVALID_GFN (~0UL) means revert */ + uint64_t new_gfn; +}; +typedef struct xen_hvm_altp2m_change_gfn xen_hvm_altp2m_change_gfn_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_change_gfn_t); + +struct xen_hvm_altp2m_get_vcpu_p2m_idx { + uint32_t vcpu_id; + uint16_t altp2m_idx; +}; + +struct xen_hvm_altp2m_set_visibility { + uint16_t altp2m_idx; + uint8_t visible; + uint8_t pad; +}; + +struct xen_hvm_altp2m_op { + uint32_t version; /* HVMOP_ALTP2M_INTERFACE_VERSION */ + uint32_t cmd; +/* Get/set the altp2m state for a domain */ +#define HVMOP_altp2m_get_domain_state 1 +#define HVMOP_altp2m_set_domain_state 2 +/* Set a given VCPU to receive altp2m event notifications */ +#define HVMOP_altp2m_vcpu_enable_notify 3 +/* Create a new view */ +#define HVMOP_altp2m_create_p2m 4 +/* Destroy a view */ +#define HVMOP_altp2m_destroy_p2m 5 +/* Switch view for an entire domain */ +#define HVMOP_altp2m_switch_p2m 6 +/* Notify that a page of memory is to have specific access types */ +#define HVMOP_altp2m_set_mem_access 7 +/* Change a p2m entry to have a different gfn->mfn mapping */ +#define HVMOP_altp2m_change_gfn 8 +/* Set access for an array of pages */ +#define HVMOP_altp2m_set_mem_access_multi 9 +/* Set the "Suppress #VE" bit on a page */ +#define HVMOP_altp2m_set_suppress_ve 10 +/* Get the "Suppress #VE" bit of a page */ +#define HVMOP_altp2m_get_suppress_ve 11 +/* Get the access of a page of memory from a certain view */ +#define HVMOP_altp2m_get_mem_access 12 +/* Disable altp2m event notifications for a given VCPU */ +#define HVMOP_altp2m_vcpu_disable_notify 13 +/* Get the active vcpu p2m index */ +#define HVMOP_altp2m_get_p2m_idx 14 +/* Set the "Supress #VE" bit for a range of pages */ +#define HVMOP_altp2m_set_suppress_ve_multi 15 +/* Set visibility for a given altp2m view */ +#define HVMOP_altp2m_set_visibility 16 + domid_t domain; + uint16_t pad1; + uint32_t pad2; + union { + struct xen_hvm_altp2m_domain_state domain_state; + struct xen_hvm_altp2m_vcpu_enable_notify enable_notify; + struct xen_hvm_altp2m_view view; +#if __XEN_INTERFACE_VERSION__ < 0x00040a00 + struct xen_hvm_altp2m_set_mem_access set_mem_access; +#endif /* __XEN_INTERFACE_VERSION__ < 0x00040a00 */ + struct xen_hvm_altp2m_mem_access mem_access; + struct xen_hvm_altp2m_change_gfn change_gfn; + struct xen_hvm_altp2m_set_mem_access_multi set_mem_access_multi; + struct xen_hvm_altp2m_suppress_ve suppress_ve; + struct xen_hvm_altp2m_suppress_ve_multi suppress_ve_multi; + struct xen_hvm_altp2m_vcpu_disable_notify disable_notify; + struct xen_hvm_altp2m_get_vcpu_p2m_idx get_vcpu_p2m_idx; + struct xen_hvm_altp2m_set_visibility set_visibility; + uint8_t pad[64]; + } u; +}; +typedef struct xen_hvm_altp2m_op xen_hvm_altp2m_op_t; +DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_op_t); + +#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/hvm/params.h b/include/hw/xen/interfa= ce/hvm/params.h new file mode 100644 index 000000000000..c9d6e70d7bab --- /dev/null +++ b/include/hw/xen/interface/hvm/params.h @@ -0,0 +1,318 @@ +/* + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2007, Keir Fraser + */ + +#ifndef __XEN_PUBLIC_HVM_PARAMS_H__ +#define __XEN_PUBLIC_HVM_PARAMS_H__ + +#include "hvm_op.h" + +/* These parameters are deprecated and their meaning is undefined. */ +#if defined(__XEN__) || defined(__XEN_TOOLS__) + +#define HVM_PARAM_PAE_ENABLED 4 +#define HVM_PARAM_DM_DOMAIN 13 +#define HVM_PARAM_MEMORY_EVENT_CR0 20 +#define HVM_PARAM_MEMORY_EVENT_CR3 21 +#define HVM_PARAM_MEMORY_EVENT_CR4 22 +#define HVM_PARAM_MEMORY_EVENT_INT3 23 +#define HVM_PARAM_NESTEDHVM 24 +#define HVM_PARAM_MEMORY_EVENT_SINGLE_STEP 25 +#define HVM_PARAM_BUFIOREQ_EVTCHN 26 +#define HVM_PARAM_MEMORY_EVENT_MSR 30 + +#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ + +/* + * Parameter space for HVMOP_{set,get}_param. + */ + +#define HVM_PARAM_CALLBACK_IRQ 0 +#define HVM_PARAM_CALLBACK_IRQ_TYPE_MASK xen_mk_ullong(0xFF00000000000000) +/* + * How should CPU0 event-channel notifications be delivered? + * + * If val =3D=3D 0 then CPU0 event-channel notifications are not delivered. + * If val !=3D 0, val[63:56] encodes the type, as follows: + */ + +#define HVM_PARAM_CALLBACK_TYPE_GSI 0 +/* + * val[55:0] is a delivery GSI. GSI 0 cannot be used, as it aliases val = =3D=3D 0, + * and disables all notifications. + */ + +#define HVM_PARAM_CALLBACK_TYPE_PCI_INTX 1 +/* + * val[55:0] is a delivery PCI INTx line: + * Domain =3D val[47:32], Bus =3D val[31:16] DevFn =3D val[15:8], IntX =3D= val[1:0] + */ + +#if defined(__i386__) || defined(__x86_64__) +#define HVM_PARAM_CALLBACK_TYPE_VECTOR 2 +/* + * val[7:0] is a vector number. Check for XENFEAT_hvm_callback_vector to = know + * if this delivery method is available. + */ +#elif defined(__arm__) || defined(__aarch64__) +#define HVM_PARAM_CALLBACK_TYPE_PPI 2 +/* + * val[55:16] needs to be zero. + * val[15:8] is interrupt flag of the PPI used by event-channel: + * bit 8: the PPI is edge(1) or level(0) triggered + * bit 9: the PPI is active low(1) or high(0) + * val[7:0] is a PPI number used by event-channel. + * This is only used by ARM/ARM64 and masking/eoi the interrupt associated= to + * the notification is handled by the interrupt controller. + */ +#define HVM_PARAM_CALLBACK_TYPE_PPI_FLAG_MASK 0xFF00 +#define HVM_PARAM_CALLBACK_TYPE_PPI_FLAG_LOW_LEVEL 2 +#endif + +/* + * These are not used by Xen. They are here for convenience of HVM-guest + * xenbus implementations. + */ +#define HVM_PARAM_STORE_PFN 1 +#define HVM_PARAM_STORE_EVTCHN 2 + +#define HVM_PARAM_IOREQ_PFN 5 + +#define HVM_PARAM_BUFIOREQ_PFN 6 + +#if defined(__i386__) || defined(__x86_64__) + +/* + * Viridian enlightenments + * + * (See http://download.microsoft.com/download/A/B/4/AB43A34E-BDD0-4FA6-BD= EF-79EEF16E880B/Hypervisor%20Top%20Level%20Functional%20Specification%20v4.= 0.docx) + * + * To expose viridian enlightenments to the guest set this parameter + * to the desired feature mask. The base feature set must be present + * in any valid feature mask. + */ +#define HVM_PARAM_VIRIDIAN 9 + +/* Base+Freq viridian feature sets: + * + * - Hypercall MSRs (HV_X64_MSR_GUEST_OS_ID and HV_X64_MSR_HYPERCALL) + * - APIC access MSRs (HV_X64_MSR_EOI, HV_X64_MSR_ICR and HV_X64_MSR_TPR) + * - Virtual Processor index MSR (HV_X64_MSR_VP_INDEX) + * - Timer frequency MSRs (HV_X64_MSR_TSC_FREQUENCY and + * HV_X64_MSR_APIC_FREQUENCY) + */ +#define _HVMPV_base_freq 0 +#define HVMPV_base_freq (1 << _HVMPV_base_freq) + +/* Feature set modifications */ + +/* Disable timer frequency MSRs (HV_X64_MSR_TSC_FREQUENCY and + * HV_X64_MSR_APIC_FREQUENCY). + * This modification restores the viridian feature set to the + * original 'base' set exposed in releases prior to Xen 4.4. + */ +#define _HVMPV_no_freq 1 +#define HVMPV_no_freq (1 << _HVMPV_no_freq) + +/* Enable Partition Time Reference Counter (HV_X64_MSR_TIME_REF_COUNT) */ +#define _HVMPV_time_ref_count 2 +#define HVMPV_time_ref_count (1 << _HVMPV_time_ref_count) + +/* Enable Reference TSC Page (HV_X64_MSR_REFERENCE_TSC) */ +#define _HVMPV_reference_tsc 3 +#define HVMPV_reference_tsc (1 << _HVMPV_reference_tsc) + +/* Use Hypercall for remote TLB flush */ +#define _HVMPV_hcall_remote_tlb_flush 4 +#define HVMPV_hcall_remote_tlb_flush (1 << _HVMPV_hcall_remote_tlb_flush) + +/* Use APIC assist */ +#define _HVMPV_apic_assist 5 +#define HVMPV_apic_assist (1 << _HVMPV_apic_assist) + +/* Enable crash MSRs */ +#define _HVMPV_crash_ctl 6 +#define HVMPV_crash_ctl (1 << _HVMPV_crash_ctl) + +/* Enable SYNIC MSRs */ +#define _HVMPV_synic 7 +#define HVMPV_synic (1 << _HVMPV_synic) + +/* Enable STIMER MSRs */ +#define _HVMPV_stimer 8 +#define HVMPV_stimer (1 << _HVMPV_stimer) + +/* Use Synthetic Cluster IPI Hypercall */ +#define _HVMPV_hcall_ipi 9 +#define HVMPV_hcall_ipi (1 << _HVMPV_hcall_ipi) + +/* Enable ExProcessorMasks */ +#define _HVMPV_ex_processor_masks 10 +#define HVMPV_ex_processor_masks (1 << _HVMPV_ex_processor_masks) + +/* Allow more than 64 VPs */ +#define _HVMPV_no_vp_limit 11 +#define HVMPV_no_vp_limit (1 << _HVMPV_no_vp_limit) + +/* Enable vCPU hotplug */ +#define _HVMPV_cpu_hotplug 12 +#define HVMPV_cpu_hotplug (1 << _HVMPV_cpu_hotplug) + +#define HVMPV_feature_mask \ + (HVMPV_base_freq | \ + HVMPV_no_freq | \ + HVMPV_time_ref_count | \ + HVMPV_reference_tsc | \ + HVMPV_hcall_remote_tlb_flush | \ + HVMPV_apic_assist | \ + HVMPV_crash_ctl | \ + HVMPV_synic | \ + HVMPV_stimer | \ + HVMPV_hcall_ipi | \ + HVMPV_ex_processor_masks | \ + HVMPV_no_vp_limit | \ + HVMPV_cpu_hotplug) + +#endif + +/* + * Set mode for virtual timers (currently x86 only): + * delay_for_missed_ticks (default): + * Do not advance a vcpu's time beyond the correct delivery time for + * interrupts that have been missed due to preemption. Deliver missed + * interrupts when the vcpu is rescheduled and advance the vcpu's virtual + * time stepwise for each one. + * no_delay_for_missed_ticks: + * As above, missed interrupts are delivered, but guest time always trac= ks + * wallclock (i.e., real) time while doing so. + * no_missed_ticks_pending: + * No missed interrupts are held pending. Instead, to ensure ticks are + * delivered at some non-zero rate, if we detect missed ticks then the + * internal tick alarm is not disabled if the VCPU is preempted during t= he + * next tick period. + * one_missed_tick_pending: + * Missed interrupts are collapsed together and delivered as one 'late t= ick'. + * Guest time always tracks wallclock (i.e., real) time. + */ +#define HVM_PARAM_TIMER_MODE 10 +#define HVMPTM_delay_for_missed_ticks 0 +#define HVMPTM_no_delay_for_missed_ticks 1 +#define HVMPTM_no_missed_ticks_pending 2 +#define HVMPTM_one_missed_tick_pending 3 + +/* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */ +#define HVM_PARAM_HPET_ENABLED 11 + +/* Identity-map page directory used by Intel EPT when CR0.PG=3D0. */ +#define HVM_PARAM_IDENT_PT 12 + +/* ACPI S state: currently support S0 and S3 on x86. */ +#define HVM_PARAM_ACPI_S_STATE 14 + +/* TSS used on Intel when CR0.PE=3D0. */ +#define HVM_PARAM_VM86_TSS 15 + +/* Boolean: Enable aligning all periodic vpts to reduce interrupts */ +#define HVM_PARAM_VPT_ALIGN 16 + +/* Console debug shared memory ring and event channel */ +#define HVM_PARAM_CONSOLE_PFN 17 +#define HVM_PARAM_CONSOLE_EVTCHN 18 + +/* + * Select location of ACPI PM1a and TMR control blocks. Currently two loca= tions + * are supported, specified by version 0 or 1 in this parameter: + * - 0: default, use the old addresses + * PM1A_EVT =3D=3D 0x1f40; PM1A_CNT =3D=3D 0x1f44; PM_TMR =3D=3D 0x= 1f48 + * - 1: use the new default qemu addresses + * PM1A_EVT =3D=3D 0xb000; PM1A_CNT =3D=3D 0xb004; PM_TMR =3D=3D 0x= b008 + * You can find these address definitions in + */ +#define HVM_PARAM_ACPI_IOPORTS_LOCATION 19 + +/* Params for the mem event rings */ +#define HVM_PARAM_PAGING_RING_PFN 27 +#define HVM_PARAM_MONITOR_RING_PFN 28 +#define HVM_PARAM_SHARING_RING_PFN 29 + +/* SHUTDOWN_* action in case of a triple fault */ +#define HVM_PARAM_TRIPLE_FAULT_REASON 31 + +#define HVM_PARAM_IOREQ_SERVER_PFN 32 +#define HVM_PARAM_NR_IOREQ_SERVER_PAGES 33 + +/* Location of the VM Generation ID in guest physical address space. */ +#define HVM_PARAM_VM_GENERATION_ID_ADDR 34 + +/* + * Set mode for altp2m: + * disabled: don't activate altp2m (default) + * mixed: allow access to all altp2m ops for both in-guest and external t= ools + * external: allow access to external privileged tools only + * limited: guest only has limited access (ie. control VMFUNC and #VE) + * + * Note that 'mixed' mode has not been evaluated for safety from a + * security perspective. Before using this mode in a + * security-critical environment, each subop should be evaluated for + * safety, with unsafe subops blacklisted in XSM. + */ +#define HVM_PARAM_ALTP2M 35 +#define XEN_ALTP2M_disabled 0 +#define XEN_ALTP2M_mixed 1 +#define XEN_ALTP2M_external 2 +#define XEN_ALTP2M_limited 3 + +/* + * Size of the x87 FPU FIP/FDP registers that the hypervisor needs to + * save/restore. This is a workaround for a hardware limitation that + * does not allow the full FIP/FDP and FCS/FDS to be restored. + * + * Valid values are: + * + * 8: save/restore 64-bit FIP/FDP and clear FCS/FDS (default if CPU + * has FPCSDS feature). + * + * 4: save/restore 32-bit FIP/FDP, FCS/FDS, and clear upper 32-bits of + * FIP/FDP. + * + * 0: allow hypervisor to choose based on the value of FIP/FDP + * (default if CPU does not have FPCSDS). + * + * If FPCSDS (bit 13 in CPUID leaf 0x7, subleaf 0x0) is set, the CPU + * never saves FCS/FDS and this parameter should be left at the + * default of 8. + */ +#define HVM_PARAM_X87_FIP_WIDTH 36 + +/* + * TSS (and its size) used on Intel when CR0.PE=3D0. The address occupies + * the low 32 bits, while the size is in the high 32 ones. + */ +#define HVM_PARAM_VM86_TSS_SIZED 37 + +/* Enable MCA capabilities. */ +#define HVM_PARAM_MCA_CAP 38 +#define XEN_HVM_MCA_CAP_LMCE (xen_mk_ullong(1) << 0) +#define XEN_HVM_MCA_CAP_MASK XEN_HVM_MCA_CAP_LMCE + +#define HVM_NR_PARAMS 39 + +#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ diff --git a/include/hw/xen/interface/io/blkif.h b/include/hw/xen/interface= /io/blkif.h index d07fa1e07822..4cdba79abaeb 100644 --- a/include/hw/xen/interface/io/blkif.h +++ b/include/hw/xen/interface/io/blkif.h @@ -118,7 +118,7 @@ * * The underlying storage is not affected by the direct IO memory * lifetime bug. See: - * http://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.ht= ml + * https://lists.xen.org/archives/html/xen-devel/2012-12/msg01154.h= tml * * Therefore this option gives the backend permission to use * O_DIRECT, notwithstanding that bug. @@ -341,7 +341,7 @@ * access (even when it should be read-only). If the frontend hits the * maximum number of allowed persistently mapped grants, it can fallb= ack * to non persistent mode. This will cause a performance degradation, - * since the backend driver will still try to map those grants + * since the the backend driver will still try to map those grants * persistently. Since the persistent grants protocol is compatible w= ith * the previous protocol, a frontend driver can choose to work in * persistent mode even when the backend doesn't support it. @@ -710,3 +710,13 @@ DEFINE_RING_TYPES(blkif, struct blkif_request, struct = blkif_response); #define VDISK_READONLY 0x4 =20 #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/io/console.h b/include/hw/xen/interfa= ce/io/console.h index e2155d1cf5d7..4811f47220a9 100644 --- a/include/hw/xen/interface/io/console.h +++ b/include/hw/xen/interface/io/console.h @@ -44,3 +44,13 @@ DEFINE_XEN_FLEX_RING(xencons); #endif =20 #endif /* __XEN_PUBLIC_IO_CONSOLE_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/io/fbif.h b/include/hw/xen/interface/= io/fbif.h index ea87ebec0a85..cc25aab32ea6 100644 --- a/include/hw/xen/interface/io/fbif.h +++ b/include/hw/xen/interface/io/fbif.h @@ -153,4 +153,24 @@ struct xenfb_page unsigned long pd[256]; }; =20 +/* + * Wart: xenkbd needs to know default resolution. Put it here until a + * better solution is found, but don't leak it to the backend. + */ +#ifdef __KERNEL__ +#define XENFB_WIDTH 800 +#define XENFB_HEIGHT 600 +#define XENFB_DEPTH 32 #endif + +#endif + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/io/kbdif.h b/include/hw/xen/interface= /io/kbdif.h index 1d68cd458e5b..a6b01c52c79f 100644 --- a/include/hw/xen/interface/io/kbdif.h +++ b/include/hw/xen/interface/io/kbdif.h @@ -564,3 +564,13 @@ struct xenkbd_page }; =20 #endif /* __XEN_PUBLIC_IO_KBDIF_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/io/netif.h b/include/hw/xen/interface= /io/netif.h index 48fa530950ca..00dd258712f0 100644 --- a/include/hw/xen/interface/io/netif.h +++ b/include/hw/xen/interface/io/netif.h @@ -171,7 +171,7 @@ * The ability of the backend to use a control ring is advertised by * setting: * - * /local/domain/X/backend///feature-ctrl-ring =3D "1" + * /local/domain/X/backend/vif///feature-ctrl-ring =3D "1" * * The frontend provides a control ring to the backend by setting: * @@ -190,6 +190,32 @@ * order as requests. */ =20 +/* + * Link state + * =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + * + * The backend can advertise its current link (carrier) state to the + * frontend using the /local/domain/X/backend/vif///carrier + * node. If this node is not present, then the frontend should assume that + * the link is up (for compatibility with backends that do not implement + * this feature). If this node is present, then a value of "0" should be + * interpreted by the frontend as the link being down (no carrier) and a + * value of "1" should be interpreted as the link being up (carrier + * present). + */ + +/* + * MTU + * =3D=3D=3D + * + * The toolstack may set a value of MTU for the frontend by setting the + * /local/domain//device/vif//mtu node with the MTU value in + * octets. If this node is absent the frontend should assume an MTU value + * of 1500 octets. A frontend is also at liberty to ignore this value so + * it is only suitable for informing the frontend that a packet payload + * >1500 octets is permitted. + */ + /* * Hash types * =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -267,6 +293,62 @@ =20 #define XEN_NETIF_CTRL_HASH_ALGORITHM_TOEPLITZ 1 =20 +/* + * This algorithm uses a 'key' as well as the data buffer itself. + * (Buffer[] and Key[] are treated as shift-registers where the MSB of + * Buffer/Key[0] is considered 'left-most' and the LSB of Buffer/Key[N-1] + * is the 'right-most'). + * + * Value =3D 0 + * For number of bits in Buffer[] + * If (left-most bit of Buffer[] is 1) + * Value ^=3D left-most 32 bits of Key[] + * Key[] << 1 + * Buffer[] << 1 + * + * The code below is provided for convenience where an operating system + * does not already provide an implementation. + */ +#ifdef XEN_NETIF_DEFINE_TOEPLITZ +static uint32_t xen_netif_toeplitz_hash(const uint8_t *key, + unsigned int keylen, + const uint8_t *buf, + unsigned int buflen) +{ + unsigned int keyi, bufi; + uint64_t prefix =3D 0; + uint64_t hash =3D 0; + + /* Pre-load prefix with the first 8 bytes of the key */ + for (keyi =3D 0; keyi < 8; keyi++) { + prefix <<=3D 8; + prefix |=3D (keyi < keylen) ? key[keyi] : 0; + } + + for (bufi =3D 0; bufi < buflen; bufi++) { + uint8_t byte =3D buf[bufi]; + unsigned int bit; + + for (bit =3D 0; bit < 8; bit++) { + if (byte & 0x80) + hash ^=3D prefix; + prefix <<=3D 1; + byte <<=3D1; + } + + /* + * 'prefix' has now been left-shifted by 8, so + * OR in the next byte. + */ + prefix |=3D (keyi < keylen) ? key[keyi] : 0; + keyi++; + } + + /* The valid part of the hash is in the upper 32 bits. */ + return hash >> 32; +} +#endif /* XEN_NETIF_DEFINE_TOEPLITZ */ + /* * Control requests (struct xen_netif_ctrl_request) * =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D @@ -1008,3 +1090,13 @@ DEFINE_RING_TYPES(netif_rx, struct netif_rx_request,= struct netif_rx_response); #define NETIF_RSP_NULL 1 =20 #endif + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/io/ring.h b/include/hw/xen/interface/= io/ring.h index 115705f3f436..c486c457e078 100644 --- a/include/hw/xen/interface/io/ring.h +++ b/include/hw/xen/interface/io/ring.h @@ -1,6 +1,6 @@ /*************************************************************************= ***** * ring.h - *=20 + * * Shared producer-consumer ring macros. * * Permission is hereby granted, free of charge, to any person obtaining a= copy @@ -33,13 +33,6 @@ * - standard integers types (uint8_t, uint16_t, etc) * They are provided by stdint.h of the standard headers. * - * Before using the different macros, you need to provide the following - * macros: - * - xen_mb() a memory barrier - * - xen_rmb() a read memory barrier - * - xen_wmb() a write memory barrier - * Example of those can be found in xenctrl.h. - * * In addition, if you intend to use the FLEX macros, you also need to * provide the following, before invoking the FLEX macros: * - size_t @@ -49,6 +42,14 @@ * and grant_table.h from the Xen public headers. */ =20 +#include "../xen-compat.h" + +#if __XEN_INTERFACE_VERSION__ < 0x00030208 +#define xen_mb() mb() +#define xen_rmb() rmb() +#define xen_wmb() wmb() +#endif + typedef unsigned int RING_IDX; =20 /* Round a 32-bit unsigned constant down to the nearest power of two. */ @@ -61,12 +62,12 @@ typedef unsigned int RING_IDX; /* * Calculate size of a shared ring, given the total available space for the * ring and indexes (_sz), and the name tag of the request/response struct= ure. - * A ring contains as many entries as will fit, rounded down to the neares= t=20 + * A ring contains as many entries as will fit, rounded down to the nearest * power of two (so we can mask with (size-1) to loop around). */ #define __CONST_RING_SIZE(_s, _sz) \ (__RD32(((_sz) - offsetof(struct _s##_sring, ring)) / \ - sizeof_field(struct _s##_sring, ring[0]))) + sizeof(((struct _s##_sring *)0)->ring[0]))) /* * The same for passing in an actual pointer instead of a name tag. */ @@ -75,7 +76,7 @@ typedef unsigned int RING_IDX; =20 /* * Macros to make the correct C datatypes for a new kind of ring. - *=20 + * * To make a new ring datatype, you need to have two message structures, * let's say request_t, and response_t already defined. * @@ -85,7 +86,7 @@ typedef unsigned int RING_IDX; * * These expand out to give you a set of types, as you can see below. * The most important of these are: - *=20 + * * mytag_sring_t - The shared ring. * mytag_front_ring_t - The 'front' half of the ring. * mytag_back_ring_t - The 'back' half of the ring. @@ -153,15 +154,15 @@ typedef struct __name##_back_ring __name##_back_ring_t =20 /* * Macros for manipulating rings. - *=20 - * FRONT_RING_whatever works on the "front end" of a ring: here=20 + * + * FRONT_RING_whatever works on the "front end" of a ring: here * requests are pushed on to the ring and responses taken off it. - *=20 - * BACK_RING_whatever works on the "back end" of a ring: here=20 + * + * BACK_RING_whatever works on the "back end" of a ring: here * requests are taken off the ring and responses put on. - *=20 - * N.B. these macros do NO INTERLOCKS OR FLOW CONTROL.=20 - * This is OK in 1-for-1 request-response situations where the=20 + * + * N.B. these macros do NO INTERLOCKS OR FLOW CONTROL. + * This is OK in 1-for-1 request-response situations where the * requestor (front end) never has more than RING_SIZE()-1 * outstanding requests. */ @@ -174,20 +175,24 @@ typedef struct __name##_back_ring __name##_back_ring_t (void)memset((_s)->__pad, 0, sizeof((_s)->__pad)); \ } while(0) =20 -#define FRONT_RING_INIT(_r, _s, __size) do { \ - (_r)->req_prod_pvt =3D 0; \ - (_r)->rsp_cons =3D 0; \ +#define FRONT_RING_ATTACH(_r, _s, _i, __size) do { \ + (_r)->req_prod_pvt =3D (_i); \ + (_r)->rsp_cons =3D (_i); \ (_r)->nr_ents =3D __RING_SIZE(_s, __size); \ (_r)->sring =3D (_s); \ } while (0) =20 -#define BACK_RING_INIT(_r, _s, __size) do { \ - (_r)->rsp_prod_pvt =3D 0; \ - (_r)->req_cons =3D 0; \ +#define FRONT_RING_INIT(_r, _s, __size) FRONT_RING_ATTACH(_r, _s, 0, __siz= e) + +#define BACK_RING_ATTACH(_r, _s, _i, __size) do { \ + (_r)->rsp_prod_pvt =3D (_i); \ + (_r)->req_cons =3D (_i); \ (_r)->nr_ents =3D __RING_SIZE(_s, __size); \ (_r)->sring =3D (_s); \ } while (0) =20 +#define BACK_RING_INIT(_r, _s, __size) BACK_RING_ATTACH(_r, _s, 0, __size) + /* How big is this ring? */ #define RING_SIZE(_r) \ ((_r)->nr_ents) @@ -206,33 +211,45 @@ typedef struct __name##_back_ring __name##_back_ring_t #define RING_HAS_UNCONSUMED_RESPONSES(_r) \ ((_r)->sring->rsp_prod - (_r)->rsp_cons) =20 +#ifdef __GNUC__ #define RING_HAS_UNCONSUMED_REQUESTS(_r) ({ \ unsigned int req =3D (_r)->sring->req_prod - (_r)->req_cons; \ unsigned int rsp =3D RING_SIZE(_r) - \ ((_r)->req_cons - (_r)->rsp_prod_pvt); \ req < rsp ? req : rsp; \ }) +#else +/* Same as above, but without the nice GCC ({ ... }) syntax. */ +#define RING_HAS_UNCONSUMED_REQUESTS(_r) \ + ((((_r)->sring->req_prod - (_r)->req_cons) < \ + (RING_SIZE(_r) - ((_r)->req_cons - (_r)->rsp_prod_pvt))) ? \ + ((_r)->sring->req_prod - (_r)->req_cons) : \ + (RING_SIZE(_r) - ((_r)->req_cons - (_r)->rsp_prod_pvt))) +#endif =20 /* Direct access to individual ring elements, by index. */ #define RING_GET_REQUEST(_r, _idx) \ (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].req)) =20 +#define RING_GET_RESPONSE(_r, _idx) \ + (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].rsp)) + /* - * Get a local copy of a request. + * Get a local copy of a request/response. * - * Use this in preference to RING_GET_REQUEST() so all processing is + * Use this in preference to RING_GET_{REQUEST,RESPONSE}() so all processi= ng is * done on a local copy that cannot be modified by the other end. * * Note that https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D58145 may caus= e this - * to be ineffective where _req is a struct which consists of only bitfiel= ds. + * to be ineffective where dest is a struct which consists of only bitfiel= ds. */ -#define RING_COPY_REQUEST(_r, _idx, _req) do { \ - /* Use volatile to force the copy into _req. */ \ - *(_req) =3D *(volatile typeof(_req))RING_GET_REQUEST(_r, _idx); \ +#define RING_COPY_(type, r, idx, dest) do { \ + /* Use volatile to force the copy into dest. */ \ + *(dest) =3D *(volatile __typeof__(dest))RING_GET_##type(r, idx); \ } while (0) =20 -#define RING_GET_RESPONSE(_r, _idx) \ - (&((_r)->sring->ring[((_idx) & (RING_SIZE(_r) - 1))].rsp)) +#define RING_COPY_REQUEST(r, idx, req) RING_COPY_(REQUEST, r, idx, req) +#define RING_COPY_RESPONSE(r, idx, rsp) RING_COPY_(RESPONSE, r, idx, rsp) =20 /* Loop termination condition: Would the specified index overflow the ring= ? */ #define RING_REQUEST_CONS_OVERFLOW(_r, _cons) \ @@ -242,6 +259,10 @@ typedef struct __name##_back_ring __name##_back_ring_t #define RING_REQUEST_PROD_OVERFLOW(_r, _prod) \ (((_prod) - (_r)->rsp_prod_pvt) > RING_SIZE(_r)) =20 +/* Ill-behaved backend determination: Can there be this many responses? */ +#define RING_RESPONSE_PROD_OVERFLOW(_r, _prod) \ + (((_prod) - (_r)->rsp_cons) > RING_SIZE(_r)) + #define RING_PUSH_REQUESTS(_r) do { \ xen_wmb(); /* back sees requests /before/ updated producer index */ \ (_r)->sring->req_prod =3D (_r)->req_prod_pvt; \ @@ -254,26 +275,26 @@ typedef struct __name##_back_ring __name##_back_ring_t =20 /* * Notification hold-off (req_event and rsp_event): - *=20 + * * When queueing requests or responses on a shared ring, it may not always= be * necessary to notify the remote end. For example, if requests are in fli= ght * in a backend, the front may be able to queue further requests without * notifying the back (if the back checks for new requests when it queues * responses). - *=20 + * * When enqueuing requests or responses: - *=20 + * * Use RING_PUSH_{REQUESTS,RESPONSES}_AND_CHECK_NOTIFY(). The second argu= ment * is a boolean return value. True indicates that the receiver requires an * asynchronous notification. - *=20 + * * After dequeuing requests or responses (before sleeping the connection): - *=20 + * * Use RING_FINAL_CHECK_FOR_REQUESTS() or RING_FINAL_CHECK_FOR_RESPONSES(= ). * The second argument is a boolean return value. True indicates that the= re * are pending messages on the ring (i.e., the connection should not be p= ut * to sleep). - *=20 + * * These macros will set the req_event/rsp_event field to trigger a * notification on the very next message that is enqueued. If you want to * create batches of work (i.e., only receive a notification after several diff --git a/include/hw/xen/interface/io/usbif.h b/include/hw/xen/interface= /io/usbif.h index c6a58639d6cc..c0a552e195a7 100644 --- a/include/hw/xen/interface/io/usbif.h +++ b/include/hw/xen/interface/io/usbif.h @@ -32,6 +32,34 @@ #include "../grant_table.h" =20 /* + * Detailed Interface Description + * =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D + * The pvUSB interface is using a split driver design: a frontend driver in + * the guest and a backend driver in a driver domain (normally dom0) having + * access to the physical USB device(s) being passed to the guest. + * + * The frontend and backend drivers use XenStore to initiate the connection + * between them, the I/O activity is handled via two shared ring pages and= an + * event channel. As the interface between frontend and backend is at the = USB + * host connector level, multiple (up to 31) physical USB devices can be + * handled by a single connection. + * + * The Xen pvUSB device name is "qusb", so the frontend's XenStore entries= are + * to be found under "device/qusb", while the backend's XenStore entries a= re + * under "backend//qusb". + * + * When a new pvUSB connection is established, the frontend needs to setup= the + * two shared ring pages for communication and the event channel. The ring + * pages need to be made available to the backend via the grant table + * interface. + * + * One of the shared ring pages is used by the backend to inform the front= end + * about USB device plug events (device to be added or removed). This is t= he + * "conn-ring". + * + * The other ring page is used for USB I/O communication (requests and + * responses). This is the "urb-ring". + * * Feature and Parameter Negotiation * =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D * The two halves of a Xen pvUSB driver utilize nodes within the XenStore = to @@ -99,130 +127,273 @@ * The machine ABI rules governing the format of all ring request and * response structures. * + * Protocol Description + * =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + * + *-------------------------- USB device plug events ----------------------= ---- + * + * USB device plug events are send via the "conn-ring" shared page. As only + * events are being sent, the respective requests from the frontend to the + * backend are just dummy ones. + * The events sent to the frontend have the following layout: + * 0 1 2 3 oct= et + * +----------------+----------------+----------------+----------------+ + * | id | portnum | speed | 4 + * +----------------+----------------+----------------+----------------+ + * id - uint16_t, event id (taken from the actual frontend dummy request) + * portnum - uint8_t, port number (1 ... 31) + * speed - uint8_t, device USBIF_SPEED_*, USBIF_SPEED_NONE =3D=3D unplug + * + * The dummy request: + * 0 1 octet + * +----------------+----------------+ + * | id | 2 + * +----------------+----------------+ + * id - uint16_t, guest supplied value (no need for being unique) + * + *-------------------------- USB I/O request -----------------------------= ---- + * + * A single USB I/O request on the "urb-ring" has the following layout: + * 0 1 2 3 oct= et + * +----------------+----------------+----------------+----------------+ + * | id | nr_buffer_segs | 4 + * +----------------+----------------+----------------+----------------+ + * | pipe | 8 + * +----------------+----------------+----------------+----------------+ + * | transfer_flags | buffer_length | 12 + * +----------------+----------------+----------------+----------------+ + * | request type specific | 16 + * | data | 20 + * +----------------+----------------+----------------+----------------+ + * | seg[0] | 24 + * | data | 28 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | seg[USBIF_MAX_SEGMENTS_PER_REQUEST - 1] | 1= 44 + * | data | 1= 48 + * +----------------+----------------+----------------+----------------+ + * Bit field bit number 0 is always least significant bit, undefined bits = must + * be zero. + * id - uint16_t, guest supplied value + * nr_buffer_segs - uint16_t, number of segment entries in seg[] array + * pipe - uint32_t, bit field with multiple information: + * bits 0-4: port request to send to + * bit 5: unlink request with specified id (cancel I/O) if set (see be= low) + * bit 7: direction (1 =3D read from device) + * bits 8-14: device number on port + * bits 15-18: endpoint of device + * bits 30-31: request type: 00 =3D isochronous, 01 =3D interrupt, + * 10 =3D control, 11 =3D bulk + * transfer_flags - uint16_t, bit field with processing flags: + * bit 0: less data than specified allowed + * buffer_length - uint16_t, total length of data + * request type specific data - 8 bytes, see below + * seg[] - array with 8 byte elements, see below + * + * Request type specific data for isochronous request: + * 0 1 2 3 oct= et + * +----------------+----------------+----------------+----------------+ + * | interval | start_frame | 4 + * +----------------+----------------+----------------+----------------+ + * | number_of_packets | nr_frame_desc_segs | 8 + * +----------------+----------------+----------------+----------------+ + * interval - uint16_t, time interval in msecs between frames + * start_frame - uint16_t, start frame number + * number_of_packets - uint16_t, number of packets to transfer + * nr_frame_desc_segs - uint16_t number of seg[] frame descriptors eleme= nts + * + * Request type specific data for interrupt request: + * 0 1 2 3 oct= et + * +----------------+----------------+----------------+----------------+ + * | interval | 0 | 4 + * +----------------+----------------+----------------+----------------+ + * | 0 | 8 + * +----------------+----------------+----------------+----------------+ + * interval - uint16_t, time in msecs until interruption + * + * Request type specific data for control request: + * 0 1 2 3 oct= et + * +----------------+----------------+----------------+----------------+ + * | data of setup packet | 4 + * | | 8 + * +----------------+----------------+----------------+----------------+ + * + * Request type specific data for bulk request: + * 0 1 2 3 oct= et + * +----------------+----------------+----------------+----------------+ + * | 0 | 4 + * | 0 | 8 + * +----------------+----------------+----------------+----------------+ + * + * Request type specific data for unlink request: + * 0 1 2 3 oct= et + * +----------------+----------------+----------------+----------------+ + * | unlink_id | 0 | 4 + * +----------------+----------------+----------------+----------------+ + * | 0 | 8 + * +----------------+----------------+----------------+----------------+ + * unlink_id - uint16_t, request id of request to terminate + * + * seg[] array element layout: + * 0 1 2 3 oct= et + * +----------------+----------------+----------------+----------------+ + * | gref | 4 + * +----------------+----------------+----------------+----------------+ + * | offset | length | 8 + * +----------------+----------------+----------------+----------------+ + * gref - uint32_t, grant reference of buffer page + * offset - uint16_t, offset of buffer start in page + * length - uint16_t, length of buffer in page + * + *-------------------------- USB I/O response ----------------------------= ---- + * + * 0 1 2 3 oct= et + * +----------------+----------------+----------------+----------------+ + * | id | start_frame | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | actual_length | 12 + * +----------------+----------------+----------------+----------------+ + * | error_count | 16 + * +----------------+----------------+----------------+----------------+ + * id - uint16_t, id of the request this response belongs to + * start_frame - uint16_t, start_frame this response (iso requests only) + * status - int32_t, USBIF_STATUS_* (non-iso requests) + * actual_length - uint32_t, actual size of data transferred + * error_count - uint32_t, number of errors (iso requests) */ =20 enum usb_spec_version { - USB_VER_UNKNOWN =3D 0, - USB_VER_USB11, - USB_VER_USB20, - USB_VER_USB30, /* not supported yet */ + USB_VER_UNKNOWN =3D 0, + USB_VER_USB11, + USB_VER_USB20, + USB_VER_USB30, /* not supported yet */ }; =20 /* * USB pipe in usbif_request * - * - port number: bits 0-4 - * (USB_MAXCHILDREN is 31) + * - port number: bits 0-4 + * (USB_MAXCHILDREN is 31) * - * - operation flag: bit 5 - * (0 =3D submit urb, - * 1 =3D unlink urb) + * - operation flag: bit 5 + * (0 =3D submit urb, + * 1 =3D unlink urb) * - * - direction: bit 7 - * (0 =3D Host-to-Device [Out] - * 1 =3D Device-to-Host [In]) + * - direction: bit 7 + * (0 =3D Host-to-Device [Out] + * 1 =3D Device-to-Host [In]) * - * - device address: bits 8-14 + * - device address: bits 8-14 * - * - endpoint: bits 15-18 + * - endpoint: bits 15-18 * - * - pipe type: bits 30-31 - * (00 =3D isochronous, 01 =3D interrupt, - * 10 =3D control, 11 =3D bulk) + * - pipe type: bits 30-31 + * (00 =3D isochronous, 01 =3D interrupt, + * 10 =3D control, 11 =3D bulk) */ =20 -#define USBIF_PIPE_PORT_MASK 0x0000001f -#define USBIF_PIPE_UNLINK 0x00000020 -#define USBIF_PIPE_DIR 0x00000080 -#define USBIF_PIPE_DEV_MASK 0x0000007f -#define USBIF_PIPE_DEV_SHIFT 8 -#define USBIF_PIPE_EP_MASK 0x0000000f -#define USBIF_PIPE_EP_SHIFT 15 -#define USBIF_PIPE_TYPE_MASK 0x00000003 -#define USBIF_PIPE_TYPE_SHIFT 30 -#define USBIF_PIPE_TYPE_ISOC 0 -#define USBIF_PIPE_TYPE_INT 1 -#define USBIF_PIPE_TYPE_CTRL 2 -#define USBIF_PIPE_TYPE_BULK 3 +#define USBIF_PIPE_PORT_MASK 0x0000001f +#define USBIF_PIPE_UNLINK 0x00000020 +#define USBIF_PIPE_DIR 0x00000080 +#define USBIF_PIPE_DEV_MASK 0x0000007f +#define USBIF_PIPE_DEV_SHIFT 8 +#define USBIF_PIPE_EP_MASK 0x0000000f +#define USBIF_PIPE_EP_SHIFT 15 +#define USBIF_PIPE_TYPE_MASK 0x00000003 +#define USBIF_PIPE_TYPE_SHIFT 30 +#define USBIF_PIPE_TYPE_ISOC 0 +#define USBIF_PIPE_TYPE_INT 1 +#define USBIF_PIPE_TYPE_CTRL 2 +#define USBIF_PIPE_TYPE_BULK 3 =20 -#define usbif_pipeportnum(pipe) ((pipe) & USBIF_PIPE_PORT_MASK) -#define usbif_setportnum_pipe(pipe, portnum) ((pipe) | (portnum)) +#define usbif_pipeportnum(pipe) ((pipe) & USBIF_PIPE_PORT_= MASK) +#define usbif_setportnum_pipe(pipe, portnum) ((pipe) | (portnum)) =20 -#define usbif_pipeunlink(pipe) ((pipe) & USBIF_PIPE_UNLINK) -#define usbif_pipesubmit(pipe) (!usbif_pipeunlink(pipe)) -#define usbif_setunlink_pipe(pipe) ((pipe) | USBIF_PIPE_UNLINK) +#define usbif_pipeunlink(pipe) ((pipe) & USBIF_PIPE_UNLIN= K) +#define usbif_pipesubmit(pipe) (!usbif_pipeunlink(pipe)) +#define usbif_setunlink_pipe(pipe) ((pipe) | USBIF_PIPE_UNLIN= K) =20 -#define usbif_pipein(pipe) ((pipe) & USBIF_PIPE_DIR) -#define usbif_pipeout(pipe) (!usbif_pipein(pipe)) +#define usbif_pipein(pipe) ((pipe) & USBIF_PIPE_DIR) +#define usbif_pipeout(pipe) (!usbif_pipein(pipe)) =20 -#define usbif_pipedevice(pipe) \ - (((pipe) >> USBIF_PIPE_DEV_SHIFT) & USBIF_PIPE_DEV_MASK) +#define usbif_pipedevice(pipe) \ + (((pipe) >> USBIF_PIPE_DEV_SHIFT) & USBIF_PIPE_DEV_MASK) =20 -#define usbif_pipeendpoint(pipe) \ - (((pipe) >> USBIF_PIPE_EP_SHIFT) & USBIF_PIPE_EP_MASK) +#define usbif_pipeendpoint(pipe) \ + (((pipe) >> USBIF_PIPE_EP_SHIFT) & USBIF_PIPE_EP_MASK) =20 -#define usbif_pipetype(pipe) \ - (((pipe) >> USBIF_PIPE_TYPE_SHIFT) & USBIF_PIPE_TYPE_MASK) -#define usbif_pipeisoc(pipe) (usbif_pipetype(pipe) =3D=3D USBIF_PIPE_TYPE_= ISOC) -#define usbif_pipeint(pipe) (usbif_pipetype(pipe) =3D=3D USBIF_PIPE_TYPE_I= NT) -#define usbif_pipectrl(pipe) (usbif_pipetype(pipe) =3D=3D USBIF_PIPE_TYPE_= CTRL) -#define usbif_pipebulk(pipe) (usbif_pipetype(pipe) =3D=3D USBIF_PIPE_TYPE_= BULK) +#define usbif_pipetype(pipe) \ + (((pipe) >> USBIF_PIPE_TYPE_SHIFT) & USBIF_PIPE_TYPE_MASK) +#define usbif_pipeisoc(pipe) (usbif_pipetype(pipe) =3D=3D USBIF_PIPE_TY= PE_ISOC) +#define usbif_pipeint(pipe) (usbif_pipetype(pipe) =3D=3D USBIF_PIPE_TY= PE_INT) +#define usbif_pipectrl(pipe) (usbif_pipetype(pipe) =3D=3D USBIF_PIPE_TY= PE_CTRL) +#define usbif_pipebulk(pipe) (usbif_pipetype(pipe) =3D=3D USBIF_PIPE_TY= PE_BULK) =20 #define USBIF_MAX_SEGMENTS_PER_REQUEST (16) -#define USBIF_MAX_PORTNR 31 -#define USBIF_RING_SIZE 4096 +#define USBIF_MAX_PORTNR 31 +#define USBIF_RING_SIZE 4096 =20 /* * RING for transferring urbs. */ struct usbif_request_segment { - grant_ref_t gref; - uint16_t offset; - uint16_t length; + grant_ref_t gref; + uint16_t offset; + uint16_t length; }; =20 struct usbif_urb_request { - uint16_t id; /* request id */ - uint16_t nr_buffer_segs; /* number of urb->transfer_buffer segments */ + uint16_t id; /* request id */ + uint16_t nr_buffer_segs; /* number of urb->transfer_buffer segmen= ts */ =20 - /* basic urb parameter */ - uint32_t pipe; - uint16_t transfer_flags; -#define USBIF_SHORT_NOT_OK 0x0001 - uint16_t buffer_length; - union { - uint8_t ctrl[8]; /* setup_packet (Ctrl) */ + /* basic urb parameter */ + uint32_t pipe; + uint16_t transfer_flags; +#define USBIF_SHORT_NOT_OK 0x0001 + uint16_t buffer_length; + union { + uint8_t ctrl[8]; /* setup_packet (Ctrl) */ =20 - struct { - uint16_t interval; /* maximum (1024*8) in usb core */ - uint16_t start_frame; /* start frame */ - uint16_t number_of_packets; /* number of ISO packet */ - uint16_t nr_frame_desc_segs; /* number of iso_frame_desc segments */ - } isoc; + struct { + uint16_t interval; /* maximum (1024*8) in usb core */ + uint16_t start_frame; /* start frame */ + uint16_t number_of_packets; /* number of ISO packet */ + uint16_t nr_frame_desc_segs; /* number of iso_frame_desc segme= nts */ + } isoc; =20 - struct { - uint16_t interval; /* maximum (1024*8) in usb core */ - uint16_t pad[3]; - } intr; + struct { + uint16_t interval; /* maximum (1024*8) in usb core */ + uint16_t pad[3]; + } intr; =20 - struct { - uint16_t unlink_id; /* unlink request id */ - uint16_t pad[3]; - } unlink; + struct { + uint16_t unlink_id; /* unlink request id */ + uint16_t pad[3]; + } unlink; =20 - } u; + } u; =20 - /* urb data segments */ - struct usbif_request_segment seg[USBIF_MAX_SEGMENTS_PER_REQUEST]; + /* urb data segments */ + struct usbif_request_segment seg[USBIF_MAX_SEGMENTS_PER_REQUEST]; }; typedef struct usbif_urb_request usbif_urb_request_t; =20 struct usbif_urb_response { - uint16_t id; /* request id */ - uint16_t start_frame; /* start frame (ISO) */ - int32_t status; /* status (non-ISO) */ - int32_t actual_length; /* actual transfer length */ - int32_t error_count; /* number of ISO errors */ + uint16_t id; /* request id */ + uint16_t start_frame; /* start frame (ISO) */ + int32_t status; /* status (non-ISO) */ +#define USBIF_STATUS_OK 0 +#define USBIF_STATUS_NODEV (-19) +#define USBIF_STATUS_INVAL (-22) +#define USBIF_STATUS_STALL (-32) +#define USBIF_STATUS_IOERROR (-71) +#define USBIF_STATUS_BABBLE (-75) +#define USBIF_STATUS_SHUTDOWN (-108) + int32_t actual_length; /* actual transfer length */ + int32_t error_count; /* number of ISO errors */ }; typedef struct usbif_urb_response usbif_urb_response_t; =20 @@ -233,18 +404,18 @@ DEFINE_RING_TYPES(usbif_urb, struct usbif_urb_request= , struct usbif_urb_response * RING for notifying connect/disconnect events to frontend */ struct usbif_conn_request { - uint16_t id; + uint16_t id; }; typedef struct usbif_conn_request usbif_conn_request_t; =20 struct usbif_conn_response { - uint16_t id; /* request id */ - uint8_t portnum; /* port number */ - uint8_t speed; /* usb_device_speed */ -#define USBIF_SPEED_NONE 0 -#define USBIF_SPEED_LOW 1 -#define USBIF_SPEED_FULL 2 -#define USBIF_SPEED_HIGH 3 + uint16_t id; /* request id */ + uint8_t portnum; /* port number */ + uint8_t speed; /* usb_device_speed */ +#define USBIF_SPEED_NONE 0 +#define USBIF_SPEED_LOW 1 +#define USBIF_SPEED_FULL 2 +#define USBIF_SPEED_HIGH 3 }; typedef struct usbif_conn_response usbif_conn_response_t; =20 diff --git a/include/hw/xen/interface/io/xenbus.h b/include/hw/xen/interfac= e/io/xenbus.h index 2fbf2a7fdc50..927f9db55287 100644 --- a/include/hw/xen/interface/io/xenbus.h +++ b/include/hw/xen/interface/io/xenbus.h @@ -68,3 +68,13 @@ enum xenbus_state { typedef enum xenbus_state XenbusState; =20 #endif /* _XEN_PUBLIC_IO_XENBUS_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/io/xs_wire.h b/include/hw/xen/interfa= ce/io/xs_wire.h new file mode 100644 index 000000000000..4dd663266961 --- /dev/null +++ b/include/hw/xen/interface/io/xs_wire.h @@ -0,0 +1,153 @@ +/* + * Details of the "wire" protocol between Xen Store Daemon and client + * library or guest kernel. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (C) 2005 Rusty Russell IBM Corporation + */ + +#ifndef _XS_WIRE_H +#define _XS_WIRE_H + +enum xsd_sockmsg_type +{ + XS_CONTROL, +#define XS_DEBUG XS_CONTROL + XS_DIRECTORY, + XS_READ, + XS_GET_PERMS, + XS_WATCH, + XS_UNWATCH, + XS_TRANSACTION_START, + XS_TRANSACTION_END, + XS_INTRODUCE, + XS_RELEASE, + XS_GET_DOMAIN_PATH, + XS_WRITE, + XS_MKDIR, + XS_RM, + XS_SET_PERMS, + XS_WATCH_EVENT, + XS_ERROR, + XS_IS_DOMAIN_INTRODUCED, + XS_RESUME, + XS_SET_TARGET, + /* XS_RESTRICT has been removed */ + XS_RESET_WATCHES =3D XS_SET_TARGET + 2, + XS_DIRECTORY_PART, + + XS_TYPE_COUNT, /* Number of valid types. */ + + XS_INVALID =3D 0xffff /* Guaranteed to remain an invalid type */ +}; + +#define XS_WRITE_NONE "NONE" +#define XS_WRITE_CREATE "CREATE" +#define XS_WRITE_CREATE_EXCL "CREATE|EXCL" + +/* We hand errors as strings, for portability. */ +struct xsd_errors +{ + int errnum; + const char *errstring; +}; +#ifdef EINVAL +#define XSD_ERROR(x) { x, #x } +/* LINTED: static unused */ +static struct xsd_errors xsd_errors[] +#if defined(__GNUC__) +__attribute__((unused)) +#endif + =3D { + XSD_ERROR(EINVAL), + XSD_ERROR(EACCES), + XSD_ERROR(EEXIST), + XSD_ERROR(EISDIR), + XSD_ERROR(ENOENT), + XSD_ERROR(ENOMEM), + XSD_ERROR(ENOSPC), + XSD_ERROR(EIO), + XSD_ERROR(ENOTEMPTY), + XSD_ERROR(ENOSYS), + XSD_ERROR(EROFS), + XSD_ERROR(EBUSY), + XSD_ERROR(EAGAIN), + XSD_ERROR(EISCONN), + XSD_ERROR(E2BIG) +}; +#endif + +struct xsd_sockmsg +{ + uint32_t type; /* XS_??? */ + uint32_t req_id;/* Request identifier, echoed in daemon's response. */ + uint32_t tx_id; /* Transaction id (0 if not related to a transaction).= */ + uint32_t len; /* Length of data following this. */ + + /* Generally followed by nul-terminated string(s). */ +}; + +enum xs_watch_type +{ + XS_WATCH_PATH =3D 0, + XS_WATCH_TOKEN +}; + +/* + * `incontents 150 xenstore_struct XenStore wire protocol. + * + * Inter-domain shared memory communications. */ +#define XENSTORE_RING_SIZE 1024 +typedef uint32_t XENSTORE_RING_IDX; +#define MASK_XENSTORE_IDX(idx) ((idx) & (XENSTORE_RING_SIZE-1)) +struct xenstore_domain_interface { + char req[XENSTORE_RING_SIZE]; /* Requests to xenstore daemon. */ + char rsp[XENSTORE_RING_SIZE]; /* Replies and async watch events. */ + XENSTORE_RING_IDX req_cons, req_prod; + XENSTORE_RING_IDX rsp_cons, rsp_prod; + uint32_t server_features; /* Bitmap of features supported by the serve= r */ + uint32_t connection; +}; + +/* Violating this is very bad. See docs/misc/xenstore.txt. */ +#define XENSTORE_PAYLOAD_MAX 4096 + +/* Violating these just gets you an error back */ +#define XENSTORE_ABS_PATH_MAX 3072 +#define XENSTORE_REL_PATH_MAX 2048 + +/* The ability to reconnect a ring */ +#define XENSTORE_SERVER_FEATURE_RECONNECTION 1 + +/* Valid values for the connection field */ +#define XENSTORE_CONNECTED 0 /* the steady-state */ +#define XENSTORE_RECONNECT 1 /* guest has initiated a reconnect */ + +#endif /* _XS_WIRE_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/memory.h b/include/hw/xen/interface/m= emory.h new file mode 100644 index 000000000000..383a9468c36c --- /dev/null +++ b/include/hw/xen/interface/memory.h @@ -0,0 +1,754 @@ +/*************************************************************************= ***** + * memory.h + * + * Memory reservation and information. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2005, Keir Fraser + */ + +#ifndef __XEN_PUBLIC_MEMORY_H__ +#define __XEN_PUBLIC_MEMORY_H__ + +#include "xen.h" +#include "physdev.h" + +/* + * Increase or decrease the specified domain's memory reservation. Returns= the + * number of extents successfully allocated or freed. + * arg =3D=3D addr of struct xen_memory_reservation. + */ +#define XENMEM_increase_reservation 0 +#define XENMEM_decrease_reservation 1 +#define XENMEM_populate_physmap 6 + +#if __XEN_INTERFACE_VERSION__ >=3D 0x00030209 +/* + * Maximum # bits addressable by the user of the allocated region (e.g., I= /O + * devices often have a 32-bit limitation even in 64-bit systems). If zero + * then the user has no addressing restriction. This field is not used by + * XENMEM_decrease_reservation. + */ +#define XENMEMF_address_bits(x) (x) +#define XENMEMF_get_address_bits(x) ((x) & 0xffu) +/* NUMA node to allocate from. */ +#define XENMEMF_node(x) (((x) + 1) << 8) +#define XENMEMF_get_node(x) ((((x) >> 8) - 1) & 0xffu) +/* Flag to populate physmap with populate-on-demand entries */ +#define XENMEMF_populate_on_demand (1<<16) +/* Flag to request allocation only from the node specified */ +#define XENMEMF_exact_node_request (1<<17) +#define XENMEMF_exact_node(n) (XENMEMF_node(n) | XENMEMF_exact_node_reques= t) +/* Flag to indicate the node specified is virtual node */ +#define XENMEMF_vnode (1<<18) +#endif + +struct xen_memory_reservation { + + /* + * XENMEM_increase_reservation: + * OUT: MFN (*not* GMFN) bases of extents that were allocated + * XENMEM_decrease_reservation: + * IN: GMFN bases of extents to free + * XENMEM_populate_physmap: + * IN: GPFN bases of extents to populate with memory + * OUT: GMFN bases of extents that were allocated + * (NB. This command also updates the mach_to_phys translation table) + * XENMEM_claim_pages: + * IN: must be zero + */ + XEN_GUEST_HANDLE(xen_pfn_t) extent_start; + + /* Number of extents, and size/alignment of each (2^extent_order pages= ). */ + xen_ulong_t nr_extents; + unsigned int extent_order; + +#if __XEN_INTERFACE_VERSION__ >=3D 0x00030209 + /* XENMEMF flags. */ + unsigned int mem_flags; +#else + unsigned int address_bits; +#endif + + /* + * Domain whose reservation is being changed. + * Unprivileged domains can specify only DOMID_SELF. + */ + domid_t domid; +}; +typedef struct xen_memory_reservation xen_memory_reservation_t; +DEFINE_XEN_GUEST_HANDLE(xen_memory_reservation_t); + +/* + * An atomic exchange of memory pages. If return code is zero then + * @out.extent_list provides GMFNs of the newly-allocated memory. + * Returns zero on complete success, otherwise a negative error code. + * On complete success then always @nr_exchanged =3D=3D @in.nr_extents. + * On partial success @nr_exchanged indicates how much work was done. + * + * Note that only PV guests can use this operation. + */ +#define XENMEM_exchange 11 +struct xen_memory_exchange { + /* + * [IN] Details of memory extents to be exchanged (GMFN bases). + * Note that @in.address_bits is ignored and unused. + */ + struct xen_memory_reservation in; + + /* + * [IN/OUT] Details of new memory extents. + * We require that: + * 1. @in.domid =3D=3D @out.domid + * 2. @in.nr_extents << @in.extent_order =3D=3D + * @out.nr_extents << @out.extent_order + * 3. @in.extent_start and @out.extent_start lists must not overlap + * 4. @out.extent_start lists GPFN bases to be populated + * 5. @out.extent_start is overwritten with allocated GMFN bases + */ + struct xen_memory_reservation out; + + /* + * [OUT] Number of input extents that were successfully exchanged: + * 1. The first @nr_exchanged input extents were successfully + * deallocated. + * 2. The corresponding first entries in the output extent list corre= ctly + * indicate the GMFNs that were successfully exchanged. + * 3. All other input and output extents are untouched. + * 4. If not all input exents are exchanged then the return code of t= his + * command will be non-zero. + * 5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER! + */ + xen_ulong_t nr_exchanged; +}; +typedef struct xen_memory_exchange xen_memory_exchange_t; +DEFINE_XEN_GUEST_HANDLE(xen_memory_exchange_t); + +/* + * Returns the maximum machine frame number of mapped RAM in this system. + * This command always succeeds (it never returns an error code). + * arg =3D=3D NULL. + */ +#define XENMEM_maximum_ram_page 2 + +struct xen_memory_domain { + /* [IN] Domain information is being queried for. */ + domid_t domid; +}; + +/* + * Returns the current or maximum memory reservation, in pages, of the + * specified domain (may be DOMID_SELF). Returns -ve errcode on failure. + * arg =3D=3D addr of struct xen_memory_domain. + */ +#define XENMEM_current_reservation 3 +#define XENMEM_maximum_reservation 4 + +/* + * Returns the maximum GFN in use by the specified domain (may be DOMID_SE= LF). + * Returns -ve errcode on failure. + * arg =3D=3D addr of struct xen_memory_domain. + */ +#define XENMEM_maximum_gpfn 14 + +/* + * Returns a list of MFN bases of 2MB extents comprising the machine_to_ph= ys + * mapping table. Architectures which do not have a m2p table do not imple= ment + * this command. + * arg =3D=3D addr of xen_machphys_mfn_list_t. + */ +#define XENMEM_machphys_mfn_list 5 +struct xen_machphys_mfn_list { + /* + * Size of the 'extent_start' array. Fewer entries will be filled if t= he + * machphys table is smaller than max_extents * 2MB. + */ + unsigned int max_extents; + + /* + * Pointer to buffer to fill with list of extent starts. If there are + * any large discontiguities in the machine address space, 2MB gaps in + * the machphys table will be represented by an MFN base of zero. + */ + XEN_GUEST_HANDLE(xen_pfn_t) extent_start; + + /* + * Number of extents written to the above array. This will be smaller + * than 'max_extents' if the machphys table is smaller than max_e * 2M= B. + */ + unsigned int nr_extents; +}; +typedef struct xen_machphys_mfn_list xen_machphys_mfn_list_t; +DEFINE_XEN_GUEST_HANDLE(xen_machphys_mfn_list_t); + +/* + * For a compat caller, this is identical to XENMEM_machphys_mfn_list. + * + * For a non compat caller, this functions similarly to + * XENMEM_machphys_mfn_list, but returns the mfns making up the compatibil= ity + * m2p table. + */ +#define XENMEM_machphys_compat_mfn_list 25 + +/* + * Returns the location in virtual address space of the machine_to_phys + * mapping table. Architectures which do not have a m2p table, or which do= not + * map it by default into guest address space, do not implement this comma= nd. + * arg =3D=3D addr of xen_machphys_mapping_t. + */ +#define XENMEM_machphys_mapping 12 +struct xen_machphys_mapping { + xen_ulong_t v_start, v_end; /* Start and end virtual addresses. */ + xen_ulong_t max_mfn; /* Maximum MFN that can be looked up. */ +}; +typedef struct xen_machphys_mapping xen_machphys_mapping_t; +DEFINE_XEN_GUEST_HANDLE(xen_machphys_mapping_t); + +/* Source mapping space. */ +/* ` enum phys_map_space { */ +#define XENMAPSPACE_shared_info 0 /* shared info page */ +#define XENMAPSPACE_grant_table 1 /* grant table page */ +#define XENMAPSPACE_gmfn 2 /* GMFN */ +#define XENMAPSPACE_gmfn_range 3 /* GMFN range, XENMEM_add_to_physmap on= ly. */ +#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another dom, + * XENMEM_add_to_physmap_batch only. */ +#define XENMAPSPACE_dev_mmio 5 /* device mmio region + ARM only; the region is mapped in + Stage-2 using the Normal Memory + Inner/Outer Write-Back Cacheable + memory attribute. */ +/* ` } */ + +/* + * Sets the GPFN at which a particular page appears in the specified guest= 's + * physical address space (translated guests only). + * arg =3D=3D addr of xen_add_to_physmap_t. + */ +#define XENMEM_add_to_physmap 7 +struct xen_add_to_physmap { + /* Which domain to change the mapping for. */ + domid_t domid; + + /* Number of pages to go through for gmfn_range */ + uint16_t size; + + unsigned int space; /* =3D> enum phys_map_space */ + +#define XENMAPIDX_grant_table_status 0x80000000 + + /* Index into space being mapped. */ + xen_ulong_t idx; + + /* GPFN in domid where the source mapping page should appear. */ + xen_pfn_t gpfn; +}; +typedef struct xen_add_to_physmap xen_add_to_physmap_t; +DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t); + +/* A batched version of add_to_physmap. */ +#define XENMEM_add_to_physmap_batch 23 +struct xen_add_to_physmap_batch { + /* IN */ + /* Which domain to change the mapping for. */ + domid_t domid; + uint16_t space; /* =3D> enum phys_map_space */ + + /* Number of pages to go through */ + uint16_t size; + +#if __XEN_INTERFACE_VERSION__ < 0x00040700 + domid_t foreign_domid; /* IFF gmfn_foreign. Should be 0 for other spac= es. */ +#else + union xen_add_to_physmap_batch_extra { + domid_t foreign_domid; /* gmfn_foreign */ + uint16_t res0; /* All the other spaces. Should be 0 */ + } u; +#endif + + /* Indexes into space being mapped. */ + XEN_GUEST_HANDLE(xen_ulong_t) idxs; + + /* GPFN in domid where the source mapping page should appear. */ + XEN_GUEST_HANDLE(xen_pfn_t) gpfns; + + /* OUT */ + + /* Per index error code. */ + XEN_GUEST_HANDLE(int) errs; +}; +typedef struct xen_add_to_physmap_batch xen_add_to_physmap_batch_t; +DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_batch_t); + +#if __XEN_INTERFACE_VERSION__ < 0x00040400 +#define XENMEM_add_to_physmap_range XENMEM_add_to_physmap_batch +#define xen_add_to_physmap_range xen_add_to_physmap_batch +typedef struct xen_add_to_physmap_batch xen_add_to_physmap_range_t; +DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_range_t); +#endif + +/* + * Unmaps the page appearing at a particular GPFN from the specified guest= 's + * physical address space (translated guests only). + * arg =3D=3D addr of xen_remove_from_physmap_t. + */ +#define XENMEM_remove_from_physmap 15 +struct xen_remove_from_physmap { + /* Which domain to change the mapping for. */ + domid_t domid; + + /* GPFN of the current mapping of the page. */ + xen_pfn_t gpfn; +}; +typedef struct xen_remove_from_physmap xen_remove_from_physmap_t; +DEFINE_XEN_GUEST_HANDLE(xen_remove_from_physmap_t); + +/*** REMOVED ***/ +/*#define XENMEM_translate_gpfn_list 8*/ + +/* + * Returns the pseudo-physical memory map as it was when the domain + * was started (specified by XENMEM_set_memory_map). + * arg =3D=3D addr of xen_memory_map_t. + */ +#define XENMEM_memory_map 9 +struct xen_memory_map { + /* + * On call the number of entries which can be stored in buffer. On + * return the number of entries which have been stored in + * buffer. + */ + unsigned int nr_entries; + + /* + * Entries in the buffer are in the same format as returned by the + * BIOS INT 0x15 EAX=3D0xE820 call. + */ + XEN_GUEST_HANDLE(void) buffer; +}; +typedef struct xen_memory_map xen_memory_map_t; +DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t); + +/* + * Returns the real physical memory map. Passes the same structure as + * XENMEM_memory_map. + * Specifying buffer as NULL will return the number of entries required + * to store the complete memory map. + * arg =3D=3D addr of xen_memory_map_t. + */ +#define XENMEM_machine_memory_map 10 + +/* + * Set the pseudo-physical memory map of a domain, as returned by + * XENMEM_memory_map. + * arg =3D=3D addr of xen_foreign_memory_map_t. + */ +#define XENMEM_set_memory_map 13 +struct xen_foreign_memory_map { + domid_t domid; + struct xen_memory_map map; +}; +typedef struct xen_foreign_memory_map xen_foreign_memory_map_t; +DEFINE_XEN_GUEST_HANDLE(xen_foreign_memory_map_t); + +#define XENMEM_set_pod_target 16 +#define XENMEM_get_pod_target 17 +struct xen_pod_target { + /* IN */ + uint64_t target_pages; + /* OUT */ + uint64_t tot_pages; + uint64_t pod_cache_pages; + uint64_t pod_entries; + /* IN */ + domid_t domid; +}; +typedef struct xen_pod_target xen_pod_target_t; + +#if defined(__XEN__) || defined(__XEN_TOOLS__) + +#ifndef uint64_aligned_t +#define uint64_aligned_t uint64_t +#endif + +/* + * Get the number of MFNs saved through memory sharing. + * The call never fails. + */ +#define XENMEM_get_sharing_freed_pages 18 +#define XENMEM_get_sharing_shared_pages 19 + +#define XENMEM_paging_op 20 +#define XENMEM_paging_op_nominate 0 +#define XENMEM_paging_op_evict 1 +#define XENMEM_paging_op_prep 2 + +struct xen_mem_paging_op { + uint8_t op; /* XENMEM_paging_op_* */ + domid_t domain; + + /* IN: (XENMEM_paging_op_prep) buffer to immediately fill page from */ + XEN_GUEST_HANDLE_64(const_uint8) buffer; + /* IN: gfn of page being operated on */ + uint64_aligned_t gfn; +}; +typedef struct xen_mem_paging_op xen_mem_paging_op_t; +DEFINE_XEN_GUEST_HANDLE(xen_mem_paging_op_t); + +#define XENMEM_access_op 21 +#define XENMEM_access_op_set_access 0 +#define XENMEM_access_op_get_access 1 +/* + * XENMEM_access_op_enable_emulate and XENMEM_access_op_disable_emulate are + * currently unused, but since they have been in use please do not reuse t= hem. + * + * #define XENMEM_access_op_enable_emulate 2 + * #define XENMEM_access_op_disable_emulate 3 + */ +#define XENMEM_access_op_set_access_multi 4 + +typedef enum { + XENMEM_access_n, + XENMEM_access_r, + XENMEM_access_w, + XENMEM_access_rw, + XENMEM_access_x, + XENMEM_access_rx, + XENMEM_access_wx, + XENMEM_access_rwx, + /* + * Page starts off as r-x, but automatically + * change to r-w on a write + */ + XENMEM_access_rx2rw, + /* + * Log access: starts off as n, automatically + * goes to rwx, generating an event without + * pausing the vcpu + */ + XENMEM_access_n2rwx, + /* Take the domain default */ + XENMEM_access_default +} xenmem_access_t; + +struct xen_mem_access_op { + /* XENMEM_access_op_* */ + uint8_t op; + /* xenmem_access_t */ + uint8_t access; + domid_t domid; + /* + * Number of pages for set op (or size of pfn_list for + * XENMEM_access_op_set_access_multi) + * Ignored on setting default access and other ops + */ + uint32_t nr; + /* + * First pfn for set op + * pfn for get op + * ~0ull is used to set and get the default access for pages + */ + uint64_aligned_t pfn; + /* + * List of pfns to set access for + * Used only with XENMEM_access_op_set_access_multi + */ + XEN_GUEST_HANDLE(const_uint64) pfn_list; + /* + * Corresponding list of access settings for pfn_list + * Used only with XENMEM_access_op_set_access_multi + */ + XEN_GUEST_HANDLE(const_uint8) access_list; +}; +typedef struct xen_mem_access_op xen_mem_access_op_t; +DEFINE_XEN_GUEST_HANDLE(xen_mem_access_op_t); + +#define XENMEM_sharing_op 22 +#define XENMEM_sharing_op_nominate_gfn 0 +#define XENMEM_sharing_op_nominate_gref 1 +#define XENMEM_sharing_op_share 2 +#define XENMEM_sharing_op_debug_gfn 3 +#define XENMEM_sharing_op_debug_mfn 4 +#define XENMEM_sharing_op_debug_gref 5 +#define XENMEM_sharing_op_add_physmap 6 +#define XENMEM_sharing_op_audit 7 +#define XENMEM_sharing_op_range_share 8 +#define XENMEM_sharing_op_fork 9 +#define XENMEM_sharing_op_fork_reset 10 + +#define XENMEM_SHARING_OP_S_HANDLE_INVALID (-10) +#define XENMEM_SHARING_OP_C_HANDLE_INVALID (-9) + +/* The following allows sharing of grant refs. This is useful + * for sharing utilities sitting as "filters" in IO backends + * (e.g. memshr + blktap(2)). The IO backend is only exposed + * to grant references, and this allows sharing of the grefs */ +#define XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG (xen_mk_ullong(1) << 62) + +#define XENMEM_SHARING_OP_FIELD_MAKE_GREF(field, val) \ + (field) =3D (XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG | val) +#define XENMEM_SHARING_OP_FIELD_IS_GREF(field) \ + ((field) & XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG) +#define XENMEM_SHARING_OP_FIELD_GET_GREF(field) \ + ((field) & (~XENMEM_SHARING_OP_FIELD_IS_GREF_FLAG)) + +struct xen_mem_sharing_op { + uint8_t op; /* XENMEM_sharing_op_* */ + domid_t domain; + + union { + struct mem_sharing_op_nominate { /* OP_NOMINATE_xxx */ + union { + uint64_aligned_t gfn; /* IN: gfn to nominate */ + uint32_t grant_ref; /* IN: grant ref to nominate */ + } u; + uint64_aligned_t handle; /* OUT: the handle */ + } nominate; + struct mem_sharing_op_share { /* OP_SHARE/ADD_PHYSMAP */ + uint64_aligned_t source_gfn; /* IN: the gfn of the source p= age */ + uint64_aligned_t source_handle; /* IN: handle to the source pa= ge */ + uint64_aligned_t client_gfn; /* IN: the client gfn */ + uint64_aligned_t client_handle; /* IN: handle to the client pa= ge */ + domid_t client_domain; /* IN: the client domain id */ + } share; + struct mem_sharing_op_range { /* OP_RANGE_SHARE */ + uint64_aligned_t first_gfn; /* IN: the first gfn */ + uint64_aligned_t last_gfn; /* IN: the last gfn */ + uint64_aligned_t opaque; /* Must be set to 0 */ + domid_t client_domain; /* IN: the client domain id */ + uint16_t _pad[3]; /* Must be set to 0 */ + } range; + struct mem_sharing_op_debug { /* OP_DEBUG_xxx */ + union { + uint64_aligned_t gfn; /* IN: gfn to debug */ + uint64_aligned_t mfn; /* IN: mfn to debug */ + uint32_t gref; /* IN: gref to debug */ + } u; + } debug; + struct mem_sharing_op_fork { /* OP_FORK */ + domid_t parent_domain; /* IN: parent's domain id */ +/* Only makes sense for short-lived forks */ +#define XENMEM_FORK_WITH_IOMMU_ALLOWED (1u << 0) +/* Only makes sense for short-lived forks */ +#define XENMEM_FORK_BLOCK_INTERRUPTS (1u << 1) + uint16_t flags; /* IN: optional settings */ + uint32_t pad; /* Must be set to 0 */ + } fork; + } u; +}; +typedef struct xen_mem_sharing_op xen_mem_sharing_op_t; +DEFINE_XEN_GUEST_HANDLE(xen_mem_sharing_op_t); + +/* + * Attempt to stake a claim for a domain on a quantity of pages + * of system RAM, but _not_ assign specific pageframes. Only + * arithmetic is performed so the hypercall is very fast and need + * not be preemptible, thus sidestepping time-of-check-time-of-use + * races for memory allocation. Returns 0 if the hypervisor page + * allocator has atomically and successfully claimed the requested + * number of pages, else non-zero. + * + * Any domain may have only one active claim. When sufficient memory + * has been allocated to resolve the claim, the claim silently expires. + * Claiming zero pages effectively resets any outstanding claim and + * is always successful. + * + * Note that a valid claim may be staked even after memory has been + * allocated for a domain. In this case, the claim is not incremental, + * i.e. if the domain's total page count is 3, and a claim is staked + * for 10, only 7 additional pages are claimed. + * + * Caller must be privileged or the hypercall fails. + */ +#define XENMEM_claim_pages 24 + +/* + * XENMEM_claim_pages flags - the are no flags at this time. + * The zero value is appropriate. + */ + +/* + * With some legacy devices, certain guest-physical addresses cannot safely + * be used for other purposes, e.g. to map guest RAM. This hypercall + * enumerates those regions so the toolstack can avoid using them. + */ +#define XENMEM_reserved_device_memory_map 27 +struct xen_reserved_device_memory { + xen_pfn_t start_pfn; + xen_ulong_t nr_pages; +}; +typedef struct xen_reserved_device_memory xen_reserved_device_memory_t; +DEFINE_XEN_GUEST_HANDLE(xen_reserved_device_memory_t); + +struct xen_reserved_device_memory_map { +#define XENMEM_RDM_ALL 1 /* Request all regions (ignore dev union). */ + /* IN */ + uint32_t flags; + /* + * IN/OUT + * + * Gets set to the required number of entries when too low, + * signaled by error code -ERANGE. + */ + unsigned int nr_entries; + /* OUT */ + XEN_GUEST_HANDLE(xen_reserved_device_memory_t) buffer; + /* IN */ + union { + physdev_pci_device_t pci; + } dev; +}; +typedef struct xen_reserved_device_memory_map xen_reserved_device_memory_m= ap_t; +DEFINE_XEN_GUEST_HANDLE(xen_reserved_device_memory_map_t); + +#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ + +/* + * Get the pages for a particular guest resource, so that they can be + * mapped directly by a tools domain. + */ +#define XENMEM_acquire_resource 28 +struct xen_mem_acquire_resource { + /* IN - The domain whose resource is to be mapped */ + domid_t domid; + /* IN - the type of resource */ + uint16_t type; + +#define XENMEM_resource_ioreq_server 0 +#define XENMEM_resource_grant_table 1 +#define XENMEM_resource_vmtrace_buf 2 + + /* + * IN - a type-specific resource identifier, which must be zero + * unless stated otherwise. + * + * type =3D=3D XENMEM_resource_ioreq_server -> id =3D=3D ioreq server = id + * type =3D=3D XENMEM_resource_grant_table -> id defined below + */ + uint32_t id; + +#define XENMEM_resource_grant_table_id_shared 0 +#define XENMEM_resource_grant_table_id_status 1 + + /* + * IN/OUT + * + * As an IN parameter number of frames of the resource to be mapped. + * This value may be updated over the course of the operation. + * + * When frame_list is NULL and nr_frames is 0, this is interpreted as a + * request for the size of the resource, which shall be returned in the + * nr_frames field. + * + * The size of a resource will never be zero, but a nonzero result doe= sn't + * guarantee that a subsequent mapping request will be successful. Th= ere + * are further type/id specific constraints which may change between t= he + * two calls. + */ + uint32_t nr_frames; + uint32_t pad; + /* + * IN - the index of the initial frame to be mapped. This parameter + * is ignored if nr_frames is 0. This value may be updated + * over the course of the operation. + */ + uint64_t frame; + +#define XENMEM_resource_ioreq_server_frame_bufioreq 0 +#define XENMEM_resource_ioreq_server_frame_ioreq(n) (1 + (n)) + + /* + * IN/OUT - If the tools domain is PV then, upon return, frame_list + * will be populated with the MFNs of the resource. + * If the tools domain is HVM then it is expected that, on + * entry, frame_list will be populated with a list of GFNs + * that will be mapped to the MFNs of the resource. + * If -EIO is returned then the frame_list has only been + * partially mapped and it is up to the caller to unmap all + * the GFNs. + * This parameter may be NULL if nr_frames is 0. This + * value may be updated over the course of the operation. + */ + XEN_GUEST_HANDLE(xen_pfn_t) frame_list; +}; +typedef struct xen_mem_acquire_resource xen_mem_acquire_resource_t; +DEFINE_XEN_GUEST_HANDLE(xen_mem_acquire_resource_t); + +/* + * XENMEM_get_vnumainfo used by guest to get + * vNUMA topology from hypervisor. + */ +#define XENMEM_get_vnumainfo 26 + +/* vNUMA node memory ranges */ +struct xen_vmemrange { + uint64_t start, end; + unsigned int flags; + unsigned int nid; +}; +typedef struct xen_vmemrange xen_vmemrange_t; +DEFINE_XEN_GUEST_HANDLE(xen_vmemrange_t); + +/* + * vNUMA topology specifies vNUMA node number, distance table, + * memory ranges and vcpu mapping provided for guests. + * XENMEM_get_vnumainfo hypercall expects to see from guest + * nr_vnodes, nr_vmemranges and nr_vcpus to indicate available memory. + * After filling guests structures, nr_vnodes, nr_vmemranges and nr_vcpus + * copied back to guest. Domain returns expected values of nr_vnodes, + * nr_vmemranges and nr_vcpus to guest if the values where incorrect. + */ +struct xen_vnuma_topology_info { + /* IN */ + domid_t domid; + uint16_t pad; + /* IN/OUT */ + unsigned int nr_vnodes; + unsigned int nr_vcpus; + unsigned int nr_vmemranges; + /* OUT */ + union { + XEN_GUEST_HANDLE(uint) h; + uint64_t pad; + } vdistance; + union { + XEN_GUEST_HANDLE(uint) h; + uint64_t pad; + } vcpu_to_vnode; + union { + XEN_GUEST_HANDLE(xen_vmemrange_t) h; + uint64_t pad; + } vmemrange; +}; +typedef struct xen_vnuma_topology_info xen_vnuma_topology_info_t; +DEFINE_XEN_GUEST_HANDLE(xen_vnuma_topology_info_t); + +/* Next available subop number is 29 */ + +#endif /* __XEN_PUBLIC_MEMORY_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/physdev.h b/include/hw/xen/interface/= physdev.h new file mode 100644 index 000000000000..d271766ad0c9 --- /dev/null +++ b/include/hw/xen/interface/physdev.h @@ -0,0 +1,383 @@ +/* + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2006, Keir Fraser + */ + +#ifndef __XEN_PUBLIC_PHYSDEV_H__ +#define __XEN_PUBLIC_PHYSDEV_H__ + +#include "xen.h" + +/* + * Prototype for this hypercall is: + * int physdev_op(int cmd, void *args) + * @cmd =3D=3D PHYSDEVOP_??? (physdev operation). + * @args =3D=3D Operation-specific extra arguments (NULL if none). + */ + +/* + * Notify end-of-interrupt (EOI) for the specified IRQ. + * @arg =3D=3D pointer to physdev_eoi structure. + */ +#define PHYSDEVOP_eoi 12 +struct physdev_eoi { + /* IN */ + uint32_t irq; +}; +typedef struct physdev_eoi physdev_eoi_t; +DEFINE_XEN_GUEST_HANDLE(physdev_eoi_t); + +/* + * Register a shared page for the hypervisor to indicate whether the guest + * must issue PHYSDEVOP_eoi. The semantics of PHYSDEVOP_eoi change slightly + * once the guest used this function in that the associated event channel + * will automatically get unmasked. The page registered is used as a bit + * array indexed by Xen's PIRQ value. + */ +#define PHYSDEVOP_pirq_eoi_gmfn_v1 17 +/* + * Register a shared page for the hypervisor to indicate whether the + * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to + * PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't change the semantics of + * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by + * Xen's PIRQ value. + */ +#define PHYSDEVOP_pirq_eoi_gmfn_v2 28 +struct physdev_pirq_eoi_gmfn { + /* IN */ + xen_pfn_t gmfn; +}; +typedef struct physdev_pirq_eoi_gmfn physdev_pirq_eoi_gmfn_t; +DEFINE_XEN_GUEST_HANDLE(physdev_pirq_eoi_gmfn_t); + +/* + * Query the status of an IRQ line. + * @arg =3D=3D pointer to physdev_irq_status_query structure. + */ +#define PHYSDEVOP_irq_status_query 5 +struct physdev_irq_status_query { + /* IN */ + uint32_t irq; + /* OUT */ + uint32_t flags; /* XENIRQSTAT_* */ +}; +typedef struct physdev_irq_status_query physdev_irq_status_query_t; +DEFINE_XEN_GUEST_HANDLE(physdev_irq_status_query_t); + +/* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */ +#define _XENIRQSTAT_needs_eoi (0) +#define XENIRQSTAT_needs_eoi (1U<<_XENIRQSTAT_needs_eoi) + +/* IRQ shared by multiple guests? */ +#define _XENIRQSTAT_shared (1) +#define XENIRQSTAT_shared (1U<<_XENIRQSTAT_shared) + +/* + * Set the current VCPU's I/O privilege level. + * @arg =3D=3D pointer to physdev_set_iopl structure. + */ +#define PHYSDEVOP_set_iopl 6 +struct physdev_set_iopl { + /* IN */ + uint32_t iopl; +}; +typedef struct physdev_set_iopl physdev_set_iopl_t; +DEFINE_XEN_GUEST_HANDLE(physdev_set_iopl_t); + +/* + * Set the current VCPU's I/O-port permissions bitmap. + * @arg =3D=3D pointer to physdev_set_iobitmap structure. + */ +#define PHYSDEVOP_set_iobitmap 7 +struct physdev_set_iobitmap { + /* IN */ +#if __XEN_INTERFACE_VERSION__ >=3D 0x00030205 + XEN_GUEST_HANDLE(uint8) bitmap; +#else + uint8_t *bitmap; +#endif + uint32_t nr_ports; +}; +typedef struct physdev_set_iobitmap physdev_set_iobitmap_t; +DEFINE_XEN_GUEST_HANDLE(physdev_set_iobitmap_t); + +/* + * Read or write an IO-APIC register. + * @arg =3D=3D pointer to physdev_apic structure. + */ +#define PHYSDEVOP_apic_read 8 +#define PHYSDEVOP_apic_write 9 +struct physdev_apic { + /* IN */ + unsigned long apic_physbase; + uint32_t reg; + /* IN or OUT */ + uint32_t value; +}; +typedef struct physdev_apic physdev_apic_t; +DEFINE_XEN_GUEST_HANDLE(physdev_apic_t); + +/* + * Allocate or free a physical upcall vector for the specified IRQ line. + * @arg =3D=3D pointer to physdev_irq structure. + */ +#define PHYSDEVOP_alloc_irq_vector 10 +#define PHYSDEVOP_free_irq_vector 11 +struct physdev_irq { + /* IN */ + uint32_t irq; + /* IN or OUT */ + uint32_t vector; +}; +typedef struct physdev_irq physdev_irq_t; +DEFINE_XEN_GUEST_HANDLE(physdev_irq_t); + +#define MAP_PIRQ_TYPE_MSI 0x0 +#define MAP_PIRQ_TYPE_GSI 0x1 +#define MAP_PIRQ_TYPE_UNKNOWN 0x2 +#define MAP_PIRQ_TYPE_MSI_SEG 0x3 +#define MAP_PIRQ_TYPE_MULTI_MSI 0x4 + +#define PHYSDEVOP_map_pirq 13 +struct physdev_map_pirq { + domid_t domid; + /* IN */ + int type; + /* IN (ignored for ..._MULTI_MSI) */ + int index; + /* IN or OUT */ + int pirq; + /* IN - high 16 bits hold segment for ..._MSI_SEG and ..._MULTI_MSI */ + int bus; + /* IN */ + int devfn; + /* IN (also OUT for ..._MULTI_MSI) */ + int entry_nr; + /* IN */ + uint64_t table_base; +}; +typedef struct physdev_map_pirq physdev_map_pirq_t; +DEFINE_XEN_GUEST_HANDLE(physdev_map_pirq_t); + +#define PHYSDEVOP_unmap_pirq 14 +struct physdev_unmap_pirq { + domid_t domid; + /* IN */ + int pirq; +}; + +typedef struct physdev_unmap_pirq physdev_unmap_pirq_t; +DEFINE_XEN_GUEST_HANDLE(physdev_unmap_pirq_t); + +#define PHYSDEVOP_manage_pci_add 15 +#define PHYSDEVOP_manage_pci_remove 16 +struct physdev_manage_pci { + /* IN */ + uint8_t bus; + uint8_t devfn; +}; + +typedef struct physdev_manage_pci physdev_manage_pci_t; +DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_t); + +#define PHYSDEVOP_restore_msi 19 +struct physdev_restore_msi { + /* IN */ + uint8_t bus; + uint8_t devfn; +}; +typedef struct physdev_restore_msi physdev_restore_msi_t; +DEFINE_XEN_GUEST_HANDLE(physdev_restore_msi_t); + +#define PHYSDEVOP_manage_pci_add_ext 20 +struct physdev_manage_pci_ext { + /* IN */ + uint8_t bus; + uint8_t devfn; + unsigned is_extfn; + unsigned is_virtfn; + struct { + uint8_t bus; + uint8_t devfn; + } physfn; +}; + +typedef struct physdev_manage_pci_ext physdev_manage_pci_ext_t; +DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_ext_t); + +/* + * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op= () + * hypercall since 0x00030202. + */ +struct physdev_op { + uint32_t cmd; + union { + physdev_irq_status_query_t irq_status_query; + physdev_set_iopl_t set_iopl; + physdev_set_iobitmap_t set_iobitmap; + physdev_apic_t apic_op; + physdev_irq_t irq_op; + } u; +}; +typedef struct physdev_op physdev_op_t; +DEFINE_XEN_GUEST_HANDLE(physdev_op_t); + +#define PHYSDEVOP_setup_gsi 21 +struct physdev_setup_gsi { + int gsi; + /* IN */ + uint8_t triggering; + /* IN */ + uint8_t polarity; + /* IN */ +}; + +typedef struct physdev_setup_gsi physdev_setup_gsi_t; +DEFINE_XEN_GUEST_HANDLE(physdev_setup_gsi_t); + +/* leave PHYSDEVOP 22 free */ + +/* type is MAP_PIRQ_TYPE_GSI or MAP_PIRQ_TYPE_MSI + * the hypercall returns a free pirq */ +#define PHYSDEVOP_get_free_pirq 23 +struct physdev_get_free_pirq { + /* IN */ + int type; + /* OUT */ + uint32_t pirq; +}; + +typedef struct physdev_get_free_pirq physdev_get_free_pirq_t; +DEFINE_XEN_GUEST_HANDLE(physdev_get_free_pirq_t); + +#define XEN_PCI_MMCFG_RESERVED 0x1 + +#define PHYSDEVOP_pci_mmcfg_reserved 24 +struct physdev_pci_mmcfg_reserved { + uint64_t address; + uint16_t segment; + uint8_t start_bus; + uint8_t end_bus; + uint32_t flags; +}; +typedef struct physdev_pci_mmcfg_reserved physdev_pci_mmcfg_reserved_t; +DEFINE_XEN_GUEST_HANDLE(physdev_pci_mmcfg_reserved_t); + +#define XEN_PCI_DEV_EXTFN 0x1 +#define XEN_PCI_DEV_VIRTFN 0x2 +#define XEN_PCI_DEV_PXM 0x4 + +#define PHYSDEVOP_pci_device_add 25 +struct physdev_pci_device_add { + /* IN */ + uint16_t seg; + uint8_t bus; + uint8_t devfn; + uint32_t flags; + struct { + uint8_t bus; + uint8_t devfn; + } physfn; + /* + * Optional parameters array. + * First element ([0]) is PXM domain associated with the device (if + * XEN_PCI_DEV_PXM is set) + */ + uint32_t optarr[XEN_FLEX_ARRAY_DIM]; +}; +typedef struct physdev_pci_device_add physdev_pci_device_add_t; +DEFINE_XEN_GUEST_HANDLE(physdev_pci_device_add_t); + +#define PHYSDEVOP_pci_device_remove 26 +#define PHYSDEVOP_restore_msi_ext 27 +/* + * Dom0 should use these two to announce MMIO resources assigned to + * MSI-X capable devices won't (prepare) or may (release) change. + */ +#define PHYSDEVOP_prepare_msix 30 +#define PHYSDEVOP_release_msix 31 +struct physdev_pci_device { + /* IN */ + uint16_t seg; + uint8_t bus; + uint8_t devfn; +}; +typedef struct physdev_pci_device physdev_pci_device_t; +DEFINE_XEN_GUEST_HANDLE(physdev_pci_device_t); + +#define PHYSDEVOP_DBGP_RESET_PREPARE 1 +#define PHYSDEVOP_DBGP_RESET_DONE 2 + +#define PHYSDEVOP_DBGP_BUS_UNKNOWN 0 +#define PHYSDEVOP_DBGP_BUS_PCI 1 + +#define PHYSDEVOP_dbgp_op 29 +struct physdev_dbgp_op { + /* IN */ + uint8_t op; + uint8_t bus; + union { + physdev_pci_device_t pci; + } u; +}; +typedef struct physdev_dbgp_op physdev_dbgp_op_t; +DEFINE_XEN_GUEST_HANDLE(physdev_dbgp_op_t); + +/* + * Notify that some PIRQ-bound event channels have been unmasked. + * ** This command is obsolete since interface version 0x00030202 and is ** + * ** unsupported by newer versions of Xen. ** + */ +#define PHYSDEVOP_IRQ_UNMASK_NOTIFY 4 + +#if __XEN_INTERFACE_VERSION__ < 0x00040600 +/* + * These all-capitals physdev operation names are superceded by the new na= mes + * (defined above) since interface version 0x00030202. The guard above was + * added post-4.5 only though and hence shouldn't check for 0x00030202. + */ +#define PHYSDEVOP_IRQ_STATUS_QUERY PHYSDEVOP_irq_status_query +#define PHYSDEVOP_SET_IOPL PHYSDEVOP_set_iopl +#define PHYSDEVOP_SET_IOBITMAP PHYSDEVOP_set_iobitmap +#define PHYSDEVOP_APIC_READ PHYSDEVOP_apic_read +#define PHYSDEVOP_APIC_WRITE PHYSDEVOP_apic_write +#define PHYSDEVOP_ASSIGN_VECTOR PHYSDEVOP_alloc_irq_vector +#define PHYSDEVOP_FREE_VECTOR PHYSDEVOP_free_irq_vector +#define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi +#define PHYSDEVOP_IRQ_SHARED XENIRQSTAT_shared +#endif + +#if __XEN_INTERFACE_VERSION__ < 0x00040200 +#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v1 +#else +#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v2 +#endif + +#endif /* __XEN_PUBLIC_PHYSDEV_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/sched.h b/include/hw/xen/interface/sc= hed.h new file mode 100644 index 000000000000..811bd87c82e7 --- /dev/null +++ b/include/hw/xen/interface/sched.h @@ -0,0 +1,202 @@ +/*************************************************************************= ***** + * sched.h + * + * Scheduler state interactions + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2005, Keir Fraser + */ + +#ifndef __XEN_PUBLIC_SCHED_H__ +#define __XEN_PUBLIC_SCHED_H__ + +#include "event_channel.h" + +/* + * `incontents 150 sched Guest Scheduler Operations + * + * The SCHEDOP interface provides mechanisms for a guest to interact + * with the scheduler, including yield, blocking and shutting itself + * down. + */ + +/* + * The prototype for this hypercall is: + * ` long HYPERVISOR_sched_op(enum sched_op cmd, void *arg, ...) + * + * @cmd =3D=3D SCHEDOP_??? (scheduler operation). + * @arg =3D=3D Operation-specific extra argument(s), as described below. + * ... =3D=3D Additional Operation-specific extra arguments, described be= low. + * + * Versions of Xen prior to 3.0.2 provided only the following legacy versi= on + * of this hypercall, supporting only the commands yield, block and shutdo= wn: + * long sched_op(int cmd, unsigned long arg) + * @cmd =3D=3D SCHEDOP_??? (scheduler operation). + * @arg =3D=3D 0 (SCHEDOP_yield and SCHEDOP_block) + * =3D=3D SHUTDOWN_* code (SCHEDOP_shutdown) + * + * This legacy version is available to new guests as: + * ` long HYPERVISOR_sched_op_compat(enum sched_op cmd, unsigned long arg) + */ + +/* ` enum sched_op { // SCHEDOP_* =3D> struct sched_* */ +/* + * Voluntarily yield the CPU. + * @arg =3D=3D NULL. + */ +#define SCHEDOP_yield 0 + +/* + * Block execution of this VCPU until an event is received for processing. + * If called with event upcalls masked, this operation will atomically + * reenable event delivery and check for pending events before blocking the + * VCPU. This avoids a "wakeup waiting" race. + * @arg =3D=3D NULL. + */ +#define SCHEDOP_block 1 + +/* + * Halt execution of this domain (all VCPUs) and notify the system control= ler. + * @arg =3D=3D pointer to sched_shutdown_t structure. + * + * If the sched_shutdown_t reason is SHUTDOWN_suspend then + * x86 PV guests must also set RDX (EDX for 32-bit guests) to the MFN + * of the guest's start info page. RDX/EDX is the third hypercall + * argument. + * + * In addition, which reason is SHUTDOWN_suspend this hypercall + * returns 1 if suspend was cancelled or the domain was merely + * checkpointed, and 0 if it is resuming in a new domain. + */ +#define SCHEDOP_shutdown 2 + +/* + * Poll a set of event-channel ports. Return when one or more are pending.= An + * optional timeout may be specified. + * @arg =3D=3D pointer to sched_poll_t structure. + */ +#define SCHEDOP_poll 3 + +/* + * Declare a shutdown for another domain. The main use of this function is + * in interpreting shutdown requests and reasons for fully-virtualized + * domains. A para-virtualized domain may use SCHEDOP_shutdown directly. + * @arg =3D=3D pointer to sched_remote_shutdown_t structure. + */ +#define SCHEDOP_remote_shutdown 4 + +/* + * Latch a shutdown code, so that when the domain later shuts down it + * reports this code to the control tools. + * @arg =3D=3D sched_shutdown_t, as for SCHEDOP_shutdown. + */ +#define SCHEDOP_shutdown_code 5 + +/* + * Setup, poke and destroy a domain watchdog timer. + * @arg =3D=3D pointer to sched_watchdog_t structure. + * With id =3D=3D 0, setup a domain watchdog timer to cause domain shutdown + * after timeout, returns watchdog id. + * With id !=3D 0 and timeout =3D=3D 0, destroy domain watchdog timer. + * With id !=3D 0 and timeout !=3D 0, poke watchdog timer and set new time= out. + */ +#define SCHEDOP_watchdog 6 + +/* + * Override the current vcpu affinity by pinning it to one physical cpu or + * undo this override restoring the previous affinity. + * @arg =3D=3D pointer to sched_pin_override_t structure. + * + * A negative pcpu value will undo a previous pin override and restore the + * previous cpu affinity. + * This call is allowed for the hardware domain only and requires the cpu + * to be part of the domain's cpupool. + */ +#define SCHEDOP_pin_override 7 +/* ` } */ + +struct sched_shutdown { + unsigned int reason; /* SHUTDOWN_* =3D> enum sched_shutdown_reason */ +}; +typedef struct sched_shutdown sched_shutdown_t; +DEFINE_XEN_GUEST_HANDLE(sched_shutdown_t); + +struct sched_poll { + XEN_GUEST_HANDLE(evtchn_port_t) ports; + unsigned int nr_ports; + uint64_t timeout; +}; +typedef struct sched_poll sched_poll_t; +DEFINE_XEN_GUEST_HANDLE(sched_poll_t); + +struct sched_remote_shutdown { + domid_t domain_id; /* Remote domain ID */ + unsigned int reason; /* SHUTDOWN_* =3D> enum sched_shutdown_reas= on */ +}; +typedef struct sched_remote_shutdown sched_remote_shutdown_t; +DEFINE_XEN_GUEST_HANDLE(sched_remote_shutdown_t); + +struct sched_watchdog { + uint32_t id; /* watchdog ID */ + uint32_t timeout; /* timeout */ +}; +typedef struct sched_watchdog sched_watchdog_t; +DEFINE_XEN_GUEST_HANDLE(sched_watchdog_t); + +struct sched_pin_override { + int32_t pcpu; +}; +typedef struct sched_pin_override sched_pin_override_t; +DEFINE_XEN_GUEST_HANDLE(sched_pin_override_t); + +/* + * Reason codes for SCHEDOP_shutdown. These may be interpreted by control + * software to determine the appropriate action. For the most part, Xen do= es + * not care about the shutdown code. + */ +/* ` enum sched_shutdown_reason { */ +#define SHUTDOWN_poweroff 0 /* Domain exited normally. Clean up and kil= l. */ +#define SHUTDOWN_reboot 1 /* Clean up, kill, and then restart. = */ +#define SHUTDOWN_suspend 2 /* Clean up, save suspend info, kill. = */ +#define SHUTDOWN_crash 3 /* Tell controller we've crashed. = */ +#define SHUTDOWN_watchdog 4 /* Restart because watchdog time expired. = */ + +/* + * Domain asked to perform 'soft reset' for it. The expected behavior is to + * reset internal Xen state for the domain returning it to the point where= it + * was created but leaving the domain's memory contents and vCPU contexts + * intact. This will allow the domain to start over and set up all Xen spe= cific + * interfaces again. + */ +#define SHUTDOWN_soft_reset 5 +#define SHUTDOWN_MAX 5 /* Maximum valid shutdown reason. = */ +/* ` } */ + +#endif /* __XEN_PUBLIC_SCHED_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/trace.h b/include/hw/xen/interface/tr= ace.h new file mode 100644 index 000000000000..d5fa4aea8dd8 --- /dev/null +++ b/include/hw/xen/interface/trace.h @@ -0,0 +1,341 @@ +/*************************************************************************= ***** + * include/public/trace.h + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Mark Williamson, (C) 2004 Intel Research Cambridge + * Copyright (C) 2005 Bin Ren + */ + +#ifndef __XEN_PUBLIC_TRACE_H__ +#define __XEN_PUBLIC_TRACE_H__ + +#define TRACE_EXTRA_MAX 7 +#define TRACE_EXTRA_SHIFT 28 + +/* Trace classes */ +#define TRC_CLS_SHIFT 16 +#define TRC_GEN 0x0001f000 /* General trace */ +#define TRC_SCHED 0x0002f000 /* Xen Scheduler trace */ +#define TRC_DOM0OP 0x0004f000 /* Xen DOM0 operation trace */ +#define TRC_HVM 0x0008f000 /* Xen HVM trace */ +#define TRC_MEM 0x0010f000 /* Xen memory trace */ +#define TRC_PV 0x0020f000 /* Xen PV traces */ +#define TRC_SHADOW 0x0040f000 /* Xen shadow tracing */ +#define TRC_HW 0x0080f000 /* Xen hardware-related traces */ +#define TRC_GUEST 0x0800f000 /* Guest-generated traces */ +#define TRC_ALL 0x0ffff000 +#define TRC_HD_TO_EVENT(x) ((x)&0x0fffffff) +#define TRC_HD_CYCLE_FLAG (1UL<<31) +#define TRC_HD_INCLUDES_CYCLE_COUNT(x) ( !!( (x) & TRC_HD_CYCLE_FLAG ) ) +#define TRC_HD_EXTRA(x) (((x)>>TRACE_EXTRA_SHIFT)&TRACE_EXTRA_MAX) + +/* Trace subclasses */ +#define TRC_SUBCLS_SHIFT 12 + +/* trace subclasses for SVM */ +#define TRC_HVM_ENTRYEXIT 0x00081000 /* VMENTRY and #VMEXIT */ +#define TRC_HVM_HANDLER 0x00082000 /* various HVM handlers */ +#define TRC_HVM_EMUL 0x00084000 /* emulated devices */ + +#define TRC_SCHED_MIN 0x00021000 /* Just runstate changes */ +#define TRC_SCHED_CLASS 0x00022000 /* Scheduler-specific */ +#define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */ + +/* + * The highest 3 bits of the last 12 bits of TRC_SCHED_CLASS above are + * reserved for encoding what scheduler produced the information. The + * actual event is encoded in the last 9 bits. + * + * This means we have 8 scheduling IDs available (which means at most 8 + * schedulers generating events) and, in each scheduler, up to 512 + * different events. + */ +#define TRC_SCHED_ID_BITS 3 +#define TRC_SCHED_ID_SHIFT (TRC_SUBCLS_SHIFT - TRC_SCHED_ID_BITS) +#define TRC_SCHED_ID_MASK (((1UL<cpu_offset[cpu]). + */ +struct t_info { + uint16_t tbuf_size; /* Size in pages of each trace buffer */ + uint16_t mfn_offset[]; /* Offset within t_info structure of the page = list per cpu */ + /* MFN lists immediately after the header */ +}; + +#endif /* __XEN_PUBLIC_TRACE_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/vcpu.h b/include/hw/xen/interface/vcp= u.h new file mode 100644 index 000000000000..3623af932f7e --- /dev/null +++ b/include/hw/xen/interface/vcpu.h @@ -0,0 +1,248 @@ +/*************************************************************************= ***** + * vcpu.h + * + * VCPU initialisation, query, and hotplug. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2005, Keir Fraser + */ + +#ifndef __XEN_PUBLIC_VCPU_H__ +#define __XEN_PUBLIC_VCPU_H__ + +#include "xen.h" + +/* + * Prototype for this hypercall is: + * long vcpu_op(int cmd, unsigned int vcpuid, void *extra_args) + * @cmd =3D=3D VCPUOP_??? (VCPU operation). + * @vcpuid =3D=3D VCPU to operate on. + * @extra_args =3D=3D Operation-specific extra arguments (NULL if none). + */ + +/* + * Initialise a VCPU. Each VCPU can be initialised only once. A + * newly-initialised VCPU will not run until it is brought up by VCPUOP_up. + * + * @extra_arg =3D=3D For PV or ARM guests this is a pointer to a vcpu_gues= t_context + * structure containing the initial state for the VCPU. For = x86 + * HVM based guests this is a pointer to a vcpu_hvm_context + * structure. + */ +#define VCPUOP_initialise 0 + +/* + * Bring up a VCPU. This makes the VCPU runnable. This operation will fail + * if the VCPU has not been initialised (VCPUOP_initialise). + */ +#define VCPUOP_up 1 + +/* + * Bring down a VCPU (i.e., make it non-runnable). + * There are a few caveats that callers should observe: + * 1. This operation may return, and VCPU_is_up may return false, before = the + * VCPU stops running (i.e., the command is asynchronous). It is a good + * idea to ensure that the VCPU has entered a non-critical loop before + * bringing it down. Alternatively, this operation is guaranteed + * synchronous if invoked by the VCPU itself. + * 2. After a VCPU is initialised, there is currently no way to drop all = its + * references to domain memory. Even a VCPU that is down still holds + * memory references via its pagetable base pointer and GDT. It is good + * practise to move a VCPU onto an 'idle' or default page table, LDT a= nd + * GDT before bringing it down. + */ +#define VCPUOP_down 2 + +/* Returns 1 if the given VCPU is up. */ +#define VCPUOP_is_up 3 + +/* + * Return information about the state and running time of a VCPU. + * @extra_arg =3D=3D pointer to vcpu_runstate_info structure. + */ +#define VCPUOP_get_runstate_info 4 +struct vcpu_runstate_info { + /* VCPU's current state (RUNSTATE_*). */ + int state; + /* When was current state entered (system time, ns)? */ + uint64_t state_entry_time; + /* + * Update indicator set in state_entry_time: + * When activated via VMASST_TYPE_runstate_update_flag, set during + * updates in guest memory mapped copy of vcpu_runstate_info. + */ +#define XEN_RUNSTATE_UPDATE (xen_mk_ullong(1) << 63) + /* + * Time spent in each RUNSTATE_* (ns). The sum of these times is + * guaranteed not to drift from system time. + */ + uint64_t time[4]; +}; +typedef struct vcpu_runstate_info vcpu_runstate_info_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_runstate_info_t); + +/* VCPU is currently running on a physical CPU. */ +#define RUNSTATE_running 0 + +/* VCPU is runnable, but not currently scheduled on any physical CPU. */ +#define RUNSTATE_runnable 1 + +/* VCPU is blocked (a.k.a. idle). It is therefore not runnable. */ +#define RUNSTATE_blocked 2 + +/* + * VCPU is not runnable, but it is not blocked. + * This is a 'catch all' state for things like hotplug and pauses by the + * system administrator (or for critical sections in the hypervisor). + * RUNSTATE_blocked dominates this state (it is the preferred state). + */ +#define RUNSTATE_offline 3 + +/* + * Register a shared memory area from which the guest may obtain its own + * runstate information without needing to execute a hypercall. + * Notes: + * 1. The registered address may be virtual or physical or guest handle, + * depending on the platform. Virtual address or guest handle should be + * registered on x86 systems. + * 2. Only one shared area may be registered per VCPU. The shared area is + * updated by the hypervisor each time the VCPU is scheduled. Thus + * runstate.state will always be RUNSTATE_running and + * runstate.state_entry_time will indicate the system time at which the + * VCPU was last scheduled to run. + * @extra_arg =3D=3D pointer to vcpu_register_runstate_memory_area structu= re. + */ +#define VCPUOP_register_runstate_memory_area 5 +struct vcpu_register_runstate_memory_area { + union { + XEN_GUEST_HANDLE(vcpu_runstate_info_t) h; + struct vcpu_runstate_info *v; + uint64_t p; + } addr; +}; +typedef struct vcpu_register_runstate_memory_area vcpu_register_runstate_m= emory_area_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_register_runstate_memory_area_t); + +/* + * Set or stop a VCPU's periodic timer. Every VCPU has one periodic timer + * which can be set via these commands. Periods smaller than one milliseco= nd + * may not be supported. + */ +#define VCPUOP_set_periodic_timer 6 /* arg =3D=3D vcpu_set_periodic_tim= er_t */ +#define VCPUOP_stop_periodic_timer 7 /* arg =3D=3D NULL */ +struct vcpu_set_periodic_timer { + uint64_t period_ns; +}; +typedef struct vcpu_set_periodic_timer vcpu_set_periodic_timer_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_set_periodic_timer_t); + +/* + * Set or stop a VCPU's single-shot timer. Every VCPU has one single-shot + * timer which can be set via these commands. + */ +#define VCPUOP_set_singleshot_timer 8 /* arg =3D=3D vcpu_set_singleshot_t= imer_t */ +#define VCPUOP_stop_singleshot_timer 9 /* arg =3D=3D NULL */ +struct vcpu_set_singleshot_timer { + uint64_t timeout_abs_ns; /* Absolute system time value in nanosecond= s. */ + uint32_t flags; /* VCPU_SSHOTTMR_??? */ +}; +typedef struct vcpu_set_singleshot_timer vcpu_set_singleshot_timer_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_set_singleshot_timer_t); + +/* Flags to VCPUOP_set_singleshot_timer. */ + /* Require the timeout to be in the future (return -ETIME if it's passed)= . */ +#define _VCPU_SSHOTTMR_future (0) +#define VCPU_SSHOTTMR_future (1U << _VCPU_SSHOTTMR_future) + +/* + * Register a memory location in the guest address space for the + * vcpu_info structure. This allows the guest to place the vcpu_info + * structure in a convenient place, such as in a per-cpu data area. + * The pointer need not be page aligned, but the structure must not + * cross a page boundary. + * + * This may be called only once per vcpu. + */ +#define VCPUOP_register_vcpu_info 10 /* arg =3D=3D vcpu_register_vcpu_i= nfo_t */ +struct vcpu_register_vcpu_info { + uint64_t mfn; /* mfn of page to place vcpu_info */ + uint32_t offset; /* offset within page */ + uint32_t rsvd; /* unused */ +}; +typedef struct vcpu_register_vcpu_info vcpu_register_vcpu_info_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_register_vcpu_info_t); + +/* Send an NMI to the specified VCPU. @extra_arg =3D=3D NULL. */ +#define VCPUOP_send_nmi 11 + +/* + * Get the physical ID information for a pinned vcpu's underlying physical + * processor. The physical ID informmation is architecture-specific. + * On x86: id[31:0]=3Dapic_id, id[63:32]=3Dacpi_id. + * This command returns -EINVAL if it is not a valid operation for this VC= PU. + */ +#define VCPUOP_get_physid 12 /* arg =3D=3D vcpu_get_physid_t */ +struct vcpu_get_physid { + uint64_t phys_id; +}; +typedef struct vcpu_get_physid vcpu_get_physid_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_get_physid_t); +#define xen_vcpu_physid_to_x86_apicid(physid) ((uint32_t)(physid)) +#define xen_vcpu_physid_to_x86_acpiid(physid) ((uint32_t)((physid) >> 32)) + +/* + * Register a memory location to get a secondary copy of the vcpu time + * parameters. The master copy still exists as part of the vcpu shared + * memory area, and this secondary copy is updated whenever the master copy + * is updated (and using the same versioning scheme for synchronisation). + * + * The intent is that this copy may be mapped (RO) into userspace so + * that usermode can compute system time using the time info and the + * tsc. Usermode will see an array of vcpu_time_info structures, one + * for each vcpu, and choose the right one by an existing mechanism + * which allows it to get the current vcpu number (such as via a + * segment limit). It can then apply the normal algorithm to compute + * system time from the tsc. + * + * @extra_arg =3D=3D pointer to vcpu_register_time_info_memory_area struct= ure. + */ +#define VCPUOP_register_vcpu_time_memory_area 13 +DEFINE_XEN_GUEST_HANDLE(vcpu_time_info_t); +struct vcpu_register_time_memory_area { + union { + XEN_GUEST_HANDLE(vcpu_time_info_t) h; + struct vcpu_time_info *v; + uint64_t p; + } addr; +}; +typedef struct vcpu_register_time_memory_area vcpu_register_time_memory_ar= ea_t; +DEFINE_XEN_GUEST_HANDLE(vcpu_register_time_memory_area_t); + +#endif /* __XEN_PUBLIC_VCPU_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/version.h b/include/hw/xen/interface/= version.h new file mode 100644 index 000000000000..17a81e23cde4 --- /dev/null +++ b/include/hw/xen/interface/version.h @@ -0,0 +1,113 @@ +/*************************************************************************= ***** + * version.h + * + * Xen version, type, and compile information. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2005, Nguyen Anh Quynh + * Copyright (c) 2005, Keir Fraser + */ + +#ifndef __XEN_PUBLIC_VERSION_H__ +#define __XEN_PUBLIC_VERSION_H__ + +#include "xen.h" + +/* NB. All ops return zero on success, except XENVER_{version,pagesize} + * XENVER_{version,pagesize,build_id} */ + +/* arg =3D=3D NULL; returns major:minor (16:16). */ +#define XENVER_version 0 + +/* arg =3D=3D xen_extraversion_t. */ +#define XENVER_extraversion 1 +typedef char xen_extraversion_t[16]; +#define XEN_EXTRAVERSION_LEN (sizeof(xen_extraversion_t)) + +/* arg =3D=3D xen_compile_info_t. */ +#define XENVER_compile_info 2 +struct xen_compile_info { + char compiler[64]; + char compile_by[16]; + char compile_domain[32]; + char compile_date[32]; +}; +typedef struct xen_compile_info xen_compile_info_t; + +#define XENVER_capabilities 3 +typedef char xen_capabilities_info_t[1024]; +#define XEN_CAPABILITIES_INFO_LEN (sizeof(xen_capabilities_info_t)) + +#define XENVER_changeset 4 +typedef char xen_changeset_info_t[64]; +#define XEN_CHANGESET_INFO_LEN (sizeof(xen_changeset_info_t)) + +#define XENVER_platform_parameters 5 +struct xen_platform_parameters { + xen_ulong_t virt_start; +}; +typedef struct xen_platform_parameters xen_platform_parameters_t; + +#define XENVER_get_features 6 +struct xen_feature_info { + unsigned int submap_idx; /* IN: which 32-bit submap to return */ + uint32_t submap; /* OUT: 32-bit submap */ +}; +typedef struct xen_feature_info xen_feature_info_t; + +/* Declares the features reported by XENVER_get_features. */ +#include "features.h" + +/* arg =3D=3D NULL; returns host memory page size. */ +#define XENVER_pagesize 7 + +/* arg =3D=3D xen_domain_handle_t. + * + * The toolstack fills it out for guest consumption. It is intended to hold + * the UUID of the guest. + */ +#define XENVER_guest_handle 8 + +#define XENVER_commandline 9 +typedef char xen_commandline_t[1024]; + +/* + * Return value is the number of bytes written, or XEN_Exx on error. + * Calling with empty parameter returns the size of build_id. + */ +#define XENVER_build_id 10 +struct xen_build_id { + uint32_t len; /* IN: size of buf[]. */ + unsigned char buf[XEN_FLEX_ARRAY_DIM]; + /* OUT: Variable length buffer with build_id.= */ +}; +typedef struct xen_build_id xen_build_id_t; + +#endif /* __XEN_PUBLIC_VERSION_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/interface/xen-compat.h b/include/hw/xen/interfa= ce/xen-compat.h new file mode 100644 index 000000000000..e1c027a95c7c --- /dev/null +++ b/include/hw/xen/interface/xen-compat.h @@ -0,0 +1,46 @@ +/*************************************************************************= ***** + * xen-compat.h + * + * Guest OS interface to Xen. Compatibility layer. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2006, Christian Limpach + */ + +#ifndef __XEN_PUBLIC_XEN_COMPAT_H__ +#define __XEN_PUBLIC_XEN_COMPAT_H__ + +#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040e00 + +#if defined(__XEN__) || defined(__XEN_TOOLS__) +/* Xen is built with matching headers and implements the latest interface.= */ +#define __XEN_INTERFACE_VERSION__ __XEN_LATEST_INTERFACE_VERSION__ +#elif !defined(__XEN_INTERFACE_VERSION__) +/* Guests which do not specify a version get the legacy interface. */ +#define __XEN_INTERFACE_VERSION__ 0x00000000 +#endif + +#if __XEN_INTERFACE_VERSION__ > __XEN_LATEST_INTERFACE_VERSION__ +#error "These header files do not support the requested interface version." +#endif + +#define COMPAT_FLEX_ARRAY_DIM XEN_FLEX_ARRAY_DIM + +#endif /* __XEN_PUBLIC_XEN_COMPAT_H__ */ diff --git a/include/hw/xen/interface/xen.h b/include/hw/xen/interface/xen.h new file mode 100644 index 000000000000..e373592c33c5 --- /dev/null +++ b/include/hw/xen/interface/xen.h @@ -0,0 +1,1049 @@ +/*************************************************************************= ***** + * xen.h + * + * Guest OS interface to Xen. + * + * Permission is hereby granted, free of charge, to any person obtaining a= copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation = the + * rights to use, copy, modify, merge, publish, distribute, sublicense, an= d/or + * sell copies of the Software, and to permit persons to whom the Software= is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included= in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS= OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL= THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (c) 2004, K A Fraser + */ + +#ifndef __XEN_PUBLIC_XEN_H__ +#define __XEN_PUBLIC_XEN_H__ + +#include "xen-compat.h" + +#if defined(__i386__) || defined(__x86_64__) +#include "arch-x86/xen.h" +#elif defined(__arm__) || defined (__aarch64__) +#include "arch-arm.h" +#else +#error "Unsupported architecture" +#endif + +#ifndef __ASSEMBLY__ +/* Guest handles for primitive C types. */ +DEFINE_XEN_GUEST_HANDLE(char); +__DEFINE_XEN_GUEST_HANDLE(uchar, unsigned char); +DEFINE_XEN_GUEST_HANDLE(int); +__DEFINE_XEN_GUEST_HANDLE(uint, unsigned int); +#if __XEN_INTERFACE_VERSION__ < 0x00040300 +DEFINE_XEN_GUEST_HANDLE(long); +__DEFINE_XEN_GUEST_HANDLE(ulong, unsigned long); +#endif +DEFINE_XEN_GUEST_HANDLE(void); + +DEFINE_XEN_GUEST_HANDLE(uint64_t); +DEFINE_XEN_GUEST_HANDLE(xen_pfn_t); +DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); + +/* Define a variable length array (depends on compiler). */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >=3D 199901L +#define XEN_FLEX_ARRAY_DIM +#elif defined(__GNUC__) +#define XEN_FLEX_ARRAY_DIM 0 +#else +#define XEN_FLEX_ARRAY_DIM 1 /* variable size */ +#endif + +/* Turn a plain number into a C unsigned (long (long)) constant. */ +#define __xen_mk_uint(x) x ## U +#define __xen_mk_ulong(x) x ## UL +#ifndef __xen_mk_ullong +# define __xen_mk_ullong(x) x ## ULL +#endif +#define xen_mk_uint(x) __xen_mk_uint(x) +#define xen_mk_ulong(x) __xen_mk_ulong(x) +#define xen_mk_ullong(x) __xen_mk_ullong(x) + +#else + +/* In assembly code we cannot use C numeric constant suffixes. */ +#define xen_mk_uint(x) x +#define xen_mk_ulong(x) x +#define xen_mk_ullong(x) x + +#endif + +/* + * HYPERCALLS + */ + +/* `incontents 100 hcalls List of hypercalls + * ` enum hypercall_num { // __HYPERVISOR_* =3D> HYPERVISOR_*() + */ + +#define __HYPERVISOR_set_trap_table 0 +#define __HYPERVISOR_mmu_update 1 +#define __HYPERVISOR_set_gdt 2 +#define __HYPERVISOR_stack_switch 3 +#define __HYPERVISOR_set_callbacks 4 +#define __HYPERVISOR_fpu_taskswitch 5 +#define __HYPERVISOR_sched_op_compat 6 /* compat since 0x00030101 */ +#define __HYPERVISOR_platform_op 7 +#define __HYPERVISOR_set_debugreg 8 +#define __HYPERVISOR_get_debugreg 9 +#define __HYPERVISOR_update_descriptor 10 +#define __HYPERVISOR_memory_op 12 +#define __HYPERVISOR_multicall 13 +#define __HYPERVISOR_update_va_mapping 14 +#define __HYPERVISOR_set_timer_op 15 +#define __HYPERVISOR_event_channel_op_compat 16 /* compat since 0x00030202= */ +#define __HYPERVISOR_xen_version 17 +#define __HYPERVISOR_console_io 18 +#define __HYPERVISOR_physdev_op_compat 19 /* compat since 0x00030202 */ +#define __HYPERVISOR_grant_table_op 20 +#define __HYPERVISOR_vm_assist 21 +#define __HYPERVISOR_update_va_mapping_otherdomain 22 +#define __HYPERVISOR_iret 23 /* x86 only */ +#define __HYPERVISOR_vcpu_op 24 +#define __HYPERVISOR_set_segment_base 25 /* x86/64 only */ +#define __HYPERVISOR_mmuext_op 26 +#define __HYPERVISOR_xsm_op 27 +#define __HYPERVISOR_nmi_op 28 +#define __HYPERVISOR_sched_op 29 +#define __HYPERVISOR_callback_op 30 +#define __HYPERVISOR_xenoprof_op 31 +#define __HYPERVISOR_event_channel_op 32 +#define __HYPERVISOR_physdev_op 33 +#define __HYPERVISOR_hvm_op 34 +#define __HYPERVISOR_sysctl 35 +#define __HYPERVISOR_domctl 36 +#define __HYPERVISOR_kexec_op 37 +#define __HYPERVISOR_tmem_op 38 +#define __HYPERVISOR_argo_op 39 +#define __HYPERVISOR_xenpmu_op 40 +#define __HYPERVISOR_dm_op 41 +#define __HYPERVISOR_hypfs_op 42 + +/* Architecture-specific hypercall definitions. */ +#define __HYPERVISOR_arch_0 48 +#define __HYPERVISOR_arch_1 49 +#define __HYPERVISOR_arch_2 50 +#define __HYPERVISOR_arch_3 51 +#define __HYPERVISOR_arch_4 52 +#define __HYPERVISOR_arch_5 53 +#define __HYPERVISOR_arch_6 54 +#define __HYPERVISOR_arch_7 55 + +/* ` } */ + +/* + * HYPERCALL COMPATIBILITY. + */ + +/* New sched_op hypercall introduced in 0x00030101. */ +#if __XEN_INTERFACE_VERSION__ < 0x00030101 +#undef __HYPERVISOR_sched_op +#define __HYPERVISOR_sched_op __HYPERVISOR_sched_op_compat +#endif + +/* New event-channel and physdev hypercalls introduced in 0x00030202. */ +#if __XEN_INTERFACE_VERSION__ < 0x00030202 +#undef __HYPERVISOR_event_channel_op +#define __HYPERVISOR_event_channel_op __HYPERVISOR_event_channel_op_compat +#undef __HYPERVISOR_physdev_op +#define __HYPERVISOR_physdev_op __HYPERVISOR_physdev_op_compat +#endif + +/* New platform_op hypercall introduced in 0x00030204. */ +#if __XEN_INTERFACE_VERSION__ < 0x00030204 +#define __HYPERVISOR_dom0_op __HYPERVISOR_platform_op +#endif + +/* + * VIRTUAL INTERRUPTS + * + * Virtual interrupts that a guest OS may receive from Xen. + * + * In the side comments, 'V.' denotes a per-VCPU VIRQ while 'G.' denotes a + * global VIRQ. The former can be bound once per VCPU and cannot be re-bou= nd. + * The latter can be allocated only once per guest: they must initially be + * allocated to VCPU0 but can subsequently be re-bound. + */ +/* ` enum virq { */ +#define VIRQ_TIMER 0 /* V. Timebase update, and/or requested timeout= . */ +#define VIRQ_DEBUG 1 /* V. Request guest to dump debug info. = */ +#define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency consol= e. */ +#define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain.= */ +#define VIRQ_TBUF 4 /* G. (DOM0) Trace buffer has records available= . */ +#define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging.= */ +#define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample availab= le */ +#define VIRQ_CON_RING 8 /* G. (DOM0) Bytes received on console = */ +#define VIRQ_PCPU_STATE 9 /* G. (DOM0) PCPU state changed = */ +#define VIRQ_MEM_EVENT 10 /* G. (DOM0) A memory event has occurred = */ +#define VIRQ_ARGO 11 /* G. Argo interdomain message notification = */ +#define VIRQ_ENOMEM 12 /* G. (DOM0) Low on heap memory */ +#define VIRQ_XENPMU 13 /* V. PMC interrupt = */ + +/* Architecture-specific VIRQ definitions. */ +#define VIRQ_ARCH_0 16 +#define VIRQ_ARCH_1 17 +#define VIRQ_ARCH_2 18 +#define VIRQ_ARCH_3 19 +#define VIRQ_ARCH_4 20 +#define VIRQ_ARCH_5 21 +#define VIRQ_ARCH_6 22 +#define VIRQ_ARCH_7 23 +/* ` } */ + +#define NR_VIRQS 24 + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_mmu_update(const struct mmu_update reqs[], + * ` unsigned count, unsigned *done_out, + * ` unsigned foreigndom) + * ` + * @reqs is an array of mmu_update_t structures ((ptr, val) pairs). + * @count is the length of the above array. + * @pdone is an output parameter indicating number of completed operations + * @foreigndom[15:0]: FD, the expected owner of data pages referenced in t= his + * hypercall invocation. Can be DOMID_SELF. + * @foreigndom[31:16]: PFD, the expected owner of pagetable pages referenc= ed + * in this hypercall invocation. The value of this fie= ld + * (x) encodes the PFD as follows: + * x =3D=3D 0 =3D> PFD =3D=3D DOMID_SELF + * x !=3D 0 =3D> PFD =3D=3D x - 1 + * + * Sub-commands: ptr[1:0] specifies the appropriate MMU_* command. + * ------------- + * ptr[1:0] =3D=3D MMU_NORMAL_PT_UPDATE: + * Updates an entry in a page table belonging to PFD. If updating an L1 ta= ble, + * and the new table entry is valid/present, the mapped frame must belong = to + * FD. If attempting to map an I/O page then the caller assumes the privil= ege + * of the FD. + * FD =3D=3D DOMID_IO: Permit /only/ I/O mappings, at the priv level of th= e caller. + * FD =3D=3D DOMID_XEN: Map restricted areas of Xen's heap space. + * ptr[:2] -- Machine address of the page-table entry to modify. + * val -- Value to write. + * + * There also certain implicit requirements when using this hypercall. The + * pages that make up a pagetable must be mapped read-only in the guest. + * This prevents uncontrolled guest updates to the pagetable. Xen strictly + * enforces this, and will disallow any pagetable update which will end up + * mapping pagetable page RW, and will disallow using any writable page as= a + * pagetable. In practice it means that when constructing a page table for= a + * process, thread, etc, we MUST be very dilligient in following these rul= es: + * 1). Start with top-level page (PGD or in Xen language: L4). Fill out + * the entries. + * 2). Keep on going, filling out the upper (PUD or L3), and middle (PMD + * or L2). + * 3). Start filling out the PTE table (L1) with the PTE entries. Once + * done, make sure to set each of those entries to RO (so writeable bit + * is unset). Once that has been completed, set the PMD (L2) for this + * PTE table as RO. + * 4). When completed with all of the PMD (L2) entries, and all of them h= ave + * been set to RO, make sure to set RO the PUD (L3). Do the same + * operation on PGD (L4) pagetable entries that have a PUD (L3) entry. + * 5). Now before you can use those pages (so setting the cr3), you MUST = also + * pin them so that the hypervisor can verify the entries. This is do= ne + * via the HYPERVISOR_mmuext_op(MMUEXT_PIN_L4_TABLE, guest physical f= rame + * number of the PGD (L4)). And this point the HYPERVISOR_mmuext_op( + * MMUEXT_NEW_BASEPTR, guest physical frame number of the PGD (L4)) c= an be + * issued. + * For 32-bit guests, the L4 is not used (as there is less pagetables), so + * instead use L3. + * At this point the pagetables can be modified using the MMU_NORMAL_PT_UP= DATE + * hypercall. Also if so desired the OS can also try to write to the PTE + * and be trapped by the hypervisor (as the PTE entry is RO). + * + * To deallocate the pages, the operations are the reverse of the steps + * mentioned above. The argument is MMUEXT_UNPIN_TABLE for all levels and = the + * pagetable MUST not be in use (meaning that the cr3 is not set to it). + * + * ptr[1:0] =3D=3D MMU_MACHPHYS_UPDATE: + * Updates an entry in the machine->pseudo-physical mapping table. + * ptr[:2] -- Machine address within the frame whose mapping to modify. + * The frame must belong to the FD, if one is specified. + * val -- Value to write into the mapping entry. + * + * ptr[1:0] =3D=3D MMU_PT_UPDATE_PRESERVE_AD: + * As MMU_NORMAL_PT_UPDATE above, but A/D bits currently in the PTE are OR= ed + * with those in @val. + * + * ptr[1:0] =3D=3D MMU_PT_UPDATE_NO_TRANSLATE: + * As MMU_NORMAL_PT_UPDATE above, but @val is not translated though FD + * page tables. + * + * @val is usually the machine frame number along with some attributes. + * The attributes by default follow the architecture defined bits. Meaning= that + * if this is a X86_64 machine and four page table layout is used, the lay= out + * of val is: + * - 63 if set means No execute (NX) + * - 46-13 the machine frame number + * - 12 available for guest + * - 11 available for guest + * - 10 available for guest + * - 9 available for guest + * - 8 global + * - 7 PAT (PSE is disabled, must use hypercall to make 4MB or 2MB pages) + * - 6 dirty + * - 5 accessed + * - 4 page cached disabled + * - 3 page write through + * - 2 userspace accessible + * - 1 writeable + * - 0 present + * + * The one bits that does not fit with the default layout is the PAGE_PSE + * also called PAGE_PAT). The MMUEXT_[UN]MARK_SUPER arguments to the + * HYPERVISOR_mmuext_op serve as mechanism to set a pagetable to be 4MB + * (or 2MB) instead of using the PAGE_PSE bit. + * + * The reason that the PAGE_PSE (bit 7) is not being utilized is due to X= en + * using it as the Page Attribute Table (PAT) bit - for details on it ple= ase + * refer to Intel SDM 10.12. The PAT allows to set the caching attributes= of + * pages instead of using MTRRs. + * + * The PAT MSR is as follows (it is a 64-bit value, each entry is 8 bits): + * PAT4 PAT0 + * +-----+-----+----+----+----+-----+----+----+ + * | UC | UC- | WC | WB | UC | UC- | WC | WB | <=3D Linux + * +-----+-----+----+----+----+-----+----+----+ + * | UC | UC- | WT | WB | UC | UC- | WT | WB | <=3D BIOS (default when = machine boots) + * +-----+-----+----+----+----+-----+----+----+ + * | rsv | rsv | WP | WC | UC | UC- | WT | WB | <=3D Xen + * +-----+-----+----+----+----+-----+----+----+ + * + * The lookup of this index table translates to looking up + * Bit 7, Bit 4, and Bit 3 of val entry: + * + * PAT/PSE (bit 7) ... PCD (bit 4) .. PWT (bit 3). + * + * If all bits are off, then we are using PAT0. If bit 3 turned on, + * then we are using PAT1, if bit 3 and bit 4, then PAT2.. + * + * As you can see, the Linux PAT1 translates to PAT4 under Xen. Which mea= ns + * that if a guest that follows Linux's PAT setup and would like to set W= rite + * Combined on pages it MUST use PAT4 entry. Meaning that Bit 7 (PAGE_PAT= ) is + * set. For example, under Linux it only uses PAT0, PAT1, and PAT2 for the + * caching as: + * + * WB =3D none (so PAT0) + * WC =3D PWT (bit 3 on) + * UC =3D PWT | PCD (bit 3 and 4 are on). + * + * To make it work with Xen, it needs to translate the WC bit as so: + * + * PWT (so bit 3 on) --> PAT (so bit 7 is on) and clear bit 3 + * + * And to translate back it would: + * + * PAT (bit 7 on) --> PWT (bit 3 on) and clear bit 7. + */ +#define MMU_NORMAL_PT_UPDATE 0 /* checked '*ptr =3D val'. ptr is MA.= */ +#define MMU_MACHPHYS_UPDATE 1 /* ptr =3D MA of frame to modify entr= y for */ +#define MMU_PT_UPDATE_PRESERVE_AD 2 /* atomically: *ptr =3D val | (*ptr&(= A|D)) */ +#define MMU_PT_UPDATE_NO_TRANSLATE 3 /* checked '*ptr =3D val'. ptr is MA.= */ + /* val never translated. = */ + +/* + * MMU EXTENDED OPERATIONS + * + * ` enum neg_errnoval + * ` HYPERVISOR_mmuext_op(mmuext_op_t uops[], + * ` unsigned int count, + * ` unsigned int *pdone, + * ` unsigned int foreigndom) + */ +/* HYPERVISOR_mmuext_op() accepts a list of mmuext_op structures. + * A foreigndom (FD) can be specified (or DOMID_SELF for none). + * Where the FD has some effect, it is described below. + * + * cmd: MMUEXT_(UN)PIN_*_TABLE + * mfn: Machine frame number to be (un)pinned as a p.t. page. + * The frame must belong to the FD, if one is specified. + * + * cmd: MMUEXT_NEW_BASEPTR + * mfn: Machine frame number of new page-table base to install in MMU. + * + * cmd: MMUEXT_NEW_USER_BASEPTR [x86/64 only] + * mfn: Machine frame number of new page-table base to install in MMU + * when in user space. + * + * cmd: MMUEXT_TLB_FLUSH_LOCAL + * No additional arguments. Flushes local TLB. + * + * cmd: MMUEXT_INVLPG_LOCAL + * linear_addr: Linear address to be flushed from the local TLB. + * + * cmd: MMUEXT_TLB_FLUSH_MULTI + * vcpumask: Pointer to bitmap of VCPUs to be flushed. + * + * cmd: MMUEXT_INVLPG_MULTI + * linear_addr: Linear address to be flushed. + * vcpumask: Pointer to bitmap of VCPUs to be flushed. + * + * cmd: MMUEXT_TLB_FLUSH_ALL + * No additional arguments. Flushes all VCPUs' TLBs. + * + * cmd: MMUEXT_INVLPG_ALL + * linear_addr: Linear address to be flushed from all VCPUs' TLBs. + * + * cmd: MMUEXT_FLUSH_CACHE + * No additional arguments. Writes back and flushes cache contents. + * + * cmd: MMUEXT_FLUSH_CACHE_GLOBAL + * No additional arguments. Writes back and flushes cache contents + * on all CPUs in the system. + * + * cmd: MMUEXT_SET_LDT + * linear_addr: Linear address of LDT base (NB. must be page-aligned). + * nr_ents: Number of entries in LDT. + * + * cmd: MMUEXT_CLEAR_PAGE + * mfn: Machine frame number to be cleared. + * + * cmd: MMUEXT_COPY_PAGE + * mfn: Machine frame number of the destination page. + * src_mfn: Machine frame number of the source page. + * + * cmd: MMUEXT_[UN]MARK_SUPER + * mfn: Machine frame number of head of superpage to be [un]marked. + */ +/* ` enum mmuext_cmd { */ +#define MMUEXT_PIN_L1_TABLE 0 +#define MMUEXT_PIN_L2_TABLE 1 +#define MMUEXT_PIN_L3_TABLE 2 +#define MMUEXT_PIN_L4_TABLE 3 +#define MMUEXT_UNPIN_TABLE 4 +#define MMUEXT_NEW_BASEPTR 5 +#define MMUEXT_TLB_FLUSH_LOCAL 6 +#define MMUEXT_INVLPG_LOCAL 7 +#define MMUEXT_TLB_FLUSH_MULTI 8 +#define MMUEXT_INVLPG_MULTI 9 +#define MMUEXT_TLB_FLUSH_ALL 10 +#define MMUEXT_INVLPG_ALL 11 +#define MMUEXT_FLUSH_CACHE 12 +#define MMUEXT_SET_LDT 13 +#define MMUEXT_NEW_USER_BASEPTR 15 +#define MMUEXT_CLEAR_PAGE 16 +#define MMUEXT_COPY_PAGE 17 +#define MMUEXT_FLUSH_CACHE_GLOBAL 18 +#define MMUEXT_MARK_SUPER 19 +#define MMUEXT_UNMARK_SUPER 20 +/* ` } */ + +#ifndef __ASSEMBLY__ +struct mmuext_op { + unsigned int cmd; /* =3D> enum mmuext_cmd */ + union { + /* [UN]PIN_TABLE, NEW_BASEPTR, NEW_USER_BASEPTR + * CLEAR_PAGE, COPY_PAGE, [UN]MARK_SUPER */ + xen_pfn_t mfn; + /* INVLPG_LOCAL, INVLPG_ALL, SET_LDT */ + unsigned long linear_addr; + } arg1; + union { + /* SET_LDT */ + unsigned int nr_ents; + /* TLB_FLUSH_MULTI, INVLPG_MULTI */ +#if __XEN_INTERFACE_VERSION__ >=3D 0x00030205 + XEN_GUEST_HANDLE(const_void) vcpumask; +#else + const void *vcpumask; +#endif + /* COPY_PAGE */ + xen_pfn_t src_mfn; + } arg2; +}; +typedef struct mmuext_op mmuext_op_t; +DEFINE_XEN_GUEST_HANDLE(mmuext_op_t); +#endif + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_update_va_mapping(unsigned long va, u64 val, + * ` enum uvm_flags flags) + * ` + * ` enum neg_errnoval + * ` HYPERVISOR_update_va_mapping_otherdomain(unsigned long va, u64 val, + * ` enum uvm_flags flags, + * ` domid_t domid) + * ` + * ` @va: The virtual address whose mapping we want to change + * ` @val: The new page table entry, must contain a machine address + * ` @flags: Control TLB flushes + */ +/* These are passed as 'flags' to update_va_mapping. They can be ORed. */ +/* When specifying UVMF_MULTI, also OR in a pointer to a CPU bitmap. */ +/* UVMF_LOCAL is merely UVMF_MULTI with a NULL bitmap pointer. */ +/* ` enum uvm_flags { */ +#define UVMF_NONE (xen_mk_ulong(0)<<0) /* No flushing at all. = */ +#define UVMF_TLB_FLUSH (xen_mk_ulong(1)<<0) /* Flush entire TLB(s). = */ +#define UVMF_INVLPG (xen_mk_ulong(2)<<0) /* Flush only one entry. = */ +#define UVMF_FLUSHTYPE_MASK (xen_mk_ulong(3)<<0) +#define UVMF_MULTI (xen_mk_ulong(0)<<2) /* Flush subset of TLBs. = */ +#define UVMF_LOCAL (xen_mk_ulong(0)<<2) /* Flush local TLB. = */ +#define UVMF_ALL (xen_mk_ulong(1)<<2) /* Flush all TLBs. = */ +/* ` } */ + +/* + * ` int + * ` HYPERVISOR_console_io(unsigned int cmd, + * ` unsigned int count, + * ` char buffer[]); + * + * @cmd: Command (see below) + * @count: Size of the buffer to read/write + * @buffer: Pointer in the guest memory + * + * List of commands: + * + * * CONSOLEIO_write: Write the buffer to Xen console. + * For the hardware domain, all the characters in the buffer will + * be written. Characters will be printed directly to the console. + * For all the other domains, only the printable characters will be + * written. Characters may be buffered until a newline (i.e '\n') is + * found. + * @return 0 on success, otherwise return an error code. + * * CONSOLEIO_read: Attempts to read up to @count characters from Xen + * console. The maximum buffer size (i.e. @count) supported is 2GB. + * @return the number of characters read on success, otherwise return + * an error code. + */ +#define CONSOLEIO_write 0 +#define CONSOLEIO_read 1 + +/* + * Commands to HYPERVISOR_vm_assist(). + */ +#define VMASST_CMD_enable 0 +#define VMASST_CMD_disable 1 + +/* x86/32 guests: simulate full 4GB segment limits. */ +#define VMASST_TYPE_4gb_segments 0 + +/* x86/32 guests: trap (vector 15) whenever above vmassist is used. */ +#define VMASST_TYPE_4gb_segments_notify 1 + +/* + * x86 guests: support writes to bottom-level PTEs. + * NB1. Page-directory entries cannot be written. + * NB2. Guest must continue to remove all writable mappings of PTEs. + */ +#define VMASST_TYPE_writable_pagetables 2 + +/* x86/PAE guests: support PDPTs above 4GB. */ +#define VMASST_TYPE_pae_extended_cr3 3 + +/* + * x86 guests: Sane behaviour for virtual iopl + * - virtual iopl updated from do_iret() hypercalls. + * - virtual iopl reported in bounce frames. + * - guest kernels assumed to be level 0 for the purpose of iopl checks. + */ +#define VMASST_TYPE_architectural_iopl 4 + +/* + * All guests: activate update indicator in vcpu_runstate_info + * Enable setting the XEN_RUNSTATE_UPDATE flag in guest memory mapped + * vcpu_runstate_info during updates of the runstate information. + */ +#define VMASST_TYPE_runstate_update_flag 5 + +/* + * x86/64 guests: strictly hide M2P from user mode. + * This allows the guest to control respective hypervisor behavior: + * - when not set, L4 tables get created with the respective slot blank, + * and whenever the L4 table gets used as a kernel one the missing + * mapping gets inserted, + * - when set, L4 tables get created with the respective slot initialized + * as before, and whenever the L4 table gets used as a user one the + * mapping gets zapped. + */ +#define VMASST_TYPE_m2p_strict 32 + +#if __XEN_INTERFACE_VERSION__ < 0x00040600 +#define MAX_VMASST_TYPE 3 +#endif + +/* Domain ids >=3D DOMID_FIRST_RESERVED cannot be used for ordinary domain= s. */ +#define DOMID_FIRST_RESERVED xen_mk_uint(0x7FF0) + +/* DOMID_SELF is used in certain contexts to refer to oneself. */ +#define DOMID_SELF xen_mk_uint(0x7FF0) + +/* + * DOMID_IO is used to restrict page-table updates to mapping I/O memory. + * Although no Foreign Domain need be specified to map I/O pages, DOMID_IO + * is useful to ensure that no mappings to the OS's own heap are accidenta= lly + * installed. (e.g., in Linux this could cause havoc as reference counts + * aren't adjusted on the I/O-mapping code path). + * This only makes sense as HYPERVISOR_mmu_update()'s and + * HYPERVISOR_update_va_mapping_otherdomain()'s "foreigndom" argument. For + * HYPERVISOR_mmu_update() context it can be specified by any calling doma= in, + * otherwise it's only permitted if the caller is privileged. + */ +#define DOMID_IO xen_mk_uint(0x7FF1) + +/* + * DOMID_XEN is used to allow privileged domains to map restricted parts of + * Xen's heap space (e.g., the machine_to_phys table). + * This only makes sense as + * - HYPERVISOR_mmu_update()'s, HYPERVISOR_mmuext_op()'s, or + * HYPERVISOR_update_va_mapping_otherdomain()'s "foreigndom" argument, + * - with XENMAPSPACE_gmfn_foreign, + * and is only permitted if the caller is privileged. + */ +#define DOMID_XEN xen_mk_uint(0x7FF2) + +/* + * DOMID_COW is used as the owner of sharable pages */ +#define DOMID_COW xen_mk_uint(0x7FF3) + +/* DOMID_INVALID is used to identify pages with unknown owner. */ +#define DOMID_INVALID xen_mk_uint(0x7FF4) + +/* Idle domain. */ +#define DOMID_IDLE xen_mk_uint(0x7FFF) + +/* Mask for valid domain id values */ +#define DOMID_MASK xen_mk_uint(0x7FFF) + +#ifndef __ASSEMBLY__ + +typedef uint16_t domid_t; + +/* + * Send an array of these to HYPERVISOR_mmu_update(). + * NB. The fields are natural pointer/address size for this architecture. + */ +struct mmu_update { + uint64_t ptr; /* Machine address of PTE. */ + uint64_t val; /* New contents of PTE. */ +}; +typedef struct mmu_update mmu_update_t; +DEFINE_XEN_GUEST_HANDLE(mmu_update_t); + +/* + * ` enum neg_errnoval + * ` HYPERVISOR_multicall(multicall_entry_t call_list[], + * ` uint32_t nr_calls); + * + * NB. The fields are logically the natural register size for this + * architecture. In cases where xen_ulong_t is larger than this then + * any unused bits in the upper portion must be zero. + */ +struct multicall_entry { + xen_ulong_t op, result; + xen_ulong_t args[6]; +}; +typedef struct multicall_entry multicall_entry_t; +DEFINE_XEN_GUEST_HANDLE(multicall_entry_t); + +#if __XEN_INTERFACE_VERSION__ < 0x00040400 +/* + * Event channel endpoints per domain (when using the 2-level ABI): + * 1024 if a long is 32 bits; 4096 if a long is 64 bits. + */ +#define NR_EVENT_CHANNELS EVTCHN_2L_NR_CHANNELS +#endif + +struct vcpu_time_info { + /* + * Updates to the following values are preceded and followed by an + * increment of 'version'. The guest can therefore detect updates by + * looking for changes to 'version'. If the least-significant bit of + * the version number is set then an update is in progress and the gue= st + * must wait to read a consistent set of values. + * The correct way to interact with the version number is similar to + * Linux's seqlock: see the implementations of read_seqbegin/read_seqr= etry. + */ + uint32_t version; + uint32_t pad0; + uint64_t tsc_timestamp; /* TSC at last update of time vals. */ + uint64_t system_time; /* Time, in nanosecs, since boot. */ + /* + * Current system time: + * system_time + + * ((((tsc - tsc_timestamp) << tsc_shift) * tsc_to_system_mul) >> 32) + * CPU frequency (Hz): + * ((10^9 << 32) / tsc_to_system_mul) >> tsc_shift + */ + uint32_t tsc_to_system_mul; + int8_t tsc_shift; +#if __XEN_INTERFACE_VERSION__ > 0x040600 + uint8_t flags; + uint8_t pad1[2]; +#else + int8_t pad1[3]; +#endif +}; /* 32 bytes */ +typedef struct vcpu_time_info vcpu_time_info_t; + +#define XEN_PVCLOCK_TSC_STABLE_BIT (1 << 0) +#define XEN_PVCLOCK_GUEST_STOPPED (1 << 1) + +struct vcpu_info { + /* + * 'evtchn_upcall_pending' is written non-zero by Xen to indicate + * a pending notification for a particular VCPU. It is then cleared + * by the guest OS /before/ checking for pending work, thus avoiding + * a set-and-check race. Note that the mask is only accessed by Xen + * on the CPU that is currently hosting the VCPU. This means that the + * pending and mask flags can be updated by the guest without special + * synchronisation (i.e., no need for the x86 LOCK prefix). + * This may seem suboptimal because if the pending flag is set by + * a different CPU then an IPI may be scheduled even when the mask + * is set. However, note: + * 1. The task of 'interrupt holdoff' is covered by the per-event- + * channel mask bits. A 'noisy' event that is continually being + * triggered can be masked at source at this very precise + * granularity. + * 2. The main purpose of the per-VCPU mask is therefore to restrict + * reentrant execution: whether for concurrency control, or to + * prevent unbounded stack usage. Whatever the purpose, we expect + * that the mask will be asserted only for short periods at a time, + * and so the likelihood of a 'spurious' IPI is suitably small. + * The mask is read before making an event upcall to the guest: a + * non-zero mask therefore guarantees that the VCPU will not receive + * an upcall activation. The mask is cleared when the VCPU requests + * to block: this avoids wakeup-waiting races. + */ + uint8_t evtchn_upcall_pending; +#ifdef XEN_HAVE_PV_UPCALL_MASK + uint8_t evtchn_upcall_mask; +#else /* XEN_HAVE_PV_UPCALL_MASK */ + uint8_t pad0; +#endif /* XEN_HAVE_PV_UPCALL_MASK */ + xen_ulong_t evtchn_pending_sel; + struct arch_vcpu_info arch; + vcpu_time_info_t time; +}; /* 64 bytes (x86) */ +#ifndef __XEN__ +typedef struct vcpu_info vcpu_info_t; +#endif + +/* + * `incontents 200 startofday_shared Start-of-day shared data structure + * Xen/kernel shared data -- pointer provided in start_info. + * + * This structure is defined to be both smaller than a page, and the + * only data on the shared page, but may vary in actual size even within + * compatible Xen versions; guests should not rely on the size + * of this structure remaining constant. + */ +struct shared_info { + struct vcpu_info vcpu_info[XEN_LEGACY_MAX_VCPUS]; + + /* + * A domain can create "event channels" on which it can send and recei= ve + * asynchronous event notifications. There are three classes of event = that + * are delivered by this mechanism: + * 1. Bi-directional inter- and intra-domain connections. Domains must + * arrange out-of-band to set up a connection (usually by allocati= ng + * an unbound 'listener' port and avertising that via a storage se= rvice + * such as xenstore). + * 2. Physical interrupts. A domain with suitable hardware-access + * privileges can bind an event-channel port to a physical interru= pt + * source. + * 3. Virtual interrupts ('events'). A domain can bind an event-chann= el + * port to a virtual interrupt source, such as the virtual-timer + * device or the emergency console. + * + * Event channels are addressed by a "port index". Each channel is + * associated with two bits of information: + * 1. PENDING -- notifies the domain that there is a pending notifica= tion + * to be processed. This bit is cleared by the guest. + * 2. MASK -- if this bit is clear then a 0->1 transition of PENDING + * will cause an asynchronous upcall to be scheduled. This bit is = only + * updated by the guest. It is read-only within Xen. If a channel + * becomes pending while the channel is masked then the 'edge' is = lost + * (i.e., when the channel is unmasked, the guest must manually ha= ndle + * pending notifications as no upcall will be scheduled by Xen). + * + * To expedite scanning of pending notifications, any 0->1 pending + * transition on an unmasked channel causes a corresponding bit in a + * per-vcpu selector word to be set. Each bit in the selector covers a + * 'C long' in the PENDING bitfield array. + */ + xen_ulong_t evtchn_pending[sizeof(xen_ulong_t) * 8]; + xen_ulong_t evtchn_mask[sizeof(xen_ulong_t) * 8]; + + /* + * Wallclock time: updated by control software or RTC emulation. + * Guests should base their gettimeofday() syscall on this + * wallclock-base value. + * The values of wc_sec and wc_nsec are offsets from the Unix epoch + * adjusted by the domain's 'time offset' (in seconds) as set either + * by XEN_DOMCTL_settimeoffset, or adjusted via a guest write to the + * emulated RTC. + */ + uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */ + uint32_t wc_sec; + uint32_t wc_nsec; +#if !defined(__i386__) + uint32_t wc_sec_hi; +# define xen_wc_sec_hi wc_sec_hi +#elif !defined(__XEN__) && !defined(__XEN_TOOLS__) +# define xen_wc_sec_hi arch.wc_sec_hi +#endif + + struct arch_shared_info arch; + +}; +#ifndef __XEN__ +typedef struct shared_info shared_info_t; +#endif + +/* + * `incontents 200 startofday Start-of-day memory layout + * + * 1. The domain is started within contiguous virtual-memory region. + * 2. The contiguous region ends on an aligned 4MB boundary. + * 3. This the order of bootstrap elements in the initial virtual region: + * a. relocated kernel image + * b. initial ram disk [mod_start, mod_len] + * (may be omitted) + * c. list of allocated page frames [mfn_list, nr_pages] + * (unless relocated due to XEN_ELFNOTE_INIT_P2M) + * d. start_info_t structure [register rSI (x86)] + * in case of dom0 this page contains the console info, too + * e. unless dom0: xenstore ring page + * f. unless dom0: console ring page + * g. bootstrap page tables [pt_base and CR3 (x86)] + * h. bootstrap stack [register ESP (x86)] + * 4. Bootstrap elements are packed together, but each is 4kB-aligned. + * 5. The list of page frames forms a contiguous 'pseudo-physical' memory + * layout for the domain. In particular, the bootstrap virtual-memory + * region is a 1:1 mapping to the first section of the pseudo-physical= map. + * 6. All bootstrap elements are mapped read-writable for the guest OS. T= he + * only exception is the bootstrap page table, which is mapped read-on= ly. + * 7. There is guaranteed to be at least 512kB padding after the final + * bootstrap element. If necessary, the bootstrap virtual region is + * extended by an extra 4MB to ensure this. + * + * Note: Prior to 25833:bb85bbccb1c9. ("x86/32-on-64 adjust Dom0 initial p= age + * table layout") a bug caused the pt_base (3.g above) and cr3 to not point + * to the start of the guest page tables (it was offset by two pages). + * This only manifested itself on 32-on-64 dom0 kernels and not 32-on-64 d= omU + * or 64-bit kernels of any colour. The page tables for a 32-on-64 dom0 got + * allocated in the order: 'first L1','first L2', 'first L3', so the offset + * to the page table base is by two pages back. The initial domain if it is + * 32-bit and runs under a 64-bit hypervisor should _NOT_ use two of the + * pages preceding pt_base and mark them as reserved/unused. + */ +#ifdef XEN_HAVE_PV_GUEST_ENTRY +struct start_info { + /* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME. = */ + char magic[32]; /* "xen--". = */ + unsigned long nr_pages; /* Total pages allocated to this domain. = */ + unsigned long shared_info; /* MACHINE address of shared info struct. = */ + uint32_t flags; /* SIF_xxx flags. = */ + xen_pfn_t store_mfn; /* MACHINE page number of shared page. = */ + uint32_t store_evtchn; /* Event channel for store communication. = */ + union { + struct { + xen_pfn_t mfn; /* MACHINE page number of console page. = */ + uint32_t evtchn; /* Event channel for console page. = */ + } domU; + struct { + uint32_t info_off; /* Offset of console_info struct. = */ + uint32_t info_size; /* Size of console_info struct from start.= */ + } dom0; + } console; + /* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). = */ + unsigned long pt_base; /* VIRTUAL address of page directory. = */ + unsigned long nr_pt_frames; /* Number of bootstrap p.t. frames. = */ + unsigned long mfn_list; /* VIRTUAL address of page-frame list. = */ + unsigned long mod_start; /* VIRTUAL address of pre-loaded module = */ + /* (PFN of pre-loaded module if = */ + /* SIF_MOD_START_PFN set in flags). = */ + unsigned long mod_len; /* Size (bytes) of pre-loaded module. = */ +#define MAX_GUEST_CMDLINE 1024 + int8_t cmd_line[MAX_GUEST_CMDLINE]; + /* The pfn range here covers both page table and p->m table frames. = */ + unsigned long first_p2m_pfn;/* 1st pfn forming initial P->M table. = */ + unsigned long nr_p2m_frames;/* # of pfns forming initial P->M table. = */ +}; +typedef struct start_info start_info_t; + +/* New console union for dom0 introduced in 0x00030203. */ +#if __XEN_INTERFACE_VERSION__ < 0x00030203 +#define console_mfn console.domU.mfn +#define console_evtchn console.domU.evtchn +#endif +#endif /* XEN_HAVE_PV_GUEST_ENTRY */ + +/* These flags are passed in the 'flags' field of start_info_t. */ +#define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */ +#define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */ +#define SIF_MULTIBOOT_MOD (1<<2) /* Is mod_start a multiboot module? */ +#define SIF_MOD_START_PFN (1<<3) /* Is mod_start a PFN? */ +#define SIF_VIRT_P2M_4TOOLS (1<<4) /* Do Xen tools understand a virt. mapp= ed */ + /* P->M making the 3 level tree obsolet= e? */ +#define SIF_PM_MASK (0xFF<<8) /* reserve 1 byte for xen-pm options */ + +/* + * A multiboot module is a package containing modules very similar to a + * multiboot module array. The only differences are: + * - the array of module descriptors is by convention simply at the beginn= ing + * of the multiboot module, + * - addresses in the module descriptors are based on the beginning of the + * multiboot module, + * - the number of modules is determined by a termination descriptor that = has + * mod_start =3D=3D 0. + * + * This permits to both build it statically and reference it in a configur= ation + * file, and let the PV guest easily rebase the addresses to virtual addre= sses + * and at the same time count the number of modules. + */ +struct xen_multiboot_mod_list +{ + /* Address of first byte of the module */ + uint32_t mod_start; + /* Address of last byte of the module (inclusive) */ + uint32_t mod_end; + /* Address of zero-terminated command line */ + uint32_t cmdline; + /* Unused, must be zero */ + uint32_t pad; +}; +/* + * `incontents 200 startofday_dom0_console Dom0_console + * + * The console structure in start_info.console.dom0 + * + * This structure includes a variety of information required to + * have a working VGA/VESA console. + */ +typedef struct dom0_vga_console_info { + uint8_t video_type; /* DOM0_VGA_CONSOLE_??? */ +#define XEN_VGATYPE_TEXT_MODE_3 0x03 +#define XEN_VGATYPE_VESA_LFB 0x23 +#define XEN_VGATYPE_EFI_LFB 0x70 + + union { + struct { + /* Font height, in pixels. */ + uint16_t font_height; + /* Cursor location (column, row). */ + uint16_t cursor_x, cursor_y; + /* Number of rows and columns (dimensions in characters). */ + uint16_t rows, columns; + } text_mode_3; + + struct { + /* Width and height, in pixels. */ + uint16_t width, height; + /* Bytes per scan line. */ + uint16_t bytes_per_line; + /* Bits per pixel. */ + uint16_t bits_per_pixel; + /* LFB physical address, and size (in units of 64kB). */ + uint32_t lfb_base; + uint32_t lfb_size; + /* RGB mask offsets and sizes, as defined by VBE 1.2+ */ + uint8_t red_pos, red_size; + uint8_t green_pos, green_size; + uint8_t blue_pos, blue_size; + uint8_t rsvd_pos, rsvd_size; +#if __XEN_INTERFACE_VERSION__ >=3D 0x00030206 + /* VESA capabilities (offset 0xa, VESA command 0x4f00). */ + uint32_t gbl_caps; + /* Mode attributes (offset 0x0, VESA command 0x4f01). */ + uint16_t mode_attrs; + uint16_t pad; +#endif +#if __XEN_INTERFACE_VERSION__ >=3D 0x00040d00 + /* high 32 bits of lfb_base */ + uint32_t ext_lfb_base; +#endif + } vesa_lfb; + } u; +} dom0_vga_console_info_t; +#define xen_vga_console_info dom0_vga_console_info +#define xen_vga_console_info_t dom0_vga_console_info_t + +typedef uint8_t xen_domain_handle_t[16]; + +__DEFINE_XEN_GUEST_HANDLE(uint8, uint8_t); +__DEFINE_XEN_GUEST_HANDLE(uint16, uint16_t); +__DEFINE_XEN_GUEST_HANDLE(uint32, uint32_t); +__DEFINE_XEN_GUEST_HANDLE(uint64, uint64_t); + +typedef struct { + uint8_t a[16]; +} xen_uuid_t; + +/* + * XEN_DEFINE_UUID(0x00112233, 0x4455, 0x6677, 0x8899, + * 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff) + * will construct UUID 00112233-4455-6677-8899-aabbccddeeff presented as + * {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, + * 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; + * + * NB: This is compatible with Linux kernel and with libuuid, but it is not + * compatible with Microsoft, as they use mixed-endian encoding (some + * components are little-endian, some are big-endian). + */ +#define XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6) \ + {{((a) >> 24) & 0xFF, ((a) >> 16) & 0xFF, \ + ((a) >> 8) & 0xFF, ((a) >> 0) & 0xFF, \ + ((b) >> 8) & 0xFF, ((b) >> 0) & 0xFF, \ + ((c) >> 8) & 0xFF, ((c) >> 0) & 0xFF, \ + ((d) >> 8) & 0xFF, ((d) >> 0) & 0xFF, \ + e1, e2, e3, e4, e5, e6}} + +#if defined(__STDC_VERSION__) ? __STDC_VERSION__ >=3D 199901L : defined(__= GNUC__) +#define XEN_DEFINE_UUID(a, b, c, d, e1, e2, e3, e4, e5, e6) \ + ((xen_uuid_t)XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6)) +#else +#define XEN_DEFINE_UUID(a, b, c, d, e1, e2, e3, e4, e5, e6) \ + XEN_DEFINE_UUID_(a, b, c, d, e1, e2, e3, e4, e5, e6) +#endif /* __STDC_VERSION__ / __GNUC__ */ + +#endif /* !__ASSEMBLY__ */ + +/* Default definitions for macros used by domctl/sysctl. */ +#if defined(__XEN__) || defined(__XEN_TOOLS__) + +#ifndef int64_aligned_t +#define int64_aligned_t int64_t +#endif +#ifndef uint64_aligned_t +#define uint64_aligned_t uint64_t +#endif +#ifndef XEN_GUEST_HANDLE_64 +#define XEN_GUEST_HANDLE_64(name) XEN_GUEST_HANDLE(name) +#endif + +#ifndef __ASSEMBLY__ +struct xenctl_bitmap { + XEN_GUEST_HANDLE_64(uint8) bitmap; + uint32_t nr_bits; +}; +typedef struct xenctl_bitmap xenctl_bitmap_t; +#endif + +#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ + +#endif /* __XEN_PUBLIC_XEN_H__ */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/include/hw/xen/xen.h b/include/hw/xen/xen.h index afdf9c436afc..4d412fd4b266 100644 --- a/include/hw/xen/xen.h +++ b/include/hw/xen/xen.h @@ -1,12 +1,22 @@ -#ifndef QEMU_HW_XEN_H -#define QEMU_HW_XEN_H - /* * public xen header * stuff needed outside xen-*.c, i.e. interfaces to qemu. * must not depend on any xen headers being present in * /usr/include/xen, so it can be included unconditionally. */ +#ifndef QEMU_HW_XEN_H +#define QEMU_HW_XEN_H + +/* + * As a temporary measure while the headers are being untangled, define + * __XEN_TOOLS__ here before any Xen headers are included. Otherwise, if + * the Xen toolstack library headers are later included, they will find + * some of the "internal" definitions missing and the build will fail. In + * later commits, we'll end up with a rule that the native libraries have + * to be included first, which will ensure that the libraries get the + * version of Xen libraries that they expect. + */ +#define __XEN_TOOLS__ 1 =20 #include "exec/cpu-common.h" =20 --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760964; cv=none; d=zohomail.com; s=zohoarc; b=EBCI8ZAjSF5A4R9ddC/tXO++aLOeALSXascQbxvjy08BUdZaDeRYFdJppWFKPJbAha9e34N2HElmECHCWl73xGs7BW/Qi6Nwus2YgZ245JfdJQr9qJG96hByErCnHszHcYodmSy3JpGl/HeJ0vBOEBx1Kc/ly9O+IX90qTo8zK4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760964; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=ndiK+SzdHeJFyFqN5ZG4ctGk8GsV7Usk2MgFFknjXts=; b=L9425GMC83H8Cxr1tv5U3IO+s/bJErJPUMH+iydjwewf4O+aUBP6L6yCAIrW7ZUAxkAPnfOoUmhhCDkFJzIrPo3qmAkPKoR4zom2mOnbvJ4mc03agt456XHCuiM8KH0KrJlmC2SJmyPkk5YQW+aolXp4oZUUq2aGSZT8A50YGhw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760964870522.2889988911361; Thu, 2 Mar 2023 04:42:44 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5P-0007bB-4O; Thu, 02 Mar 2023 07:31:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi59-0007Qs-Cb for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:30:57 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi57-0002qN-JF for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:30:46 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-344-JcCZ7JD0PKmXNOT7AwcooQ-1; Thu, 02 Mar 2023 07:30:42 -0500 Received: by mail-wm1-f69.google.com with SMTP id m31-20020a05600c3b1f00b003e9de8c95easo5696541wms.2 for ; Thu, 02 Mar 2023 04:30:42 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id f6-20020adff586000000b002c56179d39esm15017595wro.44.2023.03.02.04.30.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:30:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760244; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ndiK+SzdHeJFyFqN5ZG4ctGk8GsV7Usk2MgFFknjXts=; b=WkRr2C0WGhSMH7ep55NIcBS6v3mUsKV9GmXwxEDYuZ71P92d1SNOcGmLb4GrU/CJCOSni2 ILkCFRWqYmL94GFS2cNvdPs1T/0z1OnyHB/Krw48eYmeFWsn9067S+sHoaQi+0XyTcQ9kd aVE1xNjrmSyMqSBJ/u9F5EZeNp3kwqk= X-MC-Unique: JcCZ7JD0PKmXNOT7AwcooQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ndiK+SzdHeJFyFqN5ZG4ctGk8GsV7Usk2MgFFknjXts=; b=2ulX2l528jCnABDFugG72QMeFdBy20xH8yMJf2jPC9T1iZUYRbP+u9Fj/dfoqgMqCF k+fXc4IK9rm8qm5btJOoudIbTn1sbexZ76xWxvNcQvct6c2Y8KAiqCUZT/eNxZwslQFJ TIf3z5m3u9gDWk+bt7wTcUadlMSL73ZVgAdBYWRm3/89SaKkhC7YtRxe/cij4I9AoXbV EtTZm0caf4ELQ+5YeOKcbFRf5lANLH48J50JlLplHaQIUloZBs0QdhtNh+q6+gpb9L63 wTkbhQX80/jrrdFG0Zr7ECCZLQeK/6ui6phlwS4+Dw1r2Jw9aoHEui0DtN+5XQSetBek Kt7g== X-Gm-Message-State: AO0yUKVBSa7qXe3GJyonthDgNupJFZUqZFpQ1PMM/+gOLb6bguDxiqDy ozurbglwXbmcWglCejbUoS46NQiuKjGeG9U7WbKZh7iX8EFfACQIo20l2CMzE2EonEMJi6IglgX HOynIDtWRY84WUEAb0pvTUmQANIrAbUtYpc/eDJKFI/78Sfs25Ghrt5H7APp6iUWm3iDz3D9L3e I= X-Received: by 2002:adf:e790:0:b0:2ca:d5dc:aec5 with SMTP id n16-20020adfe790000000b002cad5dcaec5mr7077053wrm.61.1677760240417; Thu, 02 Mar 2023 04:30:40 -0800 (PST) X-Google-Smtp-Source: AK7set+Iyn4lQpH+kDjBph3oZo3Ht3Y70TbXqIKYCoAqwkDX9ro3wQaGsvhpN5hJD4IP2BUpU6XO+Q== X-Received: by 2002:adf:e790:0:b0:2ca:d5dc:aec5 with SMTP id n16-20020adfe790000000b002cad5dcaec5mr7077032wrm.61.1677760240001; Thu, 02 Mar 2023 04:30:40 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 02/62] xen: add CONFIG_XEN_BUS and CONFIG_XEN_EMU options for Xen emulation Date: Thu, 2 Mar 2023 13:29:29 +0100 Message-Id: <20230302123029.153265-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760965960100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse The XEN_EMU option will cover core Xen support in target/, which exists only for x86 with KVM today but could theoretically also be implemented on Arm/Aarch64 and with TCG or other accelerators (if anyone wants to run the gauntlet of struct layout compatibility, errno mapping, and the rest of that fui). It will also cover the support for architecture-independent grant table and event channel support which will be added in hw/i386/kvm/ (on the basis that the non-KVM support is very theoretical and making it not use KVM directly seems like gratuitous overengineering at this point). The XEN_BUS option is for the xenfv platform support, which will now be used both by XEN_EMU and by real Xen. The XEN option remains dependent on the Xen runtime libraries, and covers support for real Xen. Some code which currently resides under CONFIG_XEN will be moving to CONFIG_XEN_BUS over time as the direct dependencies on Xen runtime libraries are eliminated. The Xen PCI platform device will also reside under CONFIG_XEN_BUS. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/Kconfig | 1 + hw/i386/Kconfig | 5 +++++ hw/xen/Kconfig | 3 +++ meson.build | 1 + 4 files changed, 10 insertions(+) create mode 100644 hw/xen/Kconfig diff --git a/hw/Kconfig b/hw/Kconfig index 38233bbb0f13..ba62ff6417c9 100644 --- a/hw/Kconfig +++ b/hw/Kconfig @@ -41,6 +41,7 @@ source tpm/Kconfig source usb/Kconfig source virtio/Kconfig source vfio/Kconfig +source xen/Kconfig source watchdog/Kconfig =20 # arch Kconfig diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig index 9fbfe748b57d..d40802d83f19 100644 --- a/hw/i386/Kconfig +++ b/hw/i386/Kconfig @@ -136,3 +136,8 @@ config VMPORT config VMMOUSE bool depends on VMPORT + +config XEN_EMU + bool + default y + depends on KVM && (I386 || X86_64) diff --git a/hw/xen/Kconfig b/hw/xen/Kconfig new file mode 100644 index 000000000000..3467efb98674 --- /dev/null +++ b/hw/xen/Kconfig @@ -0,0 +1,3 @@ +config XEN_BUS + bool + default y if (XEN || XEN_EMU) diff --git a/meson.build b/meson.build index 77d2ae87e4c5..71a14e6b3da1 100644 --- a/meson.build +++ b/meson.build @@ -3881,6 +3881,7 @@ if have_system if xen.found() summary_info +=3D {'xen ctrl version': xen.version()} endif + summary_info +=3D {'Xen emulation': config_all.has_key('CONFIG_XEN_E= MU')} endif summary_info +=3D {'TCG support': config_all.has_key('CONFIG_TCG')} if config_all.has_key('CONFIG_TCG') --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760325; cv=none; d=zohomail.com; s=zohoarc; b=YMAeNGEaXMBCuFvd3kssvSuIoy0YPSC0I5ohW6ihAKM8BRSr1Q0YTmNZ2wONI7JiBwd2EvJDg959GZx2oRjP2u22eBN2xgtKcR2jH4eCiUEqa5b//CkKlWrTvAi8yqppYYAEjhLx97jwGqAl+U4uRyAljd7H9hbFHpvGuN+yohw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760325; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=PuO2tPm3S38XBWHvi8ppp01n0hbysJkpz9K9/a1K8AU=; b=lcXOH++BVLE3O+gkgU4/ql7I6JEHufmt4Y9VjQS9I1AfMzXBPQxX/TR9vfNQ5SHK9vdO/nEdkU9Hk0UMLCxkN30RkN7TJWOG5f3wKUnevSjsSyEP/hscWQ2nZUG23wmBIAU7MxE8nj6CncVRB5FUjUjmFoF7qP+8yeWOshgwwE0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760325350686.7561240917581; Thu, 2 Mar 2023 04:32:05 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5O-0007Yo-CX; Thu, 02 Mar 2023 07:31:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5G-0007RV-Kw for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:00 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5E-0002rM-Vd for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:30:54 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-609-VYIsNn6VNRm-2ysKebIzew-1; Thu, 02 Mar 2023 07:30:44 -0500 Received: by mail-wr1-f71.google.com with SMTP id i18-20020a05600011d200b002c94d861113so3141544wrx.16 for ; Thu, 02 Mar 2023 04:30:44 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id r14-20020a05600c458e00b003e21ba8684dsm3027244wmo.26.2023.03.02.04.30.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:30:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760251; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PuO2tPm3S38XBWHvi8ppp01n0hbysJkpz9K9/a1K8AU=; b=OEQKcID897Tuo0dvxiOjtAynQrBzrIYsyzVmoRvM2hGgYcXOpavVJMDR7xYXDRx69ewaka /QiAIPlKoODz8h60NPtNfCnXCHCuiVRSEGqx/o2//vtQPHBzNmRqGjhe3UBD9TIHIT11s0 DT+6rfZ7ptRQTVt/pnYIgoYG0I5/CDQ= X-MC-Unique: VYIsNn6VNRm-2ysKebIzew-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PuO2tPm3S38XBWHvi8ppp01n0hbysJkpz9K9/a1K8AU=; b=dlTJkdsxhXOrPGWayWIOxjHX5fMthlR66ctKeZf6XmpxKxKYkZF4Ecv8qJxwBds0cg 7Dn4LPjmFQIGeEZhwa0wAK+QwbOAznmKfjwA4UNJkqldKOSnNxRx8fhFOcuI6Z5q+Jxv 20Q5dogiUcvId7hn98Y0r5hH76hZfHdx7ov+e2rQKqqRz3yND/OkI0cECChVAgvMfSqM JDbYCtU0obsBYlxp0WVDPk7v4xoOvxJ8e1MC8SKBQbi/8GhcZ3IpDtlNMrOJUwiurjEA l70Tx0/8o8Ru1hDBZd0tTNGwZNXJraBPF7ubCDnblbjWh8goVewlHrewC/p/6ZtATZaJ 6TXQ== X-Gm-Message-State: AO0yUKWkxuL/CnkTkfVIQ32m4zQcQ2HmKpq/DGCMHAenuVjG15PkQ9bS RfjWuHw9S4dEQDJjjRU4p9B2k+NXsWJwBw6QgwgAZAS0CE7t4Qn28HXlR6ROzxJddcXuQNA9WxI Tvby+QCSnOlKSUtdnIYA1pgkKO91L107+eaAFQM8GU+V6qzFFC+3xsq0ejL2cO+7V+D5ZsRl1q9 Y= X-Received: by 2002:a05:600c:3b13:b0:3eb:38a2:2bbc with SMTP id m19-20020a05600c3b1300b003eb38a22bbcmr7532185wms.7.1677760243093; Thu, 02 Mar 2023 04:30:43 -0800 (PST) X-Google-Smtp-Source: AK7set9hYPN4dcdPn2W29KRLhhN75SoPjcf1iyyLYqBL3udoZksmxWHiF384F9S6nsdiMTXc50WcXg== X-Received: by 2002:a05:600c:3b13:b0:3eb:38a2:2bbc with SMTP id m19-20020a05600c3b1300b003eb38a22bbcmr7532169wms.7.1677760242816; Thu, 02 Mar 2023 04:30:42 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 03/62] xen: Add XEN_DISABLED mode and make it default Date: Thu, 2 Mar 2023 13:29:30 +0100 Message-Id: <20230302123029.153265-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760326885100002 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Also set XEN_ATTACH mode in xen_init() to reflect the truth; not that anyone ever cared before. It was *only* ever checked in xen_init_pv() before. Suggested-by: Paolo Bonzini Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- accel/xen/xen-all.c | 2 ++ include/hw/xen/xen.h | 5 +++-- softmmu/globals.c | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/accel/xen/xen-all.c b/accel/xen/xen-all.c index c1b697a8bda1..e85e4aeba51f 100644 --- a/accel/xen/xen-all.c +++ b/accel/xen/xen-all.c @@ -171,6 +171,8 @@ static int xen_init(MachineState *ms) * opt out of system RAM being allocated by generic code */ mc->default_ram_id =3D NULL; + + xen_mode =3D XEN_ATTACH; return 0; } =20 diff --git a/include/hw/xen/xen.h b/include/hw/xen/xen.h index 4d412fd4b266..03983939f92a 100644 --- a/include/hw/xen/xen.h +++ b/include/hw/xen/xen.h @@ -22,8 +22,9 @@ =20 /* xen-machine.c */ enum xen_mode { - XEN_EMULATE =3D 0, // xen emulation, using xenner (default) - XEN_ATTACH // attach to xen domain created by libxl + XEN_DISABLED =3D 0, /* xen support disabled (default) */ + XEN_ATTACH, /* attach to xen domain created by libxl */ + XEN_EMULATE, /* emulate Xen within QEMU */ }; =20 extern uint32_t xen_domid; diff --git a/softmmu/globals.c b/softmmu/globals.c index 527edbefdd07..0a4405614e7f 100644 --- a/softmmu/globals.c +++ b/softmmu/globals.c @@ -63,5 +63,5 @@ QemuUUID qemu_uuid; bool qemu_uuid_set; =20 uint32_t xen_domid; -enum xen_mode xen_mode =3D XEN_EMULATE; +enum xen_mode xen_mode =3D XEN_DISABLED; bool xen_domid_restrict; --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760641; cv=none; d=zohomail.com; s=zohoarc; b=H2RLtDu3XMunRqGRRrmiiNWC+dUed5ruVeN4ZzJCSOg8M21EJI021owDNTcK0se3deKCPgpodoZ5vqaM1Ympo5gdd2v0QR5rxd7/QBBCWTGdXRwRZ1/tvHquWLsdNlAPutUpm7CUEUyh8PPjgHV9hmdCIszyOUGx+aGrxTwLZC8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760641; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=++1pLvBw4Z+TxgJOwf2n4ZE0GuCO8mbGuPAPoip6pg0=; b=knzZT6PpN9PK6zaoQ3C8rVcKQYfL3nEM0WiihicJe2j9F7hIORGxHWLbDpuBhGBUOyJEHS6LhYA+nXEF07lDqc5L12ABd3ZcLgRpeUH0KNFEnLqTZefJ4HhKC5faD7vGzNaiYoMKCx+5iSyeD5IS7HXqakMpqCo9GLMGO3FKRiA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760641707126.21400561078065; Thu, 2 Mar 2023 04:37:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5P-0007dI-UV; Thu, 02 Mar 2023 07:31:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5G-0007RX-QL for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:00 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5C-0002r3-FD for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:30:54 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-1-L1292KOtO5GqjiuQdkzXvw-1; Thu, 02 Mar 2023 07:30:48 -0500 Received: by mail-wm1-f70.google.com with SMTP id az12-20020a05600c600c00b003e8910ec2fdso5691624wmb.6 for ; Thu, 02 Mar 2023 04:30:47 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id t3-20020a5d49c3000000b002c5804b6afasm15497858wrs.67.2023.03.02.04.30.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:30:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760249; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=++1pLvBw4Z+TxgJOwf2n4ZE0GuCO8mbGuPAPoip6pg0=; b=TH23vtailQaojhLpqVksa+gZ64tRK9A0/PaAd0M+r+eE7NywvrzCI0F238uw8Wnk87sN2I bzdWz+AURWaw/PqtCp7S1AM4e98IhlU2T3484imq2Z/ht4G1PmZ5vBLje0Oan+DZJep61S dhjxIB/2k2e3R66/Phu48nZ+bZ+HHUs= X-MC-Unique: L1292KOtO5GqjiuQdkzXvw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=++1pLvBw4Z+TxgJOwf2n4ZE0GuCO8mbGuPAPoip6pg0=; b=opzqW7Gn+6d/1vbjVNBg913oYItP+/7/99PUxMoiDbgyXbGBjDf4J/FV7TumzoU0YR qMw3dXLfqYYuZw/Nq0tBeOXaXME1DeV9VpS+MmziAwTRJNimSR81LcPRnQCyZGJs6Uzd hdoIq64T5m6GZKbnn4aW2LgVzr9v+58MHgf7vty1RK0FBRlzKUnkY8ZO+EMDfztLFks0 MxeOgrGdBh+7+l6qj067azh/PdTP22AB7TFRnleM72xUXQhFtA+4xuoHPFuBS6PMBRRU GLvXDrsDdz6g3clLzzo1hpvqqpjDaNQxFNbI9vQO60mcgdk2+W3UwkWbugpuDRsBjMPV Yvcw== X-Gm-Message-State: AO0yUKVVIsgwtfbxWdUnR/T9djXXHJtekgzIttPUH8xEjWhQbMMmo9Hm FRr8NmlnZpTPQpy6k6qE8ffRpgtuRBkfpc0PqEXZNM+MiG1TcIzBugNFfZ4vLYLWzUYdSPXPDYi LvJ3Poqmk9LQQEVrtt2pE7XelyzYl7AULOrMvMkIDpC/g7fOPzDy0f5NsAD8MeAjqdeVTSz39u+ Q= X-Received: by 2002:a5d:4e4d:0:b0:2c7:c9e:2c41 with SMTP id r13-20020a5d4e4d000000b002c70c9e2c41mr7275495wrt.57.1677760246466; Thu, 02 Mar 2023 04:30:46 -0800 (PST) X-Google-Smtp-Source: AK7set/m2J8Vpo+tZ96B/7xm5rH+8EXgWwi/taszKs+rxFuZr3WQSqSZFI1tXrUhYou/dm9vr5c2tw== X-Received: by 2002:a5d:4e4d:0:b0:2c7:c9e:2c41 with SMTP id r13-20020a5d4e4d000000b002c70c9e2c41mr7275476wrt.57.1677760246114; Thu, 02 Mar 2023 04:30:46 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 04/62] i386/kvm: Add xen-version KVM accelerator property and init KVM Xen support Date: Thu, 2 Mar 2023 13:29:31 +0100 Message-Id: <20230302123029.153265-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760643564100007 From: David Woodhouse This just initializes the basic Xen support in KVM for now. Only permitted on TYPE_PC_MACHINE because that's where the sysbus devices for Xen heap overlay, event channel, grant tables and other stuff will exist. There's no point having the basic hypercall support if nothing else works. Provide sysemu/kvm_xen.h and a kvm_xen_get_caps() which will be used later by support devices. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- accel/kvm/kvm-all.c | 1 + include/sysemu/kvm_int.h | 2 ++ include/sysemu/kvm_xen.h | 20 +++++++++++++ target/i386/kvm/kvm.c | 59 +++++++++++++++++++++++++++++++++++++ target/i386/kvm/meson.build | 2 ++ target/i386/kvm/xen-emu.c | 58 ++++++++++++++++++++++++++++++++++++ target/i386/kvm/xen-emu.h | 19 ++++++++++++ 7 files changed, 161 insertions(+) create mode 100644 include/sysemu/kvm_xen.h create mode 100644 target/i386/kvm/xen-emu.c create mode 100644 target/i386/kvm/xen-emu.h diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 86f752383313..511d3eb9a0da 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -3703,6 +3703,7 @@ static void kvm_accel_instance_init(Object *obj) s->kvm_dirty_ring_size =3D 0; s->notify_vmexit =3D NOTIFY_VMEXIT_OPTION_RUN; s->notify_window =3D 0; + s->xen_version =3D 0; } =20 /** diff --git a/include/sysemu/kvm_int.h b/include/sysemu/kvm_int.h index 60b520a13e84..7f945bc7633e 100644 --- a/include/sysemu/kvm_int.h +++ b/include/sysemu/kvm_int.h @@ -118,6 +118,8 @@ struct KVMState struct KVMDirtyRingReaper reaper; NotifyVmexitOption notify_vmexit; uint32_t notify_window; + uint32_t xen_version; + uint32_t xen_caps; }; =20 void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml, diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h new file mode 100644 index 000000000000..296533f2d558 --- /dev/null +++ b/include/sysemu/kvm_xen.h @@ -0,0 +1,20 @@ +/* + * Xen HVM emulation support in KVM + * + * Copyright =C2=A9 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef QEMU_SYSEMU_KVM_XEN_H +#define QEMU_SYSEMU_KVM_XEN_H + +uint32_t kvm_xen_get_caps(void); + +#define kvm_xen_has_cap(cap) (!!(kvm_xen_get_caps() & \ + KVM_XEN_HVM_CONFIG_ ## cap)) + +#endif /* QEMU_SYSEMU_KVM_XEN_H */ diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index d18bd2f3e889..da7342630c03 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -31,6 +31,7 @@ #include "sysemu/runstate.h" #include "kvm_i386.h" #include "sev.h" +#include "xen-emu.h" #include "hyperv.h" #include "hyperv-proto.h" =20 @@ -42,6 +43,7 @@ #include "qemu/error-report.h" #include "qemu/memalign.h" #include "hw/i386/x86.h" +#include "hw/i386/pc.h" #include "hw/i386/apic.h" #include "hw/i386/apic_internal.h" #include "hw/i386/apic-msidef.h" @@ -49,6 +51,8 @@ #include "hw/i386/x86-iommu.h" #include "hw/i386/e820_memory_layout.h" =20 +#include "hw/xen/xen.h" + #include "hw/pci/pci.h" #include "hw/pci/msi.h" #include "hw/pci/msix.h" @@ -2529,6 +2533,22 @@ int kvm_arch_init(MachineState *ms, KVMState *s) } } =20 + if (s->xen_version) { +#ifdef CONFIG_XEN_EMU + if (!object_dynamic_cast(OBJECT(ms), TYPE_PC_MACHINE)) { + error_report("kvm: Xen support only available in PC machine"); + return -ENOTSUP; + } + ret =3D kvm_xen_init(s); + if (ret < 0) { + return ret; + } +#else + error_report("kvm: Xen support not enabled in qemu"); + return -ENOTSUP; +#endif + } + ret =3D kvm_get_supported_msrs(s); if (ret < 0) { return ret; @@ -5719,6 +5739,36 @@ static void kvm_arch_set_notify_window(Object *obj, = Visitor *v, s->notify_window =3D value; } =20 +static void kvm_arch_get_xen_version(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + KVMState *s =3D KVM_STATE(obj); + uint32_t value =3D s->xen_version; + + visit_type_uint32(v, name, &value, errp); +} + +static void kvm_arch_set_xen_version(Object *obj, Visitor *v, + const char *name, void *opaque, + Error **errp) +{ + KVMState *s =3D KVM_STATE(obj); + Error *error =3D NULL; + uint32_t value; + + visit_type_uint32(v, name, &value, &error); + if (error) { + error_propagate(errp, error); + return; + } + + s->xen_version =3D value; + if (value && xen_mode =3D=3D XEN_DISABLED) { + xen_mode =3D XEN_EMULATE; + } +} + void kvm_arch_accel_class_init(ObjectClass *oc) { object_class_property_add_enum(oc, "notify-vmexit", "NotifyVMexitOptio= n", @@ -5735,6 +5785,15 @@ void kvm_arch_accel_class_init(ObjectClass *oc) object_class_property_set_description(oc, "notify-window", "Clock cycles without an event w= indow " "after which a notification VM e= xit occurs"); + + object_class_property_add(oc, "xen-version", "uint32", + kvm_arch_get_xen_version, + kvm_arch_set_xen_version, + NULL, NULL); + object_class_property_set_description(oc, "xen-version", + "Xen version to be emulated " + "(in XENVER_version form " + "e.g. 0x4000a for 4.10)"); } =20 void kvm_set_max_apic_id(uint32_t max_apic_id) diff --git a/target/i386/kvm/meson.build b/target/i386/kvm/meson.build index 736df8b72e3f..322272091bce 100644 --- a/target/i386/kvm/meson.build +++ b/target/i386/kvm/meson.build @@ -7,6 +7,8 @@ i386_softmmu_kvm_ss.add(files( 'kvm-cpu.c', )) =20 +i386_softmmu_kvm_ss.add(when: 'CONFIG_XEN_EMU', if_true: files('xen-emu.c'= )) + i386_softmmu_kvm_ss.add(when: 'CONFIG_SEV', if_false: files('sev-stub.c')) =20 i386_softmmu_ss.add(when: 'CONFIG_HYPERV', if_true: files('hyperv.c'), if_= false: files('hyperv-stub.c')) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c new file mode 100644 index 000000000000..b556d903aa94 --- /dev/null +++ b/target/i386/kvm/xen-emu.c @@ -0,0 +1,58 @@ +/* + * Xen HVM emulation support in KVM + * + * Copyright =C2=A9 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "sysemu/kvm_int.h" +#include "sysemu/kvm_xen.h" +#include "kvm/kvm_i386.h" +#include "xen-emu.h" + +int kvm_xen_init(KVMState *s) +{ + const int required_caps =3D KVM_XEN_HVM_CONFIG_HYPERCALL_MSR | + KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL | KVM_XEN_HVM_CONFIG_SHARED_INF= O; + struct kvm_xen_hvm_config cfg =3D { + .msr =3D XEN_HYPERCALL_MSR, + .flags =3D KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL, + }; + int xen_caps, ret; + + xen_caps =3D kvm_check_extension(s, KVM_CAP_XEN_HVM); + if (required_caps & ~xen_caps) { + error_report("kvm: Xen HVM guest support not present or insufficie= nt"); + return -ENOSYS; + } + + if (xen_caps & KVM_XEN_HVM_CONFIG_EVTCHN_SEND) { + struct kvm_xen_hvm_attr ha =3D { + .type =3D KVM_XEN_ATTR_TYPE_XEN_VERSION, + .u.xen_version =3D s->xen_version, + }; + (void)kvm_vm_ioctl(s, KVM_XEN_HVM_SET_ATTR, &ha); + + cfg.flags |=3D KVM_XEN_HVM_CONFIG_EVTCHN_SEND; + } + + ret =3D kvm_vm_ioctl(s, KVM_XEN_HVM_CONFIG, &cfg); + if (ret < 0) { + error_report("kvm: Failed to enable Xen HVM support: %s", + strerror(-ret)); + return ret; + } + + s->xen_caps =3D xen_caps; + return 0; +} + +uint32_t kvm_xen_get_caps(void) +{ + return kvm_state->xen_caps; +} diff --git a/target/i386/kvm/xen-emu.h b/target/i386/kvm/xen-emu.h new file mode 100644 index 000000000000..4f31bd96cbb7 --- /dev/null +++ b/target/i386/kvm/xen-emu.h @@ -0,0 +1,19 @@ +/* + * Xen HVM emulation support in KVM + * + * Copyright =C2=A9 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef QEMU_I386_KVM_XEN_EMU_H +#define QEMU_I386_KVM_XEN_EMU_H + +#define XEN_HYPERCALL_MSR 0x40000000 + +int kvm_xen_init(KVMState *s); + +#endif /* QEMU_I386_KVM_XEN_EMU_H */ --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760788; cv=none; d=zohomail.com; s=zohoarc; b=J0uC5uIXWOfGqjzpN2tSY0SOXOKlxNedJm5kCIJUE6ZcFJmd7C/Tge8g6v0NtWJtW92Zw3urGPkT8JU14+qeJm00dczMolob2fqi6/UbuXq3p2tbpk5SUCO+Qsn64XQgLyN93xNr4fdND28JrNXTYExyc1AgosFqzHQE8rdo2oM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760788; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=ceoIbQOk6izAHTjTrmjqkHlNAoN9f/28BcAw9b8QFI0=; b=PRnYDMUmHT4NuZ5vrOw60TSRD0GVCzSwAdvhnmGL1B1Ci4GGS93f80a1HUYlutdx+rsTGpBLg8DCtCjbLPm4CXylCFWBecjHU1P7GlQwURSQVe0CnFkXHBd6LagNjkYhK0clSB3SqWUklWnRyHUWw7wammT28CeYPAKcQcBrfZk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760788647387.74751525760826; Thu, 2 Mar 2023 04:39:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5P-0007bT-3l; Thu, 02 Mar 2023 07:31:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5H-0007RZ-PX for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:00 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5E-0002rU-Vt for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:30:55 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-357-1cbRUxUtNnGuhTc-FynEpQ-1; Thu, 02 Mar 2023 07:30:51 -0500 Received: by mail-wm1-f70.google.com with SMTP id az39-20020a05600c602700b003e97eb80524so1197358wmb.4 for ; Thu, 02 Mar 2023 04:30:51 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id e15-20020a5d594f000000b002c5d3f0f737sm15074727wri.30.2023.03.02.04.30.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:30:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760252; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ceoIbQOk6izAHTjTrmjqkHlNAoN9f/28BcAw9b8QFI0=; b=H91brcOS8OPJ/lHEsQJwHoScCZJ1svYs3NjtqMc2K5PUMVv67RZ2T4+8AR/p5p/NmYH0xq SEVyhwrsUKqmOXKDBSVoruR2DgMtncsfCMVSt1raBdPzzKr5q++a7HpAejq8N+axP73Ewy FMAGykTRda0PycuqitGUexzuAN0yVIo= X-MC-Unique: 1cbRUxUtNnGuhTc-FynEpQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ceoIbQOk6izAHTjTrmjqkHlNAoN9f/28BcAw9b8QFI0=; b=3Ri6A9ZQv0tXmok/YG6LMVMUsInhphVEOwEQ/D73UAMkbQbNYrCbHC3KXaEytpZmY4 IHfJ2p1CjX5ZHGBIMLhznX6HglRaqEt9Ti4itnQCW7mC/OAIxIDmfio8iR2EWKUsItWq LCHxc55liiWa27ht0yFDdN7O3jMQUrKYe4svhjaa5DZMWplkAy8/rsTSZKdu7GVtzK1P zid5kmxhAHRFmPciCuu59MRkuCVNyHyyNIYd/kmz4lLv4wu4DcgiSu2J2eGh91D9OeDO HE3QfPRl0TQbmqBds5XLQTKR5zud5ifAvmpEcOhSCAwt+c3JfkbFIlKnG8gVTyLT/oVB N1Xw== X-Gm-Message-State: AO0yUKWKiUj4dfZIX9jNiofe2PWY+qU6Yt43SL7AXC4s9NS9KB8ioV3Z vmuvUGTpZ2H2IayMPahNOzX/J4jYO7aAq86XMVTK/TDQHd0F7G9PcI0XQElH8P4jubrZBBsFtuJ bzxLjoxW2v402bpXQKyvhvlG1IzA42nCN2b0tMQd8nmrCFsZW27y1BUIB1gX2R6g/dY1v6VBaQG A= X-Received: by 2002:a05:600c:491f:b0:3ea:bc08:42ad with SMTP id f31-20020a05600c491f00b003eabc0842admr7684902wmp.2.1677760249640; Thu, 02 Mar 2023 04:30:49 -0800 (PST) X-Google-Smtp-Source: AK7set9qSF7Hn1Opzo7Mx92ZLkPNb2FYlB01DX/83pfrlm3JRw54bUKF1KugkPTPKbumH8Q0HYf3mQ== X-Received: by 2002:a05:600c:491f:b0:3ea:bc08:42ad with SMTP id f31-20020a05600c491f00b003eabc0842admr7684883wmp.2.1677760249287; Thu, 02 Mar 2023 04:30:49 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 05/62] i386/kvm: handle Xen HVM cpuid leaves Date: Thu, 2 Mar 2023 13:29:32 +0100 Message-Id: <20230302123029.153265-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760789029100003 Content-Type: text/plain; charset="utf-8" From: Joao Martins Introduce support for emulating CPUID for Xen HVM guests. It doesn't make sense to advertise the KVM leaves to a Xen guest, so do Xen unconditionally when the xen-version machine property is set. Signed-off-by: Joao Martins [dwmw2: Obtain xen_version from KVM property, make it automatic] Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/cpu.c | 1 + target/i386/cpu.h | 2 + target/i386/kvm/kvm.c | 77 ++++++++++++++++++++++++++++++++++++++- target/i386/kvm/xen-emu.c | 4 +- target/i386/kvm/xen-emu.h | 13 ++++++- 5 files changed, 91 insertions(+), 6 deletions(-) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 4bad3d41d33f..a0fa04e079e8 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -7200,6 +7200,7 @@ static Property x86_cpu_properties[] =3D { * own cache information (see x86_cpu_load_def()). */ DEFINE_PROP_BOOL("legacy-cache", X86CPU, legacy_cache, true), + DEFINE_PROP_BOOL("xen-vapic", X86CPU, xen_vapic, false), =20 /* * From "Requirements for Implementing the Microsoft diff --git a/target/i386/cpu.h b/target/i386/cpu.h index ea650e68a3a2..5069adfbe7e0 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1975,6 +1975,8 @@ struct ArchCPU { int32_t thread_id; =20 int32_t hv_max_vps; + + bool xen_vapic; }; =20 =20 diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index da7342630c03..aac43174e886 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -22,6 +22,7 @@ =20 #include #include "standard-headers/asm-x86/kvm_para.h" +#include "hw/xen/interface/arch-x86/cpuid.h" =20 #include "cpu.h" #include "host-cpu.h" @@ -1819,7 +1820,77 @@ int kvm_arch_init_vcpu(CPUState *cs) has_msr_hv_hypercall =3D true; } =20 - if (cpu->expose_kvm) { + if (cs->kvm_state->xen_version) { +#ifdef CONFIG_XEN_EMU + struct kvm_cpuid_entry2 *xen_max_leaf; + + memcpy(signature, "XenVMMXenVMM", 12); + + xen_max_leaf =3D c =3D &cpuid_data.entries[cpuid_i++]; + c->function =3D kvm_base + XEN_CPUID_SIGNATURE; + c->eax =3D kvm_base + XEN_CPUID_TIME; + c->ebx =3D signature[0]; + c->ecx =3D signature[1]; + c->edx =3D signature[2]; + + c =3D &cpuid_data.entries[cpuid_i++]; + c->function =3D kvm_base + XEN_CPUID_VENDOR; + c->eax =3D cs->kvm_state->xen_version; + c->ebx =3D 0; + c->ecx =3D 0; + c->edx =3D 0; + + c =3D &cpuid_data.entries[cpuid_i++]; + c->function =3D kvm_base + XEN_CPUID_HVM_MSR; + /* Number of hypercall-transfer pages */ + c->eax =3D 1; + /* Hypercall MSR base address */ + if (hyperv_enabled(cpu)) { + c->ebx =3D XEN_HYPERCALL_MSR_HYPERV; + kvm_xen_init(cs->kvm_state, c->ebx); + } else { + c->ebx =3D XEN_HYPERCALL_MSR; + } + c->ecx =3D 0; + c->edx =3D 0; + + c =3D &cpuid_data.entries[cpuid_i++]; + c->function =3D kvm_base + XEN_CPUID_TIME; + c->eax =3D ((!!tsc_is_stable_and_known(env) << 1) | + (!!(env->features[FEAT_8000_0001_EDX] & CPUID_EXT2_RDTSCP) << = 2)); + /* default=3D0 (emulate if necessary) */ + c->ebx =3D 0; + /* guest tsc frequency */ + c->ecx =3D env->user_tsc_khz; + /* guest tsc incarnation (migration count) */ + c->edx =3D 0; + + c =3D &cpuid_data.entries[cpuid_i++]; + c->function =3D kvm_base + XEN_CPUID_HVM; + xen_max_leaf->eax =3D kvm_base + XEN_CPUID_HVM; + if (cs->kvm_state->xen_version >=3D XEN_VERSION(4, 5)) { + c->function =3D kvm_base + XEN_CPUID_HVM; + + if (cpu->xen_vapic) { + c->eax |=3D XEN_HVM_CPUID_APIC_ACCESS_VIRT; + c->eax |=3D XEN_HVM_CPUID_X2APIC_VIRT; + } + + c->eax |=3D XEN_HVM_CPUID_IOMMU_MAPPINGS; + + if (cs->kvm_state->xen_version >=3D XEN_VERSION(4, 6)) { + c->eax |=3D XEN_HVM_CPUID_VCPU_ID_PRESENT; + c->ebx =3D cs->cpu_index; + } + } + + kvm_base +=3D 0x100; +#else /* CONFIG_XEN_EMU */ + /* This should never happen as kvm_arch_init() would have died fir= st. */ + fprintf(stderr, "Cannot enable Xen CPUID without Xen support\n"); + abort(); +#endif + } else if (cpu->expose_kvm) { memcpy(signature, "KVMKVMKVM\0\0\0", 12); c =3D &cpuid_data.entries[cpuid_i++]; c->function =3D KVM_CPUID_SIGNATURE | kvm_base; @@ -2539,7 +2610,9 @@ int kvm_arch_init(MachineState *ms, KVMState *s) error_report("kvm: Xen support only available in PC machine"); return -ENOTSUP; } - ret =3D kvm_xen_init(s); + /* hyperv_enabled() doesn't work yet. */ + uint32_t msr =3D XEN_HYPERCALL_MSR; + ret =3D kvm_xen_init(s, msr); if (ret < 0) { return ret; } diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index b556d903aa94..34d5bc1bc964 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -15,12 +15,12 @@ #include "kvm/kvm_i386.h" #include "xen-emu.h" =20 -int kvm_xen_init(KVMState *s) +int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) { const int required_caps =3D KVM_XEN_HVM_CONFIG_HYPERCALL_MSR | KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL | KVM_XEN_HVM_CONFIG_SHARED_INF= O; struct kvm_xen_hvm_config cfg =3D { - .msr =3D XEN_HYPERCALL_MSR, + .msr =3D hypercall_msr, .flags =3D KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL, }; int xen_caps, ret; diff --git a/target/i386/kvm/xen-emu.h b/target/i386/kvm/xen-emu.h index 4f31bd96cbb7..2101df01824b 100644 --- a/target/i386/kvm/xen-emu.h +++ b/target/i386/kvm/xen-emu.h @@ -12,8 +12,17 @@ #ifndef QEMU_I386_KVM_XEN_EMU_H #define QEMU_I386_KVM_XEN_EMU_H =20 -#define XEN_HYPERCALL_MSR 0x40000000 +#define XEN_HYPERCALL_MSR 0x40000000 +#define XEN_HYPERCALL_MSR_HYPERV 0x40000200 =20 -int kvm_xen_init(KVMState *s); +#define XEN_CPUID_SIGNATURE 0 +#define XEN_CPUID_VENDOR 1 +#define XEN_CPUID_HVM_MSR 2 +#define XEN_CPUID_TIME 3 +#define XEN_CPUID_HVM 4 + +#define XEN_VERSION(maj, min) ((maj) << 16 | (min)) + +int kvm_xen_init(KVMState *s, uint32_t hypercall_msr); =20 #endif /* QEMU_I386_KVM_XEN_EMU_H */ --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760962; cv=none; d=zohomail.com; s=zohoarc; b=h6AAACZvW8GeDfndq/oXBkzcO3WYAnq/mPkcKyjNyekre4YKn0nREB6v6gWAlBZJQ8UCdc/Ac+edep5X6dnwmtfwTsz4/0jBOuw4tr4ciFkGAp4dD9KXon7/2wuRYANp8OrhHg/n0mymCWfOij92nuXfTwOoXvEU0b/lXvAcYcc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760962; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=6q6/SizaupC6KoqaMA/P4WJcsqqBFWg0PjVeMPJ8oGw=; b=UGZx1OmMCm4/zP27+Eh27LYAfiJ4kh31P2h/GqlJry1K+IhpTbGmVsTWEe0L8OdfGRbke8FWsZk8eDTXo/hbKJotWXKxyP7QEPC/v0YOcLrI0X6sz9B75Hy+BcddlFj0YVVBeQm9xDO5hP/ip3uPrUrLQYpDAGCpsUvRGfGhpoI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760962023531.856572038803; Thu, 2 Mar 2023 04:42:42 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5R-0007dy-09; Thu, 02 Mar 2023 07:31:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5M-0007V1-0P for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:00 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5K-0002uE-5g for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:30:59 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-196-IsRdWVAYMFeDfIwHTAkQ9Q-1; Thu, 02 Mar 2023 07:30:54 -0500 Received: by mail-wm1-f72.google.com with SMTP id bi27-20020a05600c3d9b00b003e9d0925341so5686800wmb.8 for ; Thu, 02 Mar 2023 04:30:53 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id c4-20020adffb04000000b002c70bfe505esm15237034wrr.82.2023.03.02.04.30.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:30:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760257; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6q6/SizaupC6KoqaMA/P4WJcsqqBFWg0PjVeMPJ8oGw=; b=HiGBQmbQh1Y3ZNkMhtOluOxEbfC39YIgJROOzcMWzpDhNWB8WIgIw/QoZGW/apDvcjcjZj dbx/HfmPLrd674r1QjaA/H7VWRlozm55pNCvBBnpJuAwA6GBRoT7An5/foNyfdE1AcjJ7r RsF80tRuVsJKaUTsGPDVmfSx1TJGpHk= X-MC-Unique: IsRdWVAYMFeDfIwHTAkQ9Q-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6q6/SizaupC6KoqaMA/P4WJcsqqBFWg0PjVeMPJ8oGw=; b=FzjSPxorKCkT99MJafDkBcBuMie1GSDAsmZvp1jRpz0uCutj3MqEmMIq/1MFag93GA BKxiAX25HRTdfFOpQl4SkWKJOCoRJ2w8rfZrXXxQjyOrNsaEOc3wRZALhGZrLo5y5CRY 7Kq/DbixNfqdufmqN+jhayiQrRZ7kIkin0NF0FlHa/D4VfCgYlamQqpDDjOvtwdPxDo7 z0f1xZWrWydU7wOMs/wpnD/TFGqcvt1ocn5bH6TCTQmtHpuWhMfL03+rk/dMOcGoajKB SnPJWeVbSIT87CoFfaDQ6h7Q/NPjByPQj5eOMX7HiE+vWkfMOEalWTkddw+OnVw2VG7B sDVQ== X-Gm-Message-State: AO0yUKUf/PGPmmIzqnUJzb1hMUg0eG+YPdxVDNZf1KlYOuhH9KKuOBH2 5TS7D1IXUFJSLxfQSyOCQxKAB2rPlekHNr1UocvZ8eJJ/apkti4RzlE3HDF0AfBp/RztEL7oHg6 4iKjYjWuhlJKx1eLbngoCAuE6eITovPlLU6I6WMB62iM40WUkHI7sFTr4NLcgCzG/Itip4iw2lE g= X-Received: by 2002:a5d:6345:0:b0:2ca:67bb:11ba with SMTP id b5-20020a5d6345000000b002ca67bb11bamr6457262wrw.34.1677760252262; Thu, 02 Mar 2023 04:30:52 -0800 (PST) X-Google-Smtp-Source: AK7set/kLljRIhT5l+oiR0WOZ3kHVLitzuft6c5BkfsaMzkEqDekUIKqFcenVB1wSefuR9ZtSysy1w== X-Received: by 2002:a5d:6345:0:b0:2ca:67bb:11ba with SMTP id b5-20020a5d6345000000b002ca67bb11bamr6457255wrw.34.1677760252013; Thu, 02 Mar 2023 04:30:52 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 06/62] i386/kvm: Set Xen vCPU ID in KVM Date: Thu, 2 Mar 2023 13:29:33 +0100 Message-Id: <20230302123029.153265-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760963861100011 Content-Type: text/plain; charset="utf-8" From: David Woodhouse There are (at least) three different vCPU ID number spaces. One is the internal KVM vCPU index, based purely on which vCPU was chronologically created in the kernel first. If userspace threads are all spawned and create their KVM vCPUs in essentially random order, then the KVM indices are basically random too. The second number space is the APIC ID space, which is consistent and useful for referencing vCPUs. MSIs will specify the target vCPU using the APIC ID, for example, and the KVM Xen APIs also take an APIC ID from userspace whenever a vCPU needs to be specified (as opposed to just using the appropriate vCPU fd). The third number space is not normally relevant to the kernel, and is the ACPI/MADT/Xen CPU number which corresponds to cs->cpu_index. But Xen timer hypercalls use it, and Xen timer hypercalls *really* want to be accelerated in the kernel rather than handled in userspace, so the kernel needs to be told. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/kvm.c | 5 +++++ target/i386/kvm/xen-emu.c | 28 ++++++++++++++++++++++++++++ target/i386/kvm/xen-emu.h | 1 + 3 files changed, 34 insertions(+) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index aac43174e886..edcf8a2a65d5 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -1884,6 +1884,11 @@ int kvm_arch_init_vcpu(CPUState *cs) } } =20 + r =3D kvm_xen_init_vcpu(cs); + if (r) { + return r; + } + kvm_base +=3D 0x100; #else /* CONFIG_XEN_EMU */ /* This should never happen as kvm_arch_init() would have died fir= st. */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 34d5bc1bc964..4883b95d9d47 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -52,6 +52,34 @@ int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) return 0; } =20 +int kvm_xen_init_vcpu(CPUState *cs) +{ + int err; + + /* + * The kernel needs to know the Xen/ACPI vCPU ID because that's + * what the guest uses in hypercalls such as timers. It doesn't + * match the APIC ID which is generally used for talking to the + * kernel about vCPUs. And if vCPU threads race with creating + * their KVM vCPUs out of order, it doesn't necessarily match + * with the kernel's internal vCPU indices either. + */ + if (kvm_xen_has_cap(EVTCHN_SEND)) { + struct kvm_xen_vcpu_attr va =3D { + .type =3D KVM_XEN_VCPU_ATTR_TYPE_VCPU_ID, + .u.vcpu_id =3D cs->cpu_index, + }; + err =3D kvm_vcpu_ioctl(cs, KVM_XEN_VCPU_SET_ATTR, &va); + if (err) { + error_report("kvm: Failed to set Xen vCPU ID attribute: %s", + strerror(-err)); + return err; + } + } + + return 0; +} + uint32_t kvm_xen_get_caps(void) { return kvm_state->xen_caps; diff --git a/target/i386/kvm/xen-emu.h b/target/i386/kvm/xen-emu.h index 2101df01824b..d62f1d8ed8fe 100644 --- a/target/i386/kvm/xen-emu.h +++ b/target/i386/kvm/xen-emu.h @@ -24,5 +24,6 @@ #define XEN_VERSION(maj, min) ((maj) << 16 | (min)) =20 int kvm_xen_init(KVMState *s, uint32_t hypercall_msr); +int kvm_xen_init_vcpu(CPUState *cs); =20 #endif /* QEMU_I386_KVM_XEN_EMU_H */ --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760962; cv=none; d=zohomail.com; s=zohoarc; b=N2fcS5CbeE7MTB6Uqrb5/C+xKKtf7j1SQcd3ufDfs2+GHbAIcBojwFZpToOzBLzkMQ/ll91FfZwWslVyHootFhbEzZ5icYW+gYm8AuD2Tg5nmj8WdSmP+eVe4U+qPuQlOOsQbHZ7qo0YP0iexo/6XUfnaaWCWJ0JU9JCeBTnlDQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760962; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=yBmz67y5d+pj4TJTeDfNOkaourUgBzpjoKeqiUgJV2A=; b=JvtZy+Ni3atsL/e68DPTt+rG3rn6jiLEwum3fUc3AAvQUAN4bb/RhktcpuiapAqXR7Y0WEpA+/EVf4YUfszLCSbm+SG+Ad8XaMkDeoL/pru+CprCPmSZv1N1bSeNG1W3KBMirGei17IuK1DgF7p9Nda1apAhO3vDvqRsHWoJDho= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760962802268.0612698768962; Thu, 2 Mar 2023 04:42:42 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5R-0007eF-4l; Thu, 02 Mar 2023 07:31:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5L-0007V0-Qb for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:00 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5K-0002uH-CB for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:30:59 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-53-_GeS7MTiMZScBjifBn92tA-1; Thu, 02 Mar 2023 07:30:56 -0500 Received: by mail-wm1-f72.google.com with SMTP id k26-20020a05600c0b5a00b003dfe4bae099so1033336wmr.0 for ; Thu, 02 Mar 2023 04:30:56 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id a4-20020a5d5704000000b002c559843748sm15359904wrv.10.2023.03.02.04.30.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:30:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760257; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yBmz67y5d+pj4TJTeDfNOkaourUgBzpjoKeqiUgJV2A=; b=i+OKvBtRunK/UR8QjrwcdHz47+I/jfqfSSwN8vUhIHXmi7TUeDB8V0RqowT1X9K/TMokEh ZAv9zoBa6Le1w7ccTu2uKebcYZFcVo56wp5bGOEE8JLtGgeOJL7L6vAKQHlljZnTfIfbk7 hIRPRBUeCKEUBzf5k3b458xGH9EJBmQ= X-MC-Unique: _GeS7MTiMZScBjifBn92tA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=yBmz67y5d+pj4TJTeDfNOkaourUgBzpjoKeqiUgJV2A=; b=ZYi68gLJp0Wa3mgMxGlerSTLuGwCUo55QsN1EXNgmntciU/y8DeUARUu5mgeX5YO4/ 56p3Rlr+pxm/ExYGHbLEijLsNRNI2vGBK6hPjCK3j7jKtgGLF5S9+vBUHF29kXdYwfSN 6w/wOECermi/uQWFr2nQSAb/ilDs9ZECPA9BPhTZcXxJJRoCxyjPjhqTgTlDafiwEmXS OpHT3sjnZnKqAgIzbb06HlMnzP/p1oetrKsWuf20PMctB/qIHCEiZHM4CvXoUT9u1AX2 82RyuYwmE4ATtx1TKopx8JqGRkVAMqD4N77QiubYz5PMRMU++tNwQLnM5zGKtfYDW+gY +a5A== X-Gm-Message-State: AO0yUKXhfv71f4tBJch0kQQSctC15erFrm60Vr8VWGgcty6iYmJDq7+0 TDVzagrVXCE1zQzel3pcIZkhzWKl3nJJUumO3qX5TIirwN+pEDgkRX7qRxwnOWQkYJMc1pjklnL H5/cZk8aiWwXkJwrtgGvGzmg4AG43hU92DfjKpeoQU74qfOeW/ppX+HijIxhF1myXAyvJkODlOK w= X-Received: by 2002:a05:600c:755:b0:3ea:e834:d0d1 with SMTP id j21-20020a05600c075500b003eae834d0d1mr7943459wmn.36.1677760255072; Thu, 02 Mar 2023 04:30:55 -0800 (PST) X-Google-Smtp-Source: AK7set98yDNgajNe1KKN0FG8vkSo646KClsZxZKOgl0cgwtScZXdwB5wl64MaA4NWiVjb1VlRZq0pw== X-Received: by 2002:a05:600c:755:b0:3ea:e834:d0d1 with SMTP id j21-20020a05600c075500b003eae834d0d1mr7943444wmn.36.1677760254859; Thu, 02 Mar 2023 04:30:54 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 07/62] xen-platform: exclude vfio-pci from the PCI platform unplug Date: Thu, 2 Mar 2023 13:29:34 +0100 Message-Id: <20230302123029.153265-8-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760963883100012 Content-Type: text/plain; charset="utf-8" From: Joao Martins Such that PCI passthrough devices work for Xen emulated guests. Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/xen/xen_platform.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c index 3795a203d4d3..8a616970539c 100644 --- a/hw/i386/xen/xen_platform.c +++ b/hw/i386/xen/xen_platform.c @@ -108,12 +108,25 @@ static void log_writeb(PCIXenPlatformState *s, char v= al) #define _UNPLUG_NVME_DISKS 3 #define UNPLUG_NVME_DISKS (1u << _UNPLUG_NVME_DISKS) =20 +static bool pci_device_is_passthrough(PCIDevice *d) +{ + if (!strcmp(d->name, "xen-pci-passthrough")) { + return true; + } + + if (xen_mode =3D=3D XEN_EMULATE && !strcmp(d->name, "vfio-pci")) { + return true; + } + + return false; +} + static void unplug_nic(PCIBus *b, PCIDevice *d, void *o) { /* We have to ignore passthrough devices */ if (pci_get_word(d->config + PCI_CLASS_DEVICE) =3D=3D PCI_CLASS_NETWORK_ETHERNET - && strcmp(d->name, "xen-pci-passthrough") !=3D 0) { + && !pci_device_is_passthrough(d)) { object_unparent(OBJECT(d)); } } @@ -186,9 +199,8 @@ static void unplug_disks(PCIBus *b, PCIDevice *d, void = *opaque) !(flags & UNPLUG_IDE_SCSI_DISKS); =20 /* We have to ignore passthrough devices */ - if (!strcmp(d->name, "xen-pci-passthrough")) { + if (pci_device_is_passthrough(d)) return; - } =20 switch (pci_get_word(d->config + PCI_CLASS_DEVICE)) { case PCI_CLASS_STORAGE_IDE: --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760486; cv=none; d=zohomail.com; s=zohoarc; b=TAHIKMKj1Glerxg6qrrsOPMuT+TmRz6xJeHlekXIwgr78FNLfeFonSijKCMy+M+2oD/dJ4yKEqqnarb2CFi3oZcHc2/hvRCxgMbgzlZWU3csNROY/mRA+GbSNFUPocpiEGEjO0v55gn/ARz8ZLElFrH2dPw1ulMty6TwOhHaKpg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760486; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=jWLYjuhdjDRLurVn1ktvDMOhSO7eZ7zfYFHt+ck3q+o=; b=OwDOIhLTBEpdVcvb+zaHNk7sGMcBjn/m+pgFIw6eiHGrRhLYvNqsroTi1eSLULSTEt8gPxDvzu1BqSVuFIx2XlglsUIwlvYyOloMP6qsRRzBCm72jADMuo74LNZ4Kl8xVlY1vJUnQGpxRcJpkGo8H2BnBRSWuZRbRo9wOVLR2Cg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760486449957.8373765595339; Thu, 2 Mar 2023 04:34:46 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5S-0007f0-PY; Thu, 02 Mar 2023 07:31:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5P-0007dB-Nk for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:03 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5O-0002v3-1p for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:03 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-515-vA1nm529PNaINPGJve2rOw-1; Thu, 02 Mar 2023 07:31:00 -0500 Received: by mail-wm1-f72.google.com with SMTP id r7-20020a05600c35c700b003eb3f2c4fb4so1012809wmq.6 for ; Thu, 02 Mar 2023 04:31:00 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id x6-20020adff646000000b002c56046a3b5sm14760637wrp.53.2023.03.02.04.30.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:30:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760261; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=jWLYjuhdjDRLurVn1ktvDMOhSO7eZ7zfYFHt+ck3q+o=; b=TOcykAnW0ZERbRFXiMl/7MgkNgy4wwW51Uol3y0ma1RPSSCEWgElJELPA3pVudurbC1mEo iYyed0jqNqwJ3Ha9oW3CfNMdCPHdf2ib0Mc0oUrO9tG+CT/mHUEwbR4RXpR9NMVWo9bYfs jlJ7ylzROVF/Z2bi+4gFckvq5hIP+jA= X-MC-Unique: vA1nm529PNaINPGJve2rOw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jWLYjuhdjDRLurVn1ktvDMOhSO7eZ7zfYFHt+ck3q+o=; b=E0UZhr99Dx4cWklETFC3tWbnYi3X7qFwfH9hfhnWWo6OVMy7C5LrR/sO0pp9kb3ho+ YirWd53JMVwfgfYJRIfuR2lRSA66xAa3kdoBdS3j8zCdv+Kd+2eNEwUlTjw7eYp+d0bo tXN03nQGCDSKAWYlOXpfRAARnq8dVFAnIbpI5LN/U2/w1FFdGfHvtvVtYp0PQyLCKfx0 ftcVrFdSI4rtWvjUbCL3MJHWt97gKM6bfTHJmI9Z45dTIFQL49TJBfKhg82vhKGNR7ML byTK/nCoQIA1qEBlXp1lZUSh9fJvSGIBtoZeGRMdHdUILySivdO5KB7kvCLjmgmxRfQZ 3WOQ== X-Gm-Message-State: AO0yUKVBU3gSGfF63D5Sa2/Au3xK9FojLAFjQaQh6RWw2Dz1wadw2Byu enXFN/uzRZh3LKeGX5th8Pw1CP24jZQevsIp9rOPqnIX0PQiolAKACAUK0c8u+rPCXaA4FUKRE/ u8imYNXZyZo+du5GMSUPJsoplL1hmAYLat/y9bmL4md5dYs9qtX+2sFwICfmjj29ucj/2nBwXhY o= X-Received: by 2002:a05:6000:108c:b0:2c7:760:2539 with SMTP id y12-20020a056000108c00b002c707602539mr7367076wrw.50.1677760258159; Thu, 02 Mar 2023 04:30:58 -0800 (PST) X-Google-Smtp-Source: AK7set8t4995Ua6gP6YhJPpJNCQ/sIUq3tz9wBLyjchKFLRPEQ0AJrL1v0X/4z0gpGUbovst24HPKg== X-Received: by 2002:a05:6000:108c:b0:2c7:760:2539 with SMTP id y12-20020a056000108c00b002c707602539mr7367061wrw.50.1677760257826; Thu, 02 Mar 2023 04:30:57 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 08/62] xen-platform: allow its creation with XEN_EMULATE mode Date: Thu, 2 Mar 2023 13:29:35 +0100 Message-Id: <20230302123029.153265-9-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760487425100003 Content-Type: text/plain; charset="utf-8" From: Joao Martins The only thing we need to fix to make this build is the PIO hack which sets the BIOS memory areas to R/W v.s. R/O. Theoretically we could hook that up to the PAM registers on the emulated PIIX, but in practice nobody cares, so just leave it doing nothing. Now it builds without actual Xen, move it to CONFIG_XEN_BUS to include it in the KVM-only builds. Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/xen/meson.build | 5 ++++- hw/i386/xen/xen_platform.c | 39 +++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/hw/i386/xen/meson.build b/hw/i386/xen/meson.build index be84130300cb..2e64a34e16f8 100644 --- a/hw/i386/xen/meson.build +++ b/hw/i386/xen/meson.build @@ -2,6 +2,9 @@ i386_ss.add(when: 'CONFIG_XEN', if_true: files( 'xen-hvm.c', 'xen-mapcache.c', 'xen_apic.c', - 'xen_platform.c', 'xen_pvdevice.c', )) + +i386_ss.add(when: 'CONFIG_XEN_BUS', if_true: files( + 'xen_platform.c', +)) diff --git a/hw/i386/xen/xen_platform.c b/hw/i386/xen/xen_platform.c index 8a616970539c..539f7da374ce 100644 --- a/hw/i386/xen/xen_platform.c +++ b/hw/i386/xen/xen_platform.c @@ -27,9 +27,9 @@ #include "qapi/error.h" #include "hw/ide/pci.h" #include "hw/pci/pci.h" -#include "hw/xen/xen_common.h" #include "migration/vmstate.h" -#include "hw/xen/xen-legacy-backend.h" +#include "hw/xen/xen.h" +#include "net/net.h" #include "trace.h" #include "sysemu/xen.h" #include "sysemu/block-backend.h" @@ -37,6 +37,11 @@ #include "qemu/module.h" #include "qom/object.h" =20 +#ifdef CONFIG_XEN +#include "hw/xen/xen_common.h" +#include "hw/xen/xen-legacy-backend.h" +#endif + //#define DEBUG_PLATFORM =20 #ifdef DEBUG_PLATFORM @@ -279,18 +284,26 @@ static void platform_fixed_ioport_writeb(void *opaque= , uint32_t addr, uint32_t v PCIXenPlatformState *s =3D opaque; =20 switch (addr) { - case 0: /* Platform flags */ { - hvmmem_type_t mem_type =3D (val & PFFLAG_ROM_LOCK) ? - HVMMEM_ram_ro : HVMMEM_ram_rw; - if (xen_set_mem_type(xen_domid, mem_type, 0xc0, 0x40)) { - DPRINTF("unable to change ro/rw state of ROM memory area!\n"); - } else { + case 0: /* Platform flags */ + if (xen_mode =3D=3D XEN_EMULATE) { + /* XX: Use i440gx/q35 PAM setup to do this? */ s->flags =3D val & PFFLAG_ROM_LOCK; - DPRINTF("changed ro/rw state of ROM memory area. now is %s sta= te.\n", - (mem_type =3D=3D HVMMEM_ram_ro ? "ro":"rw")); +#ifdef CONFIG_XEN + } else { + hvmmem_type_t mem_type =3D (val & PFFLAG_ROM_LOCK) ? + HVMMEM_ram_ro : HVMMEM_ram_rw; + + if (xen_set_mem_type(xen_domid, mem_type, 0xc0, 0x40)) { + DPRINTF("unable to change ro/rw state of ROM memory area!\= n"); + } else { + s->flags =3D val & PFFLAG_ROM_LOCK; + DPRINTF("changed ro/rw state of ROM memory area. now is %s= state.\n", + (mem_type =3D=3D HVMMEM_ram_ro ? "ro" : "rw")); + } +#endif } break; - } + case 2: log_writeb(s, val); break; @@ -508,8 +521,8 @@ static void xen_platform_realize(PCIDevice *dev, Error = **errp) uint8_t *pci_conf; =20 /* Device will crash on reset if xen is not initialized */ - if (!xen_enabled()) { - error_setg(errp, "xen-platform device requires the Xen accelerator= "); + if (xen_mode =3D=3D XEN_DISABLED) { + error_setg(errp, "xen-platform device requires a Xen guest"); return; } =20 --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760325; cv=none; d=zohomail.com; s=zohoarc; b=l2k7Yej23jxYf/P+wWcuSyUkVfw837GzirY+isJNsGgQ22au4RHvjWoiUXnDb2hNm5KIIOkTpuaE54XqUw0wf/hx9GDU85y6NDK3QV1E3jSDOzuMua1JnCoHstjT736HtiZbOo+dzFJX5sr/ihMUOypnfmgd17d80DNFqozWM38= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760325; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=IC9YpBiB1X9C010J2ggHCxhALP+ZulP8Lfe1CvAAGbg=; b=b1AdgvvdQcCwzRu9NfApaYHM8NkM7TUlZbojCcwvLmcAmG/hkiirpJ0I3kGRX+9uxDeOmCm1kFvN1TiUyC1cfcpS5VRaUbVyBZ0KdE97Etx2aZQO58S7YdYXfr+UL3TsFX6ldN7kRB1BWt8df3jgra6ZjUXVQ8OeAes6E5rt45o= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760325147809.8571855691106; Thu, 2 Mar 2023 04:32:05 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5T-0007g5-HB; Thu, 02 Mar 2023 07:31:07 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5S-0007en-CY for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:06 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5Q-0002vh-Q8 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:06 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-259-jkxSycEENyG-wZDQlA8wsA-1; Thu, 02 Mar 2023 07:31:02 -0500 Received: by mail-wm1-f69.google.com with SMTP id l20-20020a05600c1d1400b003e10d3e1c23so1207071wms.1 for ; Thu, 02 Mar 2023 04:31:02 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id i16-20020a05600c355000b003dc4480df80sm3236400wmq.34.2023.03.02.04.31.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760264; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IC9YpBiB1X9C010J2ggHCxhALP+ZulP8Lfe1CvAAGbg=; b=VCjuDskjh7xzTFOeXDMovg7fjrUNpSiTMBc/S9qOdBkFMdMboXlOyoP00tExqdSKe/lK75 1fVpFEmOV2s8BgYATKMRAh4hfq1z1af9u2O8CiezjY/VxWtuwvqw6q9oE4AAHtfarX1TNV kO/qljphwSCRb8cViCF9Gln8ZhJtLKg= X-MC-Unique: jkxSycEENyG-wZDQlA8wsA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IC9YpBiB1X9C010J2ggHCxhALP+ZulP8Lfe1CvAAGbg=; b=1VlE+HBG4doUp5p+f/hGi9VPvygBGOtWqiHZNJ311E4dTlxFvbbvkNwhYSaBgZuGVx xtDJxShZ0tUT8YNrVLOWMjKy/lzCxaDqVB9ZWkw/H5jz2DX3zPZ5r1QRL2otiuqQK7b7 /uZoZ09aVjcs5EbdvBtGrmc5fDbA6a4ELrlcSB9pPh29ot9uWVsrA2qpI+/0IPh9H6ki lJOafk3b43y09MgsEnGvgNxrFKZD0Z2oyJN+ZUkByO46cZzVNLuJ68AECPB6W43OLiuR ycozCXqJEHi6YLnu+CT4vYyuUnkljxpmaXUIuwA0qAwhJ5jLDBa31+GYoPHm0zYPbpgg 3X/A== X-Gm-Message-State: AO0yUKV6bVQnz0FqzPVBzTCOWryGvG6felGad9wow8EjMJvj2B6J1LZK v7SMsHT+yAl7qTm5I8MvTVfM0QP558hRVOKAXV65rjHSWQ1meNQtDAmYpD318YO9KFBUcjwN1Fl DSQmUGUwx7dKvRt8ADsPqHpBsjGEVf+SgGdoyQsXWtI0faYDXq/TNc2bmCOnORLgEclBVrKig9r 0= X-Received: by 2002:a05:600c:18a3:b0:3eb:2da4:efe7 with SMTP id x35-20020a05600c18a300b003eb2da4efe7mr7512824wmp.11.1677760261542; Thu, 02 Mar 2023 04:31:01 -0800 (PST) X-Google-Smtp-Source: AK7set8tSSHVyulDNyPXbWqsypGsQbrlQFPAfYe9Db3OA+mgI/Q17WPU+jQ+jrpqHFWoKUqRVJacWA== X-Received: by 2002:a05:600c:18a3:b0:3eb:2da4:efe7 with SMTP id x35-20020a05600c18a300b003eb2da4efe7mr7512810wmp.11.1677760261244; Thu, 02 Mar 2023 04:31:01 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 09/62] i386/xen: handle guest hypercalls Date: Thu, 2 Mar 2023 13:29:36 +0100 Message-Id: <20230302123029.153265-10-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760326876100001 Content-Type: text/plain; charset="utf-8" From: Joao Martins This means handling the new exit reason for Xen but still crashing on purpose. As we implement each of the hypercalls we will then return the right return code. Signed-off-by: Joao Martins [dwmw2: Add CPL to hypercall tracing, disallow hypercalls from CPL > 0] Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/kvm.c | 5 ++++ target/i386/kvm/trace-events | 3 +++ target/i386/kvm/xen-emu.c | 44 ++++++++++++++++++++++++++++++++++++ target/i386/kvm/xen-emu.h | 1 + 4 files changed, 53 insertions(+) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index edcf8a2a65d5..f43e5531bf85 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -5493,6 +5493,11 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_ru= n *run) assert(run->msr.reason =3D=3D KVM_MSR_EXIT_REASON_FILTER); ret =3D kvm_handle_wrmsr(cpu, run); break; +#ifdef CONFIG_XEN_EMU + case KVM_EXIT_XEN: + ret =3D kvm_xen_handle_exit(cpu, &run->xen); + break; +#endif default: fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason); ret =3D -1; diff --git a/target/i386/kvm/trace-events b/target/i386/kvm/trace-events index 7c369db1e155..cd6f842b1fd1 100644 --- a/target/i386/kvm/trace-events +++ b/target/i386/kvm/trace-events @@ -5,3 +5,6 @@ kvm_x86_fixup_msi_error(uint32_t gsi) "VT-d failed to remap= interrupt for GSI %" kvm_x86_add_msi_route(int virq) "Adding route entry for virq %d" kvm_x86_remove_msi_route(int virq) "Removing route entry for virq %d" kvm_x86_update_msi_routes(int num) "Updated %d MSI routes" + +# xen-emu.c +kvm_xen_hypercall(int cpu, uint8_t cpl, uint64_t input, uint64_t a0, uint6= 4_t a1, uint64_t a2, uint64_t ret) "xen_hypercall: cpu %d cpl %d input %" P= RIu64 " a0 0x%" PRIx64 " a1 0x%" PRIx64 " a2 0x%" PRIx64" ret 0x%" PRIx64 diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 4883b95d9d47..476f464ee2f5 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -10,10 +10,12 @@ */ =20 #include "qemu/osdep.h" +#include "qemu/log.h" #include "sysemu/kvm_int.h" #include "sysemu/kvm_xen.h" #include "kvm/kvm_i386.h" #include "xen-emu.h" +#include "trace.h" =20 int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) { @@ -84,3 +86,45 @@ uint32_t kvm_xen_get_caps(void) { return kvm_state->xen_caps; } + +static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit) +{ + uint16_t code =3D exit->u.hcall.input; + + if (exit->u.hcall.cpl > 0) { + exit->u.hcall.result =3D -EPERM; + return true; + } + + switch (code) { + default: + return false; + } +} + +int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit) +{ + if (exit->type !=3D KVM_EXIT_XEN_HCALL) { + return -1; + } + + if (!do_kvm_xen_handle_exit(cpu, exit)) { + /* + * Some hypercalls will be deliberately "implemented" by returning + * -ENOSYS. This case is for hypercalls which are unexpected. + */ + exit->u.hcall.result =3D -ENOSYS; + qemu_log_mask(LOG_UNIMP, "Unimplemented Xen hypercall %" + PRId64 " (0x%" PRIx64 " 0x%" PRIx64 " 0x%" PRIx64 ")= \n", + (uint64_t)exit->u.hcall.input, + (uint64_t)exit->u.hcall.params[0], + (uint64_t)exit->u.hcall.params[1], + (uint64_t)exit->u.hcall.params[2]); + } + + trace_kvm_xen_hypercall(CPU(cpu)->cpu_index, exit->u.hcall.cpl, + exit->u.hcall.input, exit->u.hcall.params[0], + exit->u.hcall.params[1], exit->u.hcall.params[= 2], + exit->u.hcall.result); + return 0; +} diff --git a/target/i386/kvm/xen-emu.h b/target/i386/kvm/xen-emu.h index d62f1d8ed8fe..21faf6bf38fd 100644 --- a/target/i386/kvm/xen-emu.h +++ b/target/i386/kvm/xen-emu.h @@ -25,5 +25,6 @@ =20 int kvm_xen_init(KVMState *s, uint32_t hypercall_msr); int kvm_xen_init_vcpu(CPUState *cs); +int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit); =20 #endif /* QEMU_I386_KVM_XEN_EMU_H */ --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760671; cv=none; d=zohomail.com; s=zohoarc; b=KP1ymmAdj1e/8aWlENGJf775Eoz/FcwzJseEKo4jBaRFEWJbCHm0CttSMQ2bZ+uFb7XvfusXFks1DzSXy/l/gkTG+DMpIJCMCz/ajcNHfvWH3+m5A9udXLR/UwhFpqChUfUxjWWqOvNXd6NJiRO1+q/x4KKMaztQTYuVHSGDe2Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760671; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=XlnEbvCsN6pkO9Eg8RoXy0V0GFO9MzDFE4QeR7LRAi0=; b=Dzb7/O/xlqdmz0TfSetE2fYCOJmtdKX9adOE7EYaHDIY9011bMShyD9N5OfIHmcfeVy9rQhEr18dq2KzGUf+OzIkkclNVbbwhIeoJ+lBsW7IcCAxXbD44/jc/f8j8G/QWU2710kMlbyj9V9+LjRZhwFIvZJTzPSAj4+UDnIdcKo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760671761872.0386938650008; Thu, 2 Mar 2023 04:37:51 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5W-0007l5-6S; Thu, 02 Mar 2023 07:31:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5V-0007iH-6h for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5T-0002wH-D0 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:08 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-489-Ffkazk6nNpOUa3y1iAmd-g-1; Thu, 02 Mar 2023 07:31:05 -0500 Received: by mail-wm1-f72.google.com with SMTP id x18-20020a1c7c12000000b003e1e7d3cf9fso1203984wmc.3 for ; Thu, 02 Mar 2023 04:31:05 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id o11-20020a05600c4fcb00b003e8f0334db8sm3196694wmq.5.2023.03.02.04.31.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760266; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XlnEbvCsN6pkO9Eg8RoXy0V0GFO9MzDFE4QeR7LRAi0=; b=HzBGxyH/9yOvVOXHCnKNEsVky3shQt3lMnZz6Dl8sZUZCAhZvSb9o/rn2Fojz8ul/bFT/1 hG904TzKlsL22tlFqPLADiKQx0kekX9pk6y19DhRMBDV+nLcwI67YbDP1w2FCYxPgSswDh 27HUI4jevX5+M2j0y2jc+TO2j7HNnao= X-MC-Unique: Ffkazk6nNpOUa3y1iAmd-g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XlnEbvCsN6pkO9Eg8RoXy0V0GFO9MzDFE4QeR7LRAi0=; b=ckO+G/V/+fqApQYyQSNb+tQai0frXrF1T4spVhIgIhsryL7wmdH9NdrYI4Mao4dBQt 3n5LXJ4ZI9vILexLwBmmme5mGEvguRmt3sCZiqAgUN4CQBpbQJ4gGgOVMr4eGwrg/daG 21a7aoMk48e9DjHFKTs9N0l/ogEVLBb0lf2N+3RlLga+VpT2tMNU5bVk6mmp8n+0r48I 9bZoXaT65eaJpiEgYPTNPfS8y1p3TANa5T2kzy6LqQ+anGdkmEVJDyiWC8mXE8gPwECH XGYxjd3mKAh82fcKso4NGGdUzPtn2EDFvOQy2b20rrbVSOvRVxk10QxjWnLQr4UYDjyf H5UA== X-Gm-Message-State: AO0yUKUe2k8snk6AQQKnB0KMbfU27lAFucEZOGc3N7xmbu1doAgt1COd dNrl0psp39LZcD07FhBuR7z4nHGw1lOAxiP9ujT5YUfhk7OY1QghAarW5OTpfG5BHlM/j4P4Ssy CWR/XDq5D5b/wYOojqwwB3oVV/fyXMpY8s/BMYR5x9JKy9Af3gGNWyStY9KIsD/C7jpm/5MHtwr o= X-Received: by 2002:a05:600c:715:b0:3e8:f27b:a92c with SMTP id i21-20020a05600c071500b003e8f27ba92cmr7461300wmn.32.1677760264371; Thu, 02 Mar 2023 04:31:04 -0800 (PST) X-Google-Smtp-Source: AK7set89EXuSAlMReqK97CInpKFC9bBYjfqHlAtdcDMRFtqYpksGFgCmPR99kHxMTcNaWu1LbuYWXw== X-Received: by 2002:a05:600c:715:b0:3e8:f27b:a92c with SMTP id i21-20020a05600c071500b003e8f27ba92cmr7461286wmn.32.1677760264094; Thu, 02 Mar 2023 04:31:04 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 10/62] i386/xen: implement HYPERVISOR_xen_version Date: Thu, 2 Mar 2023 13:29:37 +0100 Message-Id: <20230302123029.153265-11-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760676387100003 Content-Type: text/plain; charset="utf-8" From: Joao Martins This is just meant to serve as an example on how we can implement hypercalls. xen_version specifically since Qemu does all kind of feature controllability. So handling that here seems appropriate. Signed-off-by: Joao Martins [dwmw2: Implement kvm_gva_rw() safely] Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/xen-emu.c | 86 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 476f464ee2f5..56b80a788049 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -14,9 +14,55 @@ #include "sysemu/kvm_int.h" #include "sysemu/kvm_xen.h" #include "kvm/kvm_i386.h" +#include "exec/address-spaces.h" #include "xen-emu.h" #include "trace.h" =20 +#include "hw/xen/interface/version.h" + +static int kvm_gva_rw(CPUState *cs, uint64_t gva, void *_buf, size_t sz, + bool is_write) +{ + uint8_t *buf =3D (uint8_t *)_buf; + int ret; + + while (sz) { + struct kvm_translation tr =3D { + .linear_address =3D gva, + }; + + size_t len =3D TARGET_PAGE_SIZE - (tr.linear_address & ~TARGET_PAG= E_MASK); + if (len > sz) { + len =3D sz; + } + + ret =3D kvm_vcpu_ioctl(cs, KVM_TRANSLATE, &tr); + if (ret || !tr.valid || (is_write && !tr.writeable)) { + return -EFAULT; + } + + cpu_physical_memory_rw(tr.physical_address, buf, len, is_write); + + buf +=3D len; + sz -=3D len; + gva +=3D len; + } + + return 0; +} + +static inline int kvm_copy_from_gva(CPUState *cs, uint64_t gva, void *buf, + size_t sz) +{ + return kvm_gva_rw(cs, gva, buf, sz, false); +} + +static inline int kvm_copy_to_gva(CPUState *cs, uint64_t gva, void *buf, + size_t sz) +{ + return kvm_gva_rw(cs, gva, buf, sz, true); +} + int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) { const int required_caps =3D KVM_XEN_HVM_CONFIG_HYPERCALL_MSR | @@ -87,6 +133,43 @@ uint32_t kvm_xen_get_caps(void) return kvm_state->xen_caps; } =20 +static bool kvm_xen_hcall_xen_version(struct kvm_xen_exit *exit, X86CPU *c= pu, + int cmd, uint64_t arg) +{ + int err =3D 0; + + switch (cmd) { + case XENVER_get_features: { + struct xen_feature_info fi; + + /* No need for 32/64 compat handling */ + qemu_build_assert(sizeof(fi) =3D=3D 8); + + err =3D kvm_copy_from_gva(CPU(cpu), arg, &fi, sizeof(fi)); + if (err) { + break; + } + + fi.submap =3D 0; + if (fi.submap_idx =3D=3D 0) { + fi.submap |=3D 1 << XENFEAT_writable_page_tables | + 1 << XENFEAT_writable_descriptor_tables | + 1 << XENFEAT_auto_translated_physmap | + 1 << XENFEAT_supervisor_mode_kernel; + } + + err =3D kvm_copy_to_gva(CPU(cpu), arg, &fi, sizeof(fi)); + break; + } + + default: + return false; + } + + exit->u.hcall.result =3D err; + return true; +} + static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit) { uint16_t code =3D exit->u.hcall.input; @@ -97,6 +180,9 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct k= vm_xen_exit *exit) } =20 switch (code) { + case __HYPERVISOR_xen_version: + return kvm_xen_hcall_xen_version(exit, cpu, exit->u.hcall.params[0= ], + exit->u.hcall.params[1]); default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760738; cv=none; d=zohomail.com; s=zohoarc; b=at+GxnFrL2l3pt6jD7A9E3kUbP3KqMugtm7ZN1dzS2flhmvUcnNvezF/Yxa0TIdvWHKbJjSkg6QHsvnV1dxLPfzXg7aDkzF5fLfpL5Z2OAH31diGWyCMt6SxZqGa14PGKmnIrZ9RysSND3i06DKqGPM7TXSMN+FX6Wm0jcmZd64= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760738; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=QDvVm3Zp0Blyv/xh76cOuTzSZ1sC6BxoIEb7/WoO+HE=; b=SILOm1xM6UhxFennk4O9EMTIaxgL0aBX1kTwoxL0aaSgU7N84T3KCC28szTqCysfU8HfWv+OLovnNOnwLg4Yv5Elfvgj2go5olbJp3YtJimRDOiAUpDhRX6WrEGjXXpV9eo+etz49I1G+t//F+c93XKB3JBeA7iKlrZWmOqJCEo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760738180439.9157952491478; Thu, 2 Mar 2023 04:38:58 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5Z-0007rK-Th; Thu, 02 Mar 2023 07:31:13 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5Y-0007nC-Gt for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:12 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5W-0002xD-Sh for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:12 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-9-5GuZvXp5Ng-B_J1Tb2uU9g-1; Thu, 02 Mar 2023 07:31:08 -0500 Received: by mail-wm1-f70.google.com with SMTP id l31-20020a05600c1d1f00b003e8626cdd42so5696906wms.3 for ; Thu, 02 Mar 2023 04:31:08 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id l15-20020a05600012cf00b002be505ab59asm15281167wrx.97.2023.03.02.04.31.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760270; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QDvVm3Zp0Blyv/xh76cOuTzSZ1sC6BxoIEb7/WoO+HE=; b=S3nhUTFshNPEvO0hQvEf19W2T4wjEzEPPUMhPF3tTgfCdtby5qR6JjUv7kw9MXv1JDx9lY +1vqmpv072Fw+Rj/4pWkaJbJs9+ePSMykVjgkDvNt+Az3Azq57etaU8G7RA/zuTNamlUjx qYJu1aEAsCnfQZLDM+r9m1rec/Gm5Wo= X-MC-Unique: 5GuZvXp5Ng-B_J1Tb2uU9g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QDvVm3Zp0Blyv/xh76cOuTzSZ1sC6BxoIEb7/WoO+HE=; b=ZyK6za17bJKbAUWroJFwcgWVJ9dYVyInXMYrSLAfYaLFQ+K0e171vkFHWPMoCjkNBt 2bCMl/4K+XHLo6cPUy4HOtYeLEXX3ffjBk49Agts3UvTS48EfmTlOR1yuCaa+MvXIuce Wj1X5wr7XVnR2OeHv9rEBsEQCbBumvMCWGpe3izs2iX/KZM3uP+/9trmem1F45cGuJZz dUsq6/0bahAs+TtGLqkJ9CF26deAnOIeFgjUKqbe6TbPPGhXUBmI6T1A707TY78hylJk 1LUHA6ch/FpUC4h6qjAbI2zz48AEm8HXydJpnTV1coRQhh5VdRie5UZS0aqIwXl0H1hv JsYw== X-Gm-Message-State: AO0yUKWHliEjV5lJpsf7XoIclBTkdK9JM5+kzlYpsrybl/XoqEyiqe5m gzvcbHESE/x1Im/q3oG7RfyE9OIMS7hdphhhbqwRuCNmdTPEV4awDFCksk+7syUU/+4czxHhOra F6fkXY3wybcYv7jHOgR6wpN+eCJ333xR9cCj2KKvIUTE8nBiatRVLrvoEbO9vXECYMmjVjPbrom U= X-Received: by 2002:a5d:5387:0:b0:2c7:cc8:782e with SMTP id d7-20020a5d5387000000b002c70cc8782emr1398679wrv.33.1677760267345; Thu, 02 Mar 2023 04:31:07 -0800 (PST) X-Google-Smtp-Source: AK7set8CcAXwzqw1ATFfBltKl5RSMI7DUoBaiAvReQtgaiNSn7/kC09l27h4BvkyRjVbMkAiY8bBjg== X-Received: by 2002:a5d:5387:0:b0:2c7:cc8:782e with SMTP id d7-20020a5d5387000000b002c70cc8782emr1398667wrv.33.1677760267106; Thu, 02 Mar 2023 04:31:07 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 11/62] i386/xen: implement HYPERVISOR_sched_op, SCHEDOP_shutdown Date: Thu, 2 Mar 2023 13:29:38 +0100 Message-Id: <20230302123029.153265-12-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760738393100001 Content-Type: text/plain; charset="utf-8" From: Joao Martins It allows to shutdown itself via hypercall with any of the 3 reasons: 1) self-reboot 2) shutdown 3) crash Implementing SCHEDOP_shutdown sub op let us handle crashes gracefully rather than leading to triple faults if it remains unimplemented. In addition, the SHUTDOWN_soft_reset reason is used for kexec, to reset Xen shared pages and other enlightenments and leave a clean slate for the new kernel without the hypervisor helpfully writing information at unexpected addresses. Signed-off-by: Joao Martins [dwmw2: Ditch sched_op_compat which was never available for HVM guests, Add SCHEDOP_soft_reset] Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- include/sysemu/kvm_xen.h | 1 + target/i386/kvm/trace-events | 1 + target/i386/kvm/xen-emu.c | 75 ++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h index 296533f2d558..5dffcc054294 100644 --- a/include/sysemu/kvm_xen.h +++ b/include/sysemu/kvm_xen.h @@ -12,6 +12,7 @@ #ifndef QEMU_SYSEMU_KVM_XEN_H #define QEMU_SYSEMU_KVM_XEN_H =20 +int kvm_xen_soft_reset(void); uint32_t kvm_xen_get_caps(void); =20 #define kvm_xen_has_cap(cap) (!!(kvm_xen_get_caps() & \ diff --git a/target/i386/kvm/trace-events b/target/i386/kvm/trace-events index cd6f842b1fd1..bb732e1da840 100644 --- a/target/i386/kvm/trace-events +++ b/target/i386/kvm/trace-events @@ -8,3 +8,4 @@ kvm_x86_update_msi_routes(int num) "Updated %d MSI routes" =20 # xen-emu.c kvm_xen_hypercall(int cpu, uint8_t cpl, uint64_t input, uint64_t a0, uint6= 4_t a1, uint64_t a2, uint64_t ret) "xen_hypercall: cpu %d cpl %d input %" P= RIu64 " a0 0x%" PRIx64 " a1 0x%" PRIx64 " a2 0x%" PRIx64" ret 0x%" PRIx64 +kvm_xen_soft_reset(void) "" diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 56b80a788049..4ed833656f72 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -11,14 +11,17 @@ =20 #include "qemu/osdep.h" #include "qemu/log.h" +#include "qemu/main-loop.h" #include "sysemu/kvm_int.h" #include "sysemu/kvm_xen.h" #include "kvm/kvm_i386.h" #include "exec/address-spaces.h" #include "xen-emu.h" #include "trace.h" +#include "sysemu/runstate.h" =20 #include "hw/xen/interface/version.h" +#include "hw/xen/interface/sched.h" =20 static int kvm_gva_rw(CPUState *cs, uint64_t gva, void *_buf, size_t sz, bool is_write) @@ -170,6 +173,75 @@ static bool kvm_xen_hcall_xen_version(struct kvm_xen_e= xit *exit, X86CPU *cpu, return true; } =20 +int kvm_xen_soft_reset(void) +{ + assert(qemu_mutex_iothread_locked()); + + trace_kvm_xen_soft_reset(); + + /* Nothing to reset... yet. */ + return 0; +} + +static int schedop_shutdown(CPUState *cs, uint64_t arg) +{ + struct sched_shutdown shutdown; + int ret =3D 0; + + /* No need for 32/64 compat handling */ + qemu_build_assert(sizeof(shutdown) =3D=3D 4); + + if (kvm_copy_from_gva(cs, arg, &shutdown, sizeof(shutdown))) { + return -EFAULT; + } + + switch (shutdown.reason) { + case SHUTDOWN_crash: + cpu_dump_state(cs, stderr, CPU_DUMP_CODE); + qemu_system_guest_panicked(NULL); + break; + + case SHUTDOWN_reboot: + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); + break; + + case SHUTDOWN_poweroff: + qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); + break; + + case SHUTDOWN_soft_reset: + qemu_mutex_lock_iothread(); + ret =3D kvm_xen_soft_reset(); + qemu_mutex_unlock_iothread(); + break; + + default: + ret =3D -EINVAL; + break; + } + + return ret; +} + +static bool kvm_xen_hcall_sched_op(struct kvm_xen_exit *exit, X86CPU *cpu, + int cmd, uint64_t arg) +{ + CPUState *cs =3D CPU(cpu); + int err =3D -ENOSYS; + + switch (cmd) { + case SCHEDOP_shutdown: + err =3D schedop_shutdown(cs, arg); + break; + + default: + return false; + } + + exit->u.hcall.result =3D err; + return true; +} + static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit) { uint16_t code =3D exit->u.hcall.input; @@ -180,6 +252,9 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct = kvm_xen_exit *exit) } =20 switch (code) { + case __HYPERVISOR_sched_op: + return kvm_xen_hcall_sched_op(exit, cpu, exit->u.hcall.params[0], + exit->u.hcall.params[1]); case __HYPERVISOR_xen_version: return kvm_xen_hcall_xen_version(exit, cpu, exit->u.hcall.params[0= ], exit->u.hcall.params[1]); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761718; cv=none; d=zohomail.com; s=zohoarc; b=ZDnZDdmfNOCRwjjs6ei8ze98IwBFr1dnZUnBGK5WM3VIxll6G1WNWQfvzjiC/mklND2w8O3zK2jYjdqtNn7QDld3l7tCftBkKpDAXrkTO9BuTiZIAs8aIonu6oRAb2r4PRc0pl1ORbnBEdW9vNZhA/NzuX32SqsiZ9Pxwia3sYs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761718; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=2V8yBCF0T4rv186tkKjyMb8e50BMBvmVMlFILdIz+H0=; b=Lc6NQPd6M6ac/SZ3CYHEFYfUQCj3WSjDIPVU8aPgw95qaGgSxwlhYLIFnnt2U6VkMPfOLhEcV9hpBzdc4yksdbSTHULJyFai4Kbb7WQiAefmNwlAIewrntz8iyMYO3unt9FbLEhzYLxlMkoyMFNqW89mNUkN4Rhm4XSj+gHhFuc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761718199859.4531840907641; Thu, 2 Mar 2023 04:55:18 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5d-00084q-2A; Thu, 02 Mar 2023 07:31:17 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5b-0007yr-LA for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:15 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5a-0002xf-83 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:15 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-595-gJ-f6NxUObucwKXwlw5NGQ-1; Thu, 02 Mar 2023 07:31:11 -0500 Received: by mail-wm1-f70.google.com with SMTP id l31-20020a05600c1d1f00b003e8626cdd42so5696963wms.3 for ; Thu, 02 Mar 2023 04:31:11 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id q11-20020a05600c46cb00b003dc1d668866sm3139050wmo.10.2023.03.02.04.31.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760273; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2V8yBCF0T4rv186tkKjyMb8e50BMBvmVMlFILdIz+H0=; b=BCSTLBPOe8cMyOY+2+ilB2fRs8UuWbVW6WCIPm+AWmyhQQsKKGz7t4UnVWcbvFvADvtJFl nMh8/UMhVJ6UFB3LLBiJ69GJlANwctrjRQartNBGsv1lE3Nan3EObvL8HDFLtqp61/0fea eR8O0Nk6DVEHBbWqdw1Rubp6IfYAPns= X-MC-Unique: gJ-f6NxUObucwKXwlw5NGQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2V8yBCF0T4rv186tkKjyMb8e50BMBvmVMlFILdIz+H0=; b=dCrS6Aob6pjskgQUB3pqx1dgCwkyXNiWt55w0cUm2o8t0sfK70Y8O2te0RRjJZ3mTn pPSglzCUDhWS9m2o2vMKgOqk52tBsqglLRSKa074AwL6Al5Dfy24RFzKLtlyU7SHMaCA b/KST2639EE8Of0M2l/XbUd9lFlBE7BEIO/C2zyB/dRbcAdZ2h3/WfhUf8VADDIK19XJ 1DJ4y45xQI6p5dCrYw8IppKPqP6doVhkuimOi4qkKg7OhzgWrR2b7SrrJNOB9R+QFi/r vDOml3E4szNexWlldTpMNEEUkFcQMbh5+81hkzu5Mt89rw4yvcV8uGMrG6xTBtm36+B0 CNiA== X-Gm-Message-State: AO0yUKVRdg327FBAOdzB52W/sJzpwMW1Fdl9dNDPeHk2L4FIYoVIizBA //Yu5BGpYYtHLMm0F8dSQJMykzKA7gbN8A0j40umdsFDKggpBlzXY6y+xbGtVHSZTu6j/w+Wq29 1YIFODaEqHF5dlPhcONQUD2qfNwF+wCdXzvkvOimdZ5RtmWYixM7GGaOj2bFhJ2eG4lNn6YJqeg w= X-Received: by 2002:a05:600c:5389:b0:3e2:dba:7155 with SMTP id hg9-20020a05600c538900b003e20dba7155mr7497627wmb.20.1677760270386; Thu, 02 Mar 2023 04:31:10 -0800 (PST) X-Google-Smtp-Source: AK7set++oaMcEDCaeHmK6MLEhwnmvYtirJGv5VtHS/X9NW79EMMehcEhYgy9ZK7DxCbNOSpDpPxR/w== X-Received: by 2002:a05:600c:5389:b0:3e2:dba:7155 with SMTP id hg9-20020a05600c538900b003e20dba7155mr7497607wmb.20.1677760270029; Thu, 02 Mar 2023 04:31:10 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 12/62] i386/xen: Implement SCHEDOP_poll and SCHEDOP_yield Date: Thu, 2 Mar 2023 13:29:39 +0100 Message-Id: <20230302123029.153265-13-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761719435100003 Content-Type: text/plain; charset="utf-8" From: David Woodhouse They both do the same thing and just call sched_yield. This is enough to stop the Linux guest panicking when running on a host kernel which doesn't intercept SCHEDOP_poll and lets it reach userspace. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/xen-emu.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 4ed833656f72..ebea27caf634 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -234,6 +234,19 @@ static bool kvm_xen_hcall_sched_op(struct kvm_xen_exit= *exit, X86CPU *cpu, err =3D schedop_shutdown(cs, arg); break; =20 + case SCHEDOP_poll: + /* + * Linux will panic if this doesn't work. Just yield; it's not + * worth overthinking it because with event channel handling + * in KVM, the kernel will intercept this and it will never + * reach QEMU anyway. The semantics of the hypercall explicltly + * permit spurious wakeups. + */ + case SCHEDOP_yield: + sched_yield(); + err =3D 0; + break; + default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760308; cv=none; d=zohomail.com; s=zohoarc; b=QklImDSdwr44y4weYLBswX95qBfdKVfLa4uwNO7c+he55gXR63vCYR2hxyJ8lJgx3VCq89YyqZjQu/9o3mIHWOoe4q+PWdgKAdvghw4akmPPqcBHH+1weC+qZ3p4VjfanJJAE7jpOSWwufV3TDLbG3Gw4laZSn7ZmrvJ8N4KGf8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760308; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=WpMS7axuaDOJ8CmMkcoIKvn8UcONkTvOkLwLUqgv3+8=; b=U/lntxWmUegUEeLRx48XRTsPndGnMY3olYwBzRDNtEpm+LE3I9m4clYEvlRGthneFzou9gA5ckkxS6q1aKpihjZuYhaOIU+xmPIN+lOVN2BcQpJYfZfJ24lPc0ky19S+/cTcM2T/WR5zjdh7KHH4B9vvPz830eAMzoBcjbkdP5o= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 167776030802157.940185583205334; Thu, 2 Mar 2023 04:31:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5h-00006I-OV; Thu, 02 Mar 2023 07:31:22 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5e-0008Fa-N9 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:18 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5c-0002y8-Oz for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:18 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-146-1P5tOAA0MX-7R-x_cgyV8Q-1; Thu, 02 Mar 2023 07:31:14 -0500 Received: by mail-wm1-f72.google.com with SMTP id 4-20020a05600c024400b003eb2e295c05so5711834wmj.0 for ; Thu, 02 Mar 2023 04:31:14 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id t5-20020a5d6a45000000b002c5706f7c6dsm15172587wrw.94.2023.03.02.04.31.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760276; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WpMS7axuaDOJ8CmMkcoIKvn8UcONkTvOkLwLUqgv3+8=; b=OhDcW+n1Nf4r/gkW7sPcWWVbs59+rHaWmaT8zfjeo8TZLQXDW/uDTZ/j5XTRGleaH+9I3j vJt4ofgAPzkTzBjpCqzy9aOoGiQsWo3U8W8WU6ZWK0qn29wSGzq8MYsqZ6+a+YMWBAgVIT hRNU4AIvwF2wd8lnM8fSDCe8bxvsPk0= X-MC-Unique: 1P5tOAA0MX-7R-x_cgyV8Q-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WpMS7axuaDOJ8CmMkcoIKvn8UcONkTvOkLwLUqgv3+8=; b=Z1Jfoi9GvrYt6UAUNXvPtKIvPxRXD60QCy/QeWi+1Owfy9rl7VDxrlfxItKTq+0BWV Yxwg+TZ+vXSCE6fi2ezV53trZiKpoatQc7DJp+wwYPpk0b72qmixDI2q8ZfpG+UQEGEr rTDIocwK4VtoC0GMbOkXwaFKaAQW81su9xNUNO3kwPSSvTNP19pG/sW+gQBr4n1Xj2kr H3HpR2zYJp6un3EBTQbU7TSK45vnslNFDuu+7YuxVcZnpXnrWZ3/T/hqijzCmfX1TX8f A4HWNLMj/UD+IBPurWkSN8Vj79JinEHssCa78njGSwGmhnqjQJEe836zE1RsdtU7hDWI ZEhA== X-Gm-Message-State: AO0yUKXAdKpdSlVbRwGNh46y/JuLyHtLs8v40FqFymmqjpgxGCkF0i4k fOheK2G8E8+C5YfMFndPNMVgO/ijWqh170g5oEVqsQFan7ejKF1GRRoBU4YDpN5kklOPY1SfmYb xdFD6u2970T0b9luwztB6u2m58IpTtIUSrvlBGNZmIvG8xtsqbBSNZdM9h8OBONmPq3jYlxqPPl s= X-Received: by 2002:adf:cd11:0:b0:2ca:e856:59d with SMTP id w17-20020adfcd11000000b002cae856059dmr1688427wrm.1.1677760273103; Thu, 02 Mar 2023 04:31:13 -0800 (PST) X-Google-Smtp-Source: AK7set/PaMlIX5XUrtzDpmo7IiooW7AU3HsJD7v6LOmQ/USyfNVPybuNqSh7zOPgnfGzpUyHtgUEFw== X-Received: by 2002:adf:cd11:0:b0:2ca:e856:59d with SMTP id w17-20020adfcd11000000b002cae856059dmr1688407wrm.1.1677760272719; Thu, 02 Mar 2023 04:31:12 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 13/62] hw/xen: Add xen_overlay device for emulating shared xenheap pages Date: Thu, 2 Mar 2023 13:29:40 +0100 Message-Id: <20230302123029.153265-14-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760308836100001 From: David Woodhouse For the shared info page and for grant tables, Xen shares its own pages from the "Xen heap" to the guest. The guest requests that a given page from a certain address space (XENMAPSPACE_shared_info, etc.) be mapped to a given GPA using the XENMEM_add_to_physmap hypercall. To support that in qemu when *emulating* Xen, create a memory region (migratable) and allow it to be mapped as an overlay when requested. Xen theoretically allows the same page to be mapped multiple times into the guest, but that's hard to track and reinstate over migration, so we automatically *unmap* any previous mapping when creating a new one. This approach has been used in production with.... a non-trivial number of guests expecting true Xen, without any problems yet being noticed. This adds just the shared info page for now. The grant tables will be a larger region, and will need to be overlaid one page at a time. I think that means I need to create separate aliases for each page of the overall grant_frames region, so that they can be mapped individually. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/meson.build | 1 + hw/i386/kvm/xen_overlay.c | 210 ++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_overlay.h | 20 ++++ include/sysemu/kvm_xen.h | 7 ++ 4 files changed, 238 insertions(+) create mode 100644 hw/i386/kvm/xen_overlay.c create mode 100644 hw/i386/kvm/xen_overlay.h diff --git a/hw/i386/kvm/meson.build b/hw/i386/kvm/meson.build index 95467f1ded6a..6165cbf019d6 100644 --- a/hw/i386/kvm/meson.build +++ b/hw/i386/kvm/meson.build @@ -4,5 +4,6 @@ i386_kvm_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c= ')) i386_kvm_ss.add(when: 'CONFIG_I8254', if_true: files('i8254.c')) i386_kvm_ss.add(when: 'CONFIG_I8259', if_true: files('i8259.c')) i386_kvm_ss.add(when: 'CONFIG_IOAPIC', if_true: files('ioapic.c')) +i386_kvm_ss.add(when: 'CONFIG_XEN_EMU', if_true: files('xen_overlay.c')) =20 i386_ss.add_all(when: 'CONFIG_KVM', if_true: i386_kvm_ss) diff --git a/hw/i386/kvm/xen_overlay.c b/hw/i386/kvm/xen_overlay.c new file mode 100644 index 000000000000..a2441e2b4e4a --- /dev/null +++ b/hw/i386/kvm/xen_overlay.c @@ -0,0 +1,210 @@ +/* + * QEMU Xen emulation: Shared/overlay pages support + * + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: David Woodhouse + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/host-utils.h" +#include "qemu/module.h" +#include "qemu/main-loop.h" +#include "qapi/error.h" +#include "qom/object.h" +#include "exec/target_page.h" +#include "exec/address-spaces.h" +#include "migration/vmstate.h" + +#include "hw/sysbus.h" +#include "hw/xen/xen.h" +#include "xen_overlay.h" + +#include "sysemu/kvm.h" +#include "sysemu/kvm_xen.h" +#include + +#include "hw/xen/interface/memory.h" + + +#define TYPE_XEN_OVERLAY "xen-overlay" +OBJECT_DECLARE_SIMPLE_TYPE(XenOverlayState, XEN_OVERLAY) + +#define XEN_PAGE_SHIFT 12 +#define XEN_PAGE_SIZE (1ULL << XEN_PAGE_SHIFT) + +struct XenOverlayState { + /*< private >*/ + SysBusDevice busdev; + /*< public >*/ + + MemoryRegion shinfo_mem; + void *shinfo_ptr; + uint64_t shinfo_gpa; +}; + +struct XenOverlayState *xen_overlay_singleton; + +static void xen_overlay_do_map_page(MemoryRegion *page, uint64_t gpa) +{ + /* + * Xen allows guests to map the same page as many times as it likes + * into guest physical frames. We don't, because it would be hard + * to track and restore them all. One mapping of each page is + * perfectly sufficient for all known guests... and we've tested + * that theory on a few now in other implementations. dwmw2. + */ + if (memory_region_is_mapped(page)) { + if (gpa =3D=3D INVALID_GPA) { + memory_region_del_subregion(get_system_memory(), page); + } else { + /* Just move it */ + memory_region_set_address(page, gpa); + } + } else if (gpa !=3D INVALID_GPA) { + memory_region_add_subregion_overlap(get_system_memory(), gpa, page= , 0); + } +} + +/* KVM is the only existing back end for now. Let's not overengineer it ye= t. */ +static int xen_overlay_set_be_shinfo(uint64_t gfn) +{ + struct kvm_xen_hvm_attr xa =3D { + .type =3D KVM_XEN_ATTR_TYPE_SHARED_INFO, + .u.shared_info.gfn =3D gfn, + }; + + return kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_SET_ATTR, &xa); +} + + +static void xen_overlay_realize(DeviceState *dev, Error **errp) +{ + XenOverlayState *s =3D XEN_OVERLAY(dev); + + if (xen_mode !=3D XEN_EMULATE) { + error_setg(errp, "Xen overlay page support is for Xen emulation"); + return; + } + + memory_region_init_ram(&s->shinfo_mem, OBJECT(dev), "xen:shared_info", + XEN_PAGE_SIZE, &error_abort); + memory_region_set_enabled(&s->shinfo_mem, true); + + s->shinfo_ptr =3D memory_region_get_ram_ptr(&s->shinfo_mem); + s->shinfo_gpa =3D INVALID_GPA; + memset(s->shinfo_ptr, 0, XEN_PAGE_SIZE); +} + +static int xen_overlay_post_load(void *opaque, int version_id) +{ + XenOverlayState *s =3D opaque; + + if (s->shinfo_gpa !=3D INVALID_GPA) { + xen_overlay_do_map_page(&s->shinfo_mem, s->shinfo_gpa); + xen_overlay_set_be_shinfo(s->shinfo_gpa >> XEN_PAGE_SHIFT); + } + + return 0; +} + +static bool xen_overlay_is_needed(void *opaque) +{ + return xen_mode =3D=3D XEN_EMULATE; +} + +static const VMStateDescription xen_overlay_vmstate =3D { + .name =3D "xen_overlay", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D xen_overlay_is_needed, + .post_load =3D xen_overlay_post_load, + .fields =3D (VMStateField[]) { + VMSTATE_UINT64(shinfo_gpa, XenOverlayState), + VMSTATE_END_OF_LIST() + } +}; + +static void xen_overlay_reset(DeviceState *dev) +{ + kvm_xen_soft_reset(); +} + +static void xen_overlay_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->reset =3D xen_overlay_reset; + dc->realize =3D xen_overlay_realize; + dc->vmsd =3D &xen_overlay_vmstate; +} + +static const TypeInfo xen_overlay_info =3D { + .name =3D TYPE_XEN_OVERLAY, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(XenOverlayState), + .class_init =3D xen_overlay_class_init, +}; + +void xen_overlay_create(void) +{ + xen_overlay_singleton =3D XEN_OVERLAY(sysbus_create_simple(TYPE_XEN_OV= ERLAY, + -1, NULL)); + + /* If xen_domid wasn't explicitly set, at least make sure it isn't zer= o. */ + if (xen_domid =3D=3D DOMID_QEMU) { + xen_domid =3D 1; + }; +} + +static void xen_overlay_register_types(void) +{ + type_register_static(&xen_overlay_info); +} + +type_init(xen_overlay_register_types) + +int xen_overlay_map_shinfo_page(uint64_t gpa) +{ + XenOverlayState *s =3D xen_overlay_singleton; + int ret; + + if (!s) { + return -ENOENT; + } + + assert(qemu_mutex_iothread_locked()); + + if (s->shinfo_gpa) { + /* If removing shinfo page, turn the kernel magic off first */ + ret =3D xen_overlay_set_be_shinfo(INVALID_GFN); + if (ret) { + return ret; + } + } + + xen_overlay_do_map_page(&s->shinfo_mem, gpa); + if (gpa !=3D INVALID_GPA) { + ret =3D xen_overlay_set_be_shinfo(gpa >> XEN_PAGE_SHIFT); + if (ret) { + return ret; + } + } + s->shinfo_gpa =3D gpa; + + return 0; +} + +void *xen_overlay_get_shinfo_ptr(void) +{ + XenOverlayState *s =3D xen_overlay_singleton; + + if (!s) { + return NULL; + } + + return s->shinfo_ptr; +} diff --git a/hw/i386/kvm/xen_overlay.h b/hw/i386/kvm/xen_overlay.h new file mode 100644 index 000000000000..00cff05bb0fd --- /dev/null +++ b/hw/i386/kvm/xen_overlay.h @@ -0,0 +1,20 @@ +/* + * QEMU Xen emulation: Shared/overlay pages support + * + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: David Woodhouse + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#ifndef QEMU_XEN_OVERLAY_H +#define QEMU_XEN_OVERLAY_H + +void xen_overlay_create(void); + +int xen_overlay_map_shinfo_page(uint64_t gpa); +void *xen_overlay_get_shinfo_ptr(void); + +#endif /* QEMU_XEN_OVERLAY_H */ diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h index 5dffcc054294..cec21c8fab2f 100644 --- a/include/sysemu/kvm_xen.h +++ b/include/sysemu/kvm_xen.h @@ -12,6 +12,13 @@ #ifndef QEMU_SYSEMU_KVM_XEN_H #define QEMU_SYSEMU_KVM_XEN_H =20 +/* The KVM API uses these to indicate "no GPA" or "no GFN" */ +#define INVALID_GPA UINT64_MAX +#define INVALID_GFN UINT64_MAX + +/* QEMU plays the r=C3=B4le of dom0 for "interdomain" communication. */ +#define DOMID_QEMU 0 + int kvm_xen_soft_reset(void); uint32_t kvm_xen_get_caps(void); =20 --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761305; cv=none; d=zohomail.com; s=zohoarc; b=mm3OtCo4CyIOaa/E1nvE8jqDMJtSh1OYKMr8T/b2mqbyHe9elOEl8IBNvaVh7hYyeIXsl14h+OW71vbrek0X6afN5Co812B0XaahpTrH0fIaaaf/nNPpcqyajrocGo0vBrJNPeJLMp5KXpelHifbFvk7IGWinV6dzvURRUj46k0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761305; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=tgf+uMU2b9ZGpqtYhVOqgBkf7+x3yyyGYI5pzjSgyMI=; b=BVdj3dQYjJqjYI9QhfetYS8a/t4A4DYfpZGCMXntGzPkkuMJdAJscQ3sMl7rdxyT4rZWiau4+LyJc25lbkeNvv0ScIzIeq3fLrhtSGM8wOeiGO9WJMh3DoJBEgLIaslI6bB4GsLhRZJ3QzM0c/dZSHGq4XwX9QJmMW062XkjtK8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761305731672.1296004549213; Thu, 2 Mar 2023 04:48:25 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6B-0000uy-QT; Thu, 02 Mar 2023 07:31:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5q-0000SA-9i for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:32 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5m-000301-Q2 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:29 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-439-VJ75y--HOlScKcFfAWLFEA-1; Thu, 02 Mar 2023 07:31:17 -0500 Received: by mail-wr1-f70.google.com with SMTP id u5-20020a5d6da5000000b002cd82373455so2075545wrs.9 for ; Thu, 02 Mar 2023 04:31:17 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id k10-20020adfd84a000000b002c55551e6e9sm15385334wrl.108.2023.03.02.04.31.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760285; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tgf+uMU2b9ZGpqtYhVOqgBkf7+x3yyyGYI5pzjSgyMI=; b=PnFoa/fkgAQ4/AmlVecx+3/edrv/z7QqVh7nFHMnbkM9bHl8w9NfITAe2k54vifamXB72P djj3oTNi1O57ffE9fo9VtpUJFeXPQ9kmKPVBq+imptcQ/4WBbP/POBEg0VyX3h9b34oKdf DSjYa6RmB1Oi947T1Ih5k5ATTS4tGrk= X-MC-Unique: VJ75y--HOlScKcFfAWLFEA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tgf+uMU2b9ZGpqtYhVOqgBkf7+x3yyyGYI5pzjSgyMI=; b=xtRouBqlOHwR8eGbp4S2Vu7E6ddGHHAKRf9it57YNUOKK+GTnz0CFcaKRePGM9yfqf h5jRlvSSE89dQrSewMxAUZplXm+8RppT8kFVlEHzpoOrMYgaZgQr3EAFR7tidRZg7g+J 1x86MG8gISYAXemDZzRDP2l8WqvTmJK3IrNVjO3ECNDBOkE2kZfP3qTuZaTzv1jALhfH JuMBZdgSlcN2GNz0xIEoRKFfK0eJOzNBIZejfnZKUijTOoImLQjXVbXyb+/k77G+P2Hy YLvy9esEMu6/JjYtCox4NpZYnlACtjJihmUICavc9XdNcRXA15aZLpjUQCSojqmBi5AW 3ZsA== X-Gm-Message-State: AO0yUKX9Gwe9cxzRWZFPBNkEGT7wLj/Al+vwqniSyHHlqmHovGsS8Ct/ rivSQ1zjqPBS+gdqU9+hbjPny3Cb7vn7LQCfCrYsXqlDx8S3yzqoN97Hfv8R1M1SnjH6JnE07g7 kznyZ0dWHxiOPLs98VX+5C+Lgh4rAJ8+oRDAUvdAVziOGy1cfLY9KUhXzQiQei85dc/JOx6frLA w= X-Received: by 2002:a05:600c:1c9b:b0:3df:e6bb:768 with SMTP id k27-20020a05600c1c9b00b003dfe6bb0768mr7782948wms.24.1677760275666; Thu, 02 Mar 2023 04:31:15 -0800 (PST) X-Google-Smtp-Source: AK7set+reE0MOKsjRX8UECtmv1v4z0+PphJ+coFO+5Kep4sjxNBd6gGXJnuLwy0uy4B4Le3zDj7wBw== X-Received: by 2002:a05:600c:1c9b:b0:3df:e6bb:768 with SMTP id k27-20020a05600c1c9b00b003dfe6bb0768mr7782938wms.24.1677760275446; Thu, 02 Mar 2023 04:31:15 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Paul Durrant , David Wooodhouse Subject: [PULL 14/62] xen: Permit --xen-domid argument when accel is KVM Date: Thu, 2 Mar 2023 13:29:41 +0100 Message-Id: <20230302123029.153265-15-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761307840100003 Content-Type: text/plain; charset="utf-8" From: Paul Durrant Signed-off-by: Paul Durrant Signed-off-by: David Wooodhouse --- softmmu/vl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/softmmu/vl.c b/softmmu/vl.c index cebe8d9452d6..3340f63c3764 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -3360,7 +3360,7 @@ void qemu_init(int argc, char **argv) has_defaults =3D 0; break; case QEMU_OPTION_xen_domid: - if (!(accel_find("xen"))) { + if (!(accel_find("xen")) && !(accel_find("kvm"))) { error_report("Option not supported for this target"); exit(1); } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760309; cv=none; d=zohomail.com; s=zohoarc; b=UR3rzVupLLUBwn8MerCkG8KvL34XWVOoADG4ZM+rH6cQppwv/IIbfZVF+OljRZUtjbbOh9v7rK2KkPvn7827cgz8aH/+vRtEF8W3fYcojAJkP6+Bq6/2ukyrgFKFbtGyHSAjuGsSYOHXA8MLaVaASa1viyuaKM1lqB1muNTwZ5s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760309; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=4nYdCu4pk04y4V7E/lWe9bJDwzN3jYmwwXeejjqIXt0=; b=nYDycht9Y8LZXxr9YX7iF7BGeGpONMY1FEVSd2OWSrA6/10pCDOYvZ8H39uPLnj7bi+bCcKyF53XpRdjnHM9bwZMPVy2Bkh6RQPozZ0tKe+04p9aRR/2zuUaZLHMn4HwLRTI7HRXvOSuKyyh5Uu4fjHAyqRA5YrCzrpZBhf4qYI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760309070399.3019028011048; Thu, 2 Mar 2023 04:31:49 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi5y-0000Sv-VX; Thu, 02 Mar 2023 07:31:42 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5j-0000Kf-Ik for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:24 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5i-0002z8-07 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:23 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-65-Q7wGXgL2NcGzBVpQJWyGRA-1; Thu, 02 Mar 2023 07:31:20 -0500 Received: by mail-wm1-f72.google.com with SMTP id 4-20020a05600c024400b003eb2e295c05so5711939wmj.0 for ; Thu, 02 Mar 2023 04:31:19 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id n37-20020a05600c3ba500b003e2052bad94sm3092228wms.33.2023.03.02.04.31.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760281; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4nYdCu4pk04y4V7E/lWe9bJDwzN3jYmwwXeejjqIXt0=; b=IibRa2YTlGJz1yjn58UW7epXQK7H/DTI7uO8wzbiTXRvy3FfNjw5FTaIR2k+bjSqAK6DOA sQnsI4ckseTkwVPyax9Tpgo0LNoP38ZBnIB0DVlJ8xN0OzwW3vTNPnk4LxUDxR0xmkrTcP lPUeQAdnw5/swqzL0Z5HBdUex8TCnbw= X-MC-Unique: Q7wGXgL2NcGzBVpQJWyGRA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4nYdCu4pk04y4V7E/lWe9bJDwzN3jYmwwXeejjqIXt0=; b=Iw1U40VOdWjo/NizzM7Qh9rmeRfRD/08fzM0nl4nvlYVl/1mEAMTlkYlznS5JvJY07 tSbi9Ve12KxwwiTujII0QmoU7GBeXAEXig/Yh8aaCiZSO0bKusim3p5YCBdd0szUKJFN TZ4fBMUtkaMOA+Ulxx6+AuD9F8RosUGcGD935xspvwl3bP9+CzGLLGKlEN6vpwESNjWV qOostN+R+Lvh/08nfE4+lQvQdrOknKc/QzzykS9ZY7Ef+Zu3Rir6eIqLkU/ugW8Cs67b 0ucHVqy0GlY3Tat9Vs/ZiAoAKvt5tVHBcIN56ygRFvSsCVF3MMhxJOmt1euA1lQbkAKQ B85g== X-Gm-Message-State: AO0yUKU1PWVjcXKTvku+pZnEhRCi4/iwljzfTXdjwNMfDEf6XZUspw3I dLPgkxMdfGcPrfqs/+kU3zKBWTEx60dbSxSDvI0zggzqGwOuLM5mHRxR++OtqcSADkeyP4/o2gs IBtVTcyInohX7CLAw6GVcZ3lqfp9UdbkeQviO6l6Vual/Nz/DNDvBnZAFWp44RJ45Vv8MmH2dup c= X-Received: by 2002:a05:600c:90a:b0:3eb:2b88:5af1 with SMTP id m10-20020a05600c090a00b003eb2b885af1mr7584152wmp.18.1677760278595; Thu, 02 Mar 2023 04:31:18 -0800 (PST) X-Google-Smtp-Source: AK7set9J3Gj1U0LBllZZcxuQeXmKDJdCjRS04qlkqKU4RyYVBdXyw1CiuZNSCRCLY9cidOxXohdkUg== X-Received: by 2002:a05:600c:90a:b0:3eb:2b88:5af1 with SMTP id m10-20020a05600c090a00b003eb2b885af1mr7584130wmp.18.1677760278271; Thu, 02 Mar 2023 04:31:18 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 15/62] i386/xen: add pc_machine_kvm_type to initialize XEN_EMULATE mode Date: Thu, 2 Mar 2023 13:29:42 +0100 Message-Id: <20230302123029.153265-16-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760310789100005 Content-Type: text/plain; charset="utf-8" From: David Woodhouse The xen_overlay device (and later similar devices for event channels and grant tables) need to be instantiated. Do this from a kvm_type method on the PC machine derivatives, since KVM is only way to support Xen emulation for now. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/pc.c | 11 +++++++++++ include/hw/i386/pc.h | 3 +++ 2 files changed, 14 insertions(+) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 992951c107bd..a316a01b1594 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -90,6 +90,7 @@ #include "hw/virtio/virtio-iommu.h" #include "hw/virtio/virtio-pmem-pci.h" #include "hw/virtio/virtio-mem-pci.h" +#include "hw/i386/kvm/xen_overlay.h" #include "hw/mem/memory-device.h" #include "sysemu/replay.h" #include "target/i386/cpu.h" @@ -1846,6 +1847,16 @@ static void pc_machine_initfn(Object *obj) cxl_machine_init(obj, &pcms->cxl_devices_state); } =20 +int pc_machine_kvm_type(MachineState *machine, const char *kvm_type) +{ +#ifdef CONFIG_XEN_EMU + if (xen_mode =3D=3D XEN_EMULATE) { + xen_overlay_create(); + } +#endif + return 0; +} + static void pc_machine_reset(MachineState *machine, ShutdownCause reason) { CPUState *cs; diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 66e3d059ef5a..467311007e06 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -291,12 +291,15 @@ extern const size_t pc_compat_1_5_len; extern GlobalProperty pc_compat_1_4[]; extern const size_t pc_compat_1_4_len; =20 +int pc_machine_kvm_type(MachineState *machine, const char *vm_type); + #define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \ static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *da= ta) \ { \ MachineClass *mc =3D MACHINE_CLASS(oc); \ optsfn(mc); \ mc->init =3D initfn; \ + mc->kvm_type =3D pc_machine_kvm_type; \ } \ static const TypeInfo pc_machine_type_##suffix =3D { \ .name =3D namestr TYPE_MACHINE_SUFFIX, \ --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760456; cv=none; d=zohomail.com; s=zohoarc; b=IRWKKR8Gviwfn4KGp2YKTxdHiiIzHJZfxMzkwCX2Oeks2JSGIOl6bYPeqeALqvMRurvB03gzZFTPWm5jeo3QQMClvbABbfADp+ZpW+WGVlYCxsIfuQz2Rvs2xUBfj+R5/7PJPPi/ZIJ2ZHHKKN+JXWziFzUe7SgoOLauTdoj9X4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760456; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Txe4M816XmIffZZqdC4SuhYSf44w2I/H7VuXLs++INg=; b=R3Z7/KfyhdjV/gXS10gqy7bEM1OGNei7t7z6zXsdQHLThIxcCmPKHoLs0WZEhjL24/ERcgo/AG1mCeHNj5asbOjlOXaktmn2V62m+nx0oH9HY0EllHLQOgVZ1NiSEJbxsOTVnBWpPMb828ESdiUbNeszGp3E4jpBc3/nCbamQS0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760456489286.222508610188; Thu, 2 Mar 2023 04:34:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6A-0000t3-9A; Thu, 02 Mar 2023 07:31:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5n-0000Pi-1a for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:29 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5k-0002zd-Q1 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:26 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-368-lHXiIVSlMhuIKwgdSjOLxQ-1; Thu, 02 Mar 2023 07:31:23 -0500 Received: by mail-wm1-f69.google.com with SMTP id bi27-20020a05600c3d9b00b003e9d0925341so5687407wmb.8 for ; Thu, 02 Mar 2023 04:31:23 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id r9-20020a05600c458900b003e1f6e18c95sm3130609wmo.21.2023.03.02.04.31.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760284; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Txe4M816XmIffZZqdC4SuhYSf44w2I/H7VuXLs++INg=; b=MQwrRSNxycXGl/l2Gost8oU+tiAO8D7VF9/t3D8ykobzYsqFbRq+f4R/GjBV3y7gz1uCbm YIzJLtO+LLnUfHNtsiMD50acdwQEME0jcrtoLNc0YTZKAJmYYSPO0dHjGo4mRCA0sl+iPA HoidRd3VOik9b/sKEEv3QCYC4Cx/1q4= X-MC-Unique: lHXiIVSlMhuIKwgdSjOLxQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Txe4M816XmIffZZqdC4SuhYSf44w2I/H7VuXLs++INg=; b=dgOlsyxzeV0o/TbAzMFMZyT0FmjO/Ux/l6FmfU9s7h3X/SH8XaKqxGus4r8ef7DgGG ao18krTzPYawIO9pj33XbOXb7Mn+HVDVQHUBz/tg+QksdfQ71Fso/brP9XuJKOC4A1uA ITLDXELr3FDXwHpoHueI9E3S1/F7LqvPgnMQZq1vIEwjwewBdkj0J1xDUoLuwgtjuQ5Q swIaDITsLF47OC0yNBWPrPGccZQbdbo02AfQq6pq1pvbM7tAS/JoIutlKE6FiqXBm/in VGChz2juiQUUBCjo3r2Bxo0YMQhVMUjPr6+HjgtH+JyZb6KnXKFOPGb8a2oopup0ztpV rxgw== X-Gm-Message-State: AO0yUKV5kgnOfXAHQPbLjhz5FX2dbbOqCQoFkhgT9OVsJX3DlnHB0IdT GdA2wJRhowzCg3RdWnUZ4zbcX49IBPG3qkXGGlhLr9pJVxurjOW7j1CzHXbRQnsDRFUr9Wx+eJ2 gx9eZql1eRuzNnR0iwHu2BJVKp8X2knm51lBljtFV5NgTRpw5AxIeRy6KpCH4kodiE/z+hOfptS s= X-Received: by 2002:a05:600c:3296:b0:3eb:3971:a2aa with SMTP id t22-20020a05600c329600b003eb3971a2aamr7690274wmp.25.1677760281544; Thu, 02 Mar 2023 04:31:21 -0800 (PST) X-Google-Smtp-Source: AK7set/iWNJLOkdhRh1QzfSonnaAOQU6Ei09zlAJDVPiXnggfAK2bi8LcHfGZkkcNs6L/vxok+/KCQ== X-Received: by 2002:a05:600c:3296:b0:3eb:3971:a2aa with SMTP id t22-20020a05600c329600b003eb3971a2aamr7690259wmp.25.1677760281301; Thu, 02 Mar 2023 04:31:21 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 16/62] i386/xen: manage and save/restore Xen guest long_mode setting Date: Thu, 2 Mar 2023 13:29:43 +0100 Message-Id: <20230302123029.153265-17-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760457962100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Xen will "latch" the guest's 32-bit or 64-bit ("long mode") setting when the guest writes the MSR to fill in the hypercall page, or when the guest sets the event channel callback in HVM_PARAM_CALLBACK_IRQ. KVM handles the former and sets the kernel's long_mode flag accordingly. The latter will be handled in userspace. Keep them in sync by noticing when a hypercall is made in a mode that doesn't match qemu's idea of the guest mode, and resyncing from the kernel. Do that same sync right before serialization too, in case the guest has set the hypercall page but hasn't yet made a system call. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_overlay.c | 62 +++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_overlay.h | 4 +++ target/i386/kvm/xen-emu.c | 12 ++++++++ 3 files changed, 78 insertions(+) diff --git a/hw/i386/kvm/xen_overlay.c b/hw/i386/kvm/xen_overlay.c index a2441e2b4e4a..8685d879594e 100644 --- a/hw/i386/kvm/xen_overlay.c +++ b/hw/i386/kvm/xen_overlay.c @@ -44,6 +44,7 @@ struct XenOverlayState { MemoryRegion shinfo_mem; void *shinfo_ptr; uint64_t shinfo_gpa; + bool long_mode; }; =20 struct XenOverlayState *xen_overlay_singleton; @@ -96,9 +97,21 @@ static void xen_overlay_realize(DeviceState *dev, Error = **errp) =20 s->shinfo_ptr =3D memory_region_get_ram_ptr(&s->shinfo_mem); s->shinfo_gpa =3D INVALID_GPA; + s->long_mode =3D false; memset(s->shinfo_ptr, 0, XEN_PAGE_SIZE); } =20 +static int xen_overlay_pre_save(void *opaque) +{ + /* + * Fetch the kernel's idea of long_mode to avoid the race condition + * where the guest has set the hypercall page up in 64-bit mode but + * not yet made a hypercall by the time migration happens, so qemu + * hasn't yet noticed. + */ + return xen_sync_long_mode(); +} + static int xen_overlay_post_load(void *opaque, int version_id) { XenOverlayState *s =3D opaque; @@ -107,6 +120,9 @@ static int xen_overlay_post_load(void *opaque, int vers= ion_id) xen_overlay_do_map_page(&s->shinfo_mem, s->shinfo_gpa); xen_overlay_set_be_shinfo(s->shinfo_gpa >> XEN_PAGE_SHIFT); } + if (s->long_mode) { + xen_set_long_mode(true); + } =20 return 0; } @@ -121,9 +137,11 @@ static const VMStateDescription xen_overlay_vmstate = =3D { .version_id =3D 1, .minimum_version_id =3D 1, .needed =3D xen_overlay_is_needed, + .pre_save =3D xen_overlay_pre_save, .post_load =3D xen_overlay_post_load, .fields =3D (VMStateField[]) { VMSTATE_UINT64(shinfo_gpa, XenOverlayState), + VMSTATE_BOOL(long_mode, XenOverlayState), VMSTATE_END_OF_LIST() } }; @@ -208,3 +226,47 @@ void *xen_overlay_get_shinfo_ptr(void) =20 return s->shinfo_ptr; } + +int xen_sync_long_mode(void) +{ + int ret; + struct kvm_xen_hvm_attr xa =3D { + .type =3D KVM_XEN_ATTR_TYPE_LONG_MODE, + }; + + if (!xen_overlay_singleton) { + return -ENOENT; + } + + ret =3D kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_GET_ATTR, &xa); + if (!ret) { + xen_overlay_singleton->long_mode =3D xa.u.long_mode; + } + + return ret; +} + +int xen_set_long_mode(bool long_mode) +{ + int ret; + struct kvm_xen_hvm_attr xa =3D { + .type =3D KVM_XEN_ATTR_TYPE_LONG_MODE, + .u.long_mode =3D long_mode, + }; + + if (!xen_overlay_singleton) { + return -ENOENT; + } + + ret =3D kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_SET_ATTR, &xa); + if (!ret) { + xen_overlay_singleton->long_mode =3D xa.u.long_mode; + } + + return ret; +} + +bool xen_is_long_mode(void) +{ + return xen_overlay_singleton && xen_overlay_singleton->long_mode; +} diff --git a/hw/i386/kvm/xen_overlay.h b/hw/i386/kvm/xen_overlay.h index 00cff05bb0fd..5c46a0b03659 100644 --- a/hw/i386/kvm/xen_overlay.h +++ b/hw/i386/kvm/xen_overlay.h @@ -17,4 +17,8 @@ void xen_overlay_create(void); int xen_overlay_map_shinfo_page(uint64_t gpa); void *xen_overlay_get_shinfo_ptr(void); =20 +int xen_sync_long_mode(void); +int xen_set_long_mode(bool long_mode); +bool xen_is_long_mode(void); + #endif /* QEMU_XEN_OVERLAY_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index ebea27caf634..be6d85f2cb7b 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -20,6 +20,8 @@ #include "trace.h" #include "sysemu/runstate.h" =20 +#include "hw/i386/kvm/xen_overlay.h" + #include "hw/xen/interface/version.h" #include "hw/xen/interface/sched.h" =20 @@ -282,6 +284,16 @@ int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_ex= it *exit) return -1; } =20 + /* + * The kernel latches the guest 32/64 mode when the MSR is used to fill + * the hypercall page. So if we see a hypercall in a mode that doesn't + * match our own idea of the guest mode, fetch the kernel's idea of the + * "long mode" to remain in sync. + */ + if (exit->u.hcall.longmode !=3D xen_is_long_mode()) { + xen_sync_long_mode(); + } + if (!do_kvm_xen_handle_exit(cpu, exit)) { /* * Some hypercalls will be deliberately "implemented" by returning --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761594; cv=none; d=zohomail.com; s=zohoarc; b=V0BUDFVjGa/3DWW0Zl4orbkfO7ubXdzcnhoOa0FbuHIg3M1N5u4gOnHiBbzK/qAAWA1N0Gd3iqOhYPmbdTzCYWaJOyCgjBfmmCnQ1ZjsryEio2cWjiR+JfRhH0+8Gpr39QSZbs1w4Nn31tmsO0hH8z0OyxNAQPioELVXen/4W9A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761594; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=d1R/PN9dy7cWY6GbtHCFwrHnFZMQnaaGhFqfVwG1ke8=; b=Bg4wXJLH/oP640wsZG3vXHiUt+q3lnFrGgj1+vmul55nmK7gWA0W7up2oX1W+KP4VdNbmd8idPbFkyo1eNIknMhezNTE3/KTvjNUtE+nZja5uv+DERQ08nbYtZ9mI+oaggk9gDvWA36lST+XP2iwUPudM8BCdlBmCyUcaCyJRxI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761594513301.07086277911526; Thu, 2 Mar 2023 04:53:14 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6K-0001ht-Gt; Thu, 02 Mar 2023 07:32:00 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5q-0000Sa-HW for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:32 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5o-00030X-7F for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:30 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-124-GifcpE73MEKn0vsx7lQtAg-1; Thu, 02 Mar 2023 07:31:26 -0500 Received: by mail-wm1-f72.google.com with SMTP id z6-20020a7bc7c6000000b003e0107732f4so5699246wmk.1 for ; Thu, 02 Mar 2023 04:31:26 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id h6-20020a1ccc06000000b003e118684d56sm2761434wmb.45.2023.03.02.04.31.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760287; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=d1R/PN9dy7cWY6GbtHCFwrHnFZMQnaaGhFqfVwG1ke8=; b=ceFAODYh5Q1ZL9ds8HlYZlxBTm2R7etPEMfkJV7VtrTDf1PqGtFZ7aieo3z3l5214DCM9s sYP1H1SywN2ydD3M+imp4qVfsFSIHS1hPXt554tkKnwV9WkjSqKohcKiNylNSECPLV8TqU 5zEPRNHzQ1Nv0A/bTpM0t1taczjdCTU= X-MC-Unique: GifcpE73MEKn0vsx7lQtAg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=d1R/PN9dy7cWY6GbtHCFwrHnFZMQnaaGhFqfVwG1ke8=; b=28Rlpkgy6StiuHe8+y0ZqIiMV+LLSUTgiyeUP9D/fItRNSh50yoZhJsG269geXgZYq 6agiLx4DeFQcUZ9NIZGw91Jg4KagAOb16L/HlFrKLaix744537idFLePEGCXbA9Pf4s4 rUTDaJne0acb0lUPrG6ZjIENg3GHpH2IvoE918j+3lVcKX65pOC7l7tOa96PQ579iplU a/moRWzBb+O5h+ONpxTnXaoaJBaZlJxNmuWxxwS+H+7NAhGt2vl6chXzjYr8gFN96rW2 X5XQhc59K8kbR04SGKJA61xVr5UKHFweyZHEi5SUP01KYbbREAL/pFag7L1BJSpTwwXC IEeg== X-Gm-Message-State: AO0yUKVmc0lHnZW1W44VeDK2cicPBvoQQtU3cZEHqaYZC485hwNeXaAP UsI6rFGj/j4qS3MPgbKinYwiMNegERxyWVtriSs5IPi6jU5sx2Ai0kgelsGZD2mGm+NlfZKFpgq o37+J6/zOulPVrHbuvhkhnfgfJOF7dmFWhXf+jO32KwbesLGb0Q4+uwO+TlDKb4n058yJJMTQP0 Y= X-Received: by 2002:a05:600c:1708:b0:3ea:c100:f18d with SMTP id c8-20020a05600c170800b003eac100f18dmr7254406wmn.9.1677760284596; Thu, 02 Mar 2023 04:31:24 -0800 (PST) X-Google-Smtp-Source: AK7set8JgmZm0t3yvoPztvw6dX0ZS9P8xGI6Rs1Nt52Xv/oJTas07kFGgR8+GuBsnXdBKQb90tQhbQ== X-Received: by 2002:a05:600c:1708:b0:3ea:c100:f18d with SMTP id c8-20020a05600c170800b003eac100f18dmr7254394wmn.9.1677760284313; Thu, 02 Mar 2023 04:31:24 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 17/62] i386/xen: implement HYPERVISOR_memory_op Date: Thu, 2 Mar 2023 13:29:44 +0100 Message-Id: <20230302123029.153265-18-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761594949100001 From: Joao Martins Specifically XENMEM_add_to_physmap with space XENMAPSPACE_shared_info to allow the guest to set its shared_info page. Signed-off-by: Joao Martins [dwmw2: Use the xen_overlay device, add compat support] Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/trace-events | 1 + target/i386/kvm/xen-compat.h | 27 ++++++++ target/i386/kvm/xen-emu.c | 116 ++++++++++++++++++++++++++++++++++- 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 target/i386/kvm/xen-compat.h diff --git a/target/i386/kvm/trace-events b/target/i386/kvm/trace-events index bb732e1da840..8e9f269f5671 100644 --- a/target/i386/kvm/trace-events +++ b/target/i386/kvm/trace-events @@ -9,3 +9,4 @@ kvm_x86_update_msi_routes(int num) "Updated %d MSI routes" # xen-emu.c kvm_xen_hypercall(int cpu, uint8_t cpl, uint64_t input, uint64_t a0, uint6= 4_t a1, uint64_t a2, uint64_t ret) "xen_hypercall: cpu %d cpl %d input %" P= RIu64 " a0 0x%" PRIx64 " a1 0x%" PRIx64 " a2 0x%" PRIx64" ret 0x%" PRIx64 kvm_xen_soft_reset(void) "" +kvm_xen_set_shared_info(uint64_t gfn) "shared info at gfn 0x%" PRIx64 diff --git a/target/i386/kvm/xen-compat.h b/target/i386/kvm/xen-compat.h new file mode 100644 index 000000000000..2d852e2a28b8 --- /dev/null +++ b/target/i386/kvm/xen-compat.h @@ -0,0 +1,27 @@ +/* + * Xen HVM emulation support in KVM + * + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef QEMU_I386_KVM_XEN_COMPAT_H +#define QEMU_I386_KVM_XEN_COMPAT_H + +#include "hw/xen/interface/memory.h" + +typedef uint32_t compat_pfn_t; +typedef uint32_t compat_ulong_t; + +struct compat_xen_add_to_physmap { + domid_t domid; + uint16_t size; + unsigned int space; + compat_ulong_t idx; + compat_pfn_t gpfn; +}; + +#endif /* QEMU_I386_XEN_COMPAT_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index be6d85f2cb7b..5d7982712842 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -12,6 +12,7 @@ #include "qemu/osdep.h" #include "qemu/log.h" #include "qemu/main-loop.h" +#include "hw/xen/xen.h" #include "sysemu/kvm_int.h" #include "sysemu/kvm_xen.h" #include "kvm/kvm_i386.h" @@ -24,6 +25,15 @@ =20 #include "hw/xen/interface/version.h" #include "hw/xen/interface/sched.h" +#include "hw/xen/interface/memory.h" + +#include "xen-compat.h" + +#ifdef TARGET_X86_64 +#define hypercall_compat32(longmode) (!(longmode)) +#else +#define hypercall_compat32(longmode) (false) +#endif =20 static int kvm_gva_rw(CPUState *cs, uint64_t gva, void *_buf, size_t sz, bool is_write) @@ -175,13 +185,114 @@ static bool kvm_xen_hcall_xen_version(struct kvm_xen= _exit *exit, X86CPU *cpu, return true; } =20 +static int xen_set_shared_info(uint64_t gfn) +{ + uint64_t gpa =3D gfn << TARGET_PAGE_BITS; + int err; + + QEMU_IOTHREAD_LOCK_GUARD(); + + /* + * The xen_overlay device tells KVM about it too, since it had to + * do that on migration load anyway (unless we're going to jump + * through lots of hoops to maintain the fiction that this isn't + * KVM-specific. + */ + err =3D xen_overlay_map_shinfo_page(gpa); + if (err) { + return err; + } + + trace_kvm_xen_set_shared_info(gfn); + + return err; +} + +static int add_to_physmap_one(uint32_t space, uint64_t idx, uint64_t gfn) +{ + switch (space) { + case XENMAPSPACE_shared_info: + if (idx > 0) { + return -EINVAL; + } + return xen_set_shared_info(gfn); + + case XENMAPSPACE_grant_table: + case XENMAPSPACE_gmfn: + case XENMAPSPACE_gmfn_range: + return -ENOTSUP; + + case XENMAPSPACE_gmfn_foreign: + case XENMAPSPACE_dev_mmio: + return -EPERM; + + default: + return -EINVAL; + } +} + +static int do_add_to_physmap(struct kvm_xen_exit *exit, X86CPU *cpu, + uint64_t arg) +{ + struct xen_add_to_physmap xatp; + CPUState *cs =3D CPU(cpu); + + if (hypercall_compat32(exit->u.hcall.longmode)) { + struct compat_xen_add_to_physmap xatp32; + + qemu_build_assert(sizeof(struct compat_xen_add_to_physmap) =3D=3D = 16); + if (kvm_copy_from_gva(cs, arg, &xatp32, sizeof(xatp32))) { + return -EFAULT; + } + xatp.domid =3D xatp32.domid; + xatp.size =3D xatp32.size; + xatp.space =3D xatp32.space; + xatp.idx =3D xatp32.idx; + xatp.gpfn =3D xatp32.gpfn; + } else { + if (kvm_copy_from_gva(cs, arg, &xatp, sizeof(xatp))) { + return -EFAULT; + } + } + + if (xatp.domid !=3D DOMID_SELF && xatp.domid !=3D xen_domid) { + return -ESRCH; + } + + return add_to_physmap_one(xatp.space, xatp.idx, xatp.gpfn); +} + +static bool kvm_xen_hcall_memory_op(struct kvm_xen_exit *exit, X86CPU *cpu, + int cmd, uint64_t arg) +{ + int err; + + switch (cmd) { + case XENMEM_add_to_physmap: + err =3D do_add_to_physmap(exit, cpu, arg); + break; + + default: + return false; + } + + exit->u.hcall.result =3D err; + return true; +} + int kvm_xen_soft_reset(void) { + int err; + assert(qemu_mutex_iothread_locked()); =20 trace_kvm_xen_soft_reset(); =20 - /* Nothing to reset... yet. */ + err =3D xen_overlay_map_shinfo_page(INVALID_GFN); + if (err) { + return err; + } + return 0; } =20 @@ -270,6 +381,9 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct = kvm_xen_exit *exit) case __HYPERVISOR_sched_op: return kvm_xen_hcall_sched_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); + case __HYPERVISOR_memory_op: + return kvm_xen_hcall_memory_op(exit, cpu, exit->u.hcall.params[0], + exit->u.hcall.params[1]); case __HYPERVISOR_xen_version: return kvm_xen_hcall_xen_version(exit, cpu, exit->u.hcall.params[0= ], exit->u.hcall.params[1]); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761563; cv=none; d=zohomail.com; s=zohoarc; b=D5x79VvPZmWsvHsuyx/3pyndGlO72+KB6GdBXt/mMaMNDQZpK1ma0KNRg8qtq16YoNK2o3ry7AP4ccRkMz65btK72ewI/k5tpUOXqYNT0QzWSXQBYM7q0XxkZ/Pu95Gfs41o2uRHzRgmysGkzxeP33XsCCaO/+0zaUwsG+8LJTY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761563; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=PlDvFz5OPF2Ds6WA6ZEBin2T2RaLHPzmqBS06SNnQo8=; b=ae9FYJmr6C1ahv2gAC6QqdHJ7ffXO+olK8C98HP61RmzcVxu1VF3U9bastorL7TKwcEvd5ktvdXzwOU3h1XDqC6nMuBH3JFmaDZ3EzACoGy8bsIWmvBHdN0FLSu6pPsKIWBZo1rwtgRaDGCMn5L65tjMvbw3l859OSNc13XnC4M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761563543811.2848371059455; Thu, 2 Mar 2023 04:52:43 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6N-0001wx-15; Thu, 02 Mar 2023 07:32:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5s-0000TO-OE for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:36 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5r-00031Q-0G for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:32 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-206-2Bb79vyRPqmnzRul-OslKQ-1; Thu, 02 Mar 2023 07:31:29 -0500 Received: by mail-wm1-f70.google.com with SMTP id e22-20020a05600c219600b003e000facbb1so1186200wme.9 for ; Thu, 02 Mar 2023 04:31:29 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id r14-20020adff70e000000b002c567881dbcsm15151297wrp.48.2023.03.02.04.31.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760290; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PlDvFz5OPF2Ds6WA6ZEBin2T2RaLHPzmqBS06SNnQo8=; b=D20J84RMR5j3662VVMPQ+XTDELWEZqdR3D35E5vHZoG4IQtfA6zPzCXw9u8xmduiYS0Kez OduPvOwpnF8y8k2vPyIOv+0vptNhZRkF0tqyuUYcWl4kN2GwjJTszu1xffF2rHQlRrZVWp 3kd72d/FUO13O5wmRnsBqtXa+LU+xOs= X-MC-Unique: 2Bb79vyRPqmnzRul-OslKQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PlDvFz5OPF2Ds6WA6ZEBin2T2RaLHPzmqBS06SNnQo8=; b=EYMnkxud8rVbepL6njYAa9XY7BEJszSGIbY+AqTxaThr4l2xqyOjI6Ph2wapJPWqP2 v7jw5q56zZAqdM09RMVIqTrczqE0i4HiXfEW5tz1jjoSH5YRD0vkYkmP//0KNipFnmV7 KXCz0PaTlwr6FdOqjZC28kj6QD94zDNssycQdhEaGgyQSyKaRjNXoZzc/aJ4Mohw9XLa E782HO8OM+s65Afy4GfxHKzpmPhhXVlKyw9a3F2qZ4BKx+JPyBHTBkb9LynEZl2Y738Z nm+FxrmLnGlpvxXrayHG2yh3UpKhNSkxp70Mo3yw2uJqzXwDa/oDz1XZGJaD5XsHiBwn JQvA== X-Gm-Message-State: AO0yUKVhoxYIA9BsMpJA8VMqiTlZboaTpe9LI5rGWdiJMQAlwZUnCm3B RF99Qt+Ad0XgIufYR4gLrvYBUjZoWwNLVj5zCBjctwesyWhNCnPU5/wW9uKHGeTEKCglBGfmsPc vgI+Q1HDymfgCimKsej8uTrVS8Hb8o80z3kcgypi5JHbOShw3iV8J1i2en9AakLqr1LD+eoV8FN A= X-Received: by 2002:adf:f9d2:0:b0:2c7:1a96:63f2 with SMTP id w18-20020adff9d2000000b002c71a9663f2mr7192949wrr.3.1677760287531; Thu, 02 Mar 2023 04:31:27 -0800 (PST) X-Google-Smtp-Source: AK7set9dMugkRJligVC8BIwl37IB8WY1A2VpBQCDEFJdL3AHoYMAnGGRUMr4PpCLC8i8YS9Mgtc0CQ== X-Received: by 2002:adf:f9d2:0:b0:2c7:1a96:63f2 with SMTP id w18-20020adff9d2000000b002c71a9663f2mr7192941wrr.3.1677760287278; Thu, 02 Mar 2023 04:31:27 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 18/62] i386/xen: implement XENMEM_add_to_physmap_batch Date: Thu, 2 Mar 2023 13:29:45 +0100 Message-Id: <20230302123029.153265-19-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761564827100003 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/xen-compat.h | 24 +++++++++++++ target/i386/kvm/xen-emu.c | 69 ++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/target/i386/kvm/xen-compat.h b/target/i386/kvm/xen-compat.h index 2d852e2a28b8..448336de9236 100644 --- a/target/i386/kvm/xen-compat.h +++ b/target/i386/kvm/xen-compat.h @@ -15,6 +15,20 @@ =20 typedef uint32_t compat_pfn_t; typedef uint32_t compat_ulong_t; +typedef uint32_t compat_ptr_t; + +#define __DEFINE_COMPAT_HANDLE(name, type) \ + typedef struct { \ + compat_ptr_t c; \ + type *_[0] __attribute__((packed)); \ + } __compat_handle_ ## name; \ + +#define DEFINE_COMPAT_HANDLE(name) __DEFINE_COMPAT_HANDLE(name, name) +#define COMPAT_HANDLE(name) __compat_handle_ ## name + +DEFINE_COMPAT_HANDLE(compat_pfn_t); +DEFINE_COMPAT_HANDLE(compat_ulong_t); +DEFINE_COMPAT_HANDLE(int); =20 struct compat_xen_add_to_physmap { domid_t domid; @@ -24,4 +38,14 @@ struct compat_xen_add_to_physmap { compat_pfn_t gpfn; }; =20 +struct compat_xen_add_to_physmap_batch { + domid_t domid; + uint16_t space; + uint16_t size; + uint16_t extra; + COMPAT_HANDLE(compat_ulong_t) idxs; + COMPAT_HANDLE(compat_pfn_t) gpfns; + COMPAT_HANDLE(int) errs; +}; + #endif /* QEMU_I386_XEN_COMPAT_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 5d7982712842..2b235e7b2714 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -262,6 +262,71 @@ static int do_add_to_physmap(struct kvm_xen_exit *exit= , X86CPU *cpu, return add_to_physmap_one(xatp.space, xatp.idx, xatp.gpfn); } =20 +static int do_add_to_physmap_batch(struct kvm_xen_exit *exit, X86CPU *cpu, + uint64_t arg) +{ + struct xen_add_to_physmap_batch xatpb; + unsigned long idxs_gva, gpfns_gva, errs_gva; + CPUState *cs =3D CPU(cpu); + size_t op_sz; + + if (hypercall_compat32(exit->u.hcall.longmode)) { + struct compat_xen_add_to_physmap_batch xatpb32; + + qemu_build_assert(sizeof(struct compat_xen_add_to_physmap_batch) = =3D=3D 20); + if (kvm_copy_from_gva(cs, arg, &xatpb32, sizeof(xatpb32))) { + return -EFAULT; + } + xatpb.domid =3D xatpb32.domid; + xatpb.space =3D xatpb32.space; + xatpb.size =3D xatpb32.size; + + idxs_gva =3D xatpb32.idxs.c; + gpfns_gva =3D xatpb32.gpfns.c; + errs_gva =3D xatpb32.errs.c; + op_sz =3D sizeof(uint32_t); + } else { + if (kvm_copy_from_gva(cs, arg, &xatpb, sizeof(xatpb))) { + return -EFAULT; + } + op_sz =3D sizeof(unsigned long); + idxs_gva =3D (unsigned long)xatpb.idxs.p; + gpfns_gva =3D (unsigned long)xatpb.gpfns.p; + errs_gva =3D (unsigned long)xatpb.errs.p; + } + + if (xatpb.domid !=3D DOMID_SELF && xatpb.domid !=3D xen_domid) { + return -ESRCH; + } + + /* Explicitly invalid for the batch op. Not that we implement it anywa= y. */ + if (xatpb.space =3D=3D XENMAPSPACE_gmfn_range) { + return -EINVAL; + } + + while (xatpb.size--) { + unsigned long idx =3D 0; + unsigned long gpfn =3D 0; + int err; + + /* For 32-bit compat this only copies the low 32 bits of each */ + if (kvm_copy_from_gva(cs, idxs_gva, &idx, op_sz) || + kvm_copy_from_gva(cs, gpfns_gva, &gpfn, op_sz)) { + return -EFAULT; + } + idxs_gva +=3D op_sz; + gpfns_gva +=3D op_sz; + + err =3D add_to_physmap_one(xatpb.space, idx, gpfn); + + if (kvm_copy_to_gva(cs, errs_gva, &err, sizeof(err))) { + return -EFAULT; + } + errs_gva +=3D sizeof(err); + } + return 0; +} + static bool kvm_xen_hcall_memory_op(struct kvm_xen_exit *exit, X86CPU *cpu, int cmd, uint64_t arg) { @@ -272,6 +337,10 @@ static bool kvm_xen_hcall_memory_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, err =3D do_add_to_physmap(exit, cpu, arg); break; =20 + case XENMEM_add_to_physmap_batch: + err =3D do_add_to_physmap_batch(exit, cpu, arg); + break; + default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761177; cv=none; d=zohomail.com; s=zohoarc; b=ShFwgDbX0QAaAqDkg75X6Wfz4I5spexn9K3ICCkvZitSkVFxtKM3TlbolgcGYoyod0vi1EospTKLlOYOeRwxa0qM4JZOq5WiJSTh7DK4OK75e6vmzMrH3iAO45npqkcEG7j2Jyz7CP7Yt7IJqCHKAGFdwFcbzbJAofRajpCQv7g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761177; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=U8nDbHLy1N2RwrxdAZ/c3Ppx0lBqj7M6wymm1IGPf2g=; b=dwut2G0T3JvBNJoLqj/ej33u/yZSNJ8+kO9q2W4mnEMvxDidj7SYDxNxyz8CO6e6rf4oeT76Rk1yP6rDJoI6WM2Ii0mQWrfidMCgTX+e4FMeAR8835peYdpLl8ccs49QKAVRwszRUmUlfWKizYGtdbT+Q8uH47gS8dYyA9SnSz8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 167776117776623.26886260964011; Thu, 2 Mar 2023 04:46:17 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6B-0000zj-Pl; Thu, 02 Mar 2023 07:31:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5v-0000Tt-AB for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:37 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5t-00032n-Ko for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:34 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-348-qsSUQ77WOsihb51YZJeeyg-1; Thu, 02 Mar 2023 07:31:32 -0500 Received: by mail-wr1-f70.google.com with SMTP id bx25-20020a5d5b19000000b002c7ce4ce3c3so3197647wrb.13 for ; Thu, 02 Mar 2023 04:31:31 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id u4-20020adfed44000000b002c563b124basm15323550wro.103.2023.03.02.04.31.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760293; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=U8nDbHLy1N2RwrxdAZ/c3Ppx0lBqj7M6wymm1IGPf2g=; b=bRSgc+6XO80ectlwmpelb9T+RD5FdQA+hO42kOmG/TKV4KupU5iR1zwSyE0E8SnQFUSVxl bFSUlADYcob6QBybCS54Q+0kEMC0rbHcY8T4wREBNNxzkMyESG6jE9SqSv3vHiKKmXXm2c 0+ibZNgomuq8XM6NHx8ZFNOvdlBdEFo= X-MC-Unique: qsSUQ77WOsihb51YZJeeyg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=U8nDbHLy1N2RwrxdAZ/c3Ppx0lBqj7M6wymm1IGPf2g=; b=1QyEN5NfTybw4JIpykzKRNdBTPYIg+qdDlQjUvtAnqxnyLjJrt+Ng97f/9tGVHh9Vq ZoVqKne1J5HujLdm8RbY+0SxDHKHWv+y7yV/X6hzrMa8dM5BSZpo6zzENG9vHZG9uMuF MSpeX8cboVJAirZGvtC6tvSGf1Y2OutO6Tn1daK+LkJeExyniNI5Hj94yWGeO9wGitIX DsGakhbHzh+jFPO6KdNgw1k4JMvSEznLusqStgnM7toKamT3VXPMx+j59D6AAtjZ5Re8 Z3kiggGkQQd0yjWeCA4w/fuyknyBQKL9W+RBgqBJTpCep233/TztDBjiEV1UdO5OxZjk v3pw== X-Gm-Message-State: AO0yUKVT7XoUgl2MjlEY+y8diSs4O+/KuZ9Du5RGePGdtmG12uF0JbTf mNclrbsVD7TVexpEz7WPXD1T+wg9Apn9mHpGV10nfIiiVei6t/TlN4e8JShtdkCBxsZRKF+wWAD UsbB9+PmjsGAX58cKgRyydfOOjDuEdE0yNN2qEwc/WnCjoSF6q3aLEsH3lDHN7J9DeMdc/wxgMp 8= X-Received: by 2002:a05:600c:4da5:b0:3eb:42ab:7b5 with SMTP id v37-20020a05600c4da500b003eb42ab07b5mr8279829wmp.1.1677760290377; Thu, 02 Mar 2023 04:31:30 -0800 (PST) X-Google-Smtp-Source: AK7set8POrClXqdrZYcjHnxfN7MyPj6yJY0pt7lpOUw+hTpIqk+dJ9GEQls3799bR6ca28sVO8o97w== X-Received: by 2002:a05:600c:4da5:b0:3eb:42ab:7b5 with SMTP id v37-20020a05600c4da500b003eb42ab07b5mr8279816wmp.1.1677760290130; Thu, 02 Mar 2023 04:31:30 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 19/62] i386/xen: implement HYPERVISOR_hvm_op Date: Thu, 2 Mar 2023 13:29:46 +0100 Message-Id: <20230302123029.153265-20-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761179030100005 Content-Type: text/plain; charset="utf-8" From: Joao Martins This is when guest queries for support for HVMOP_pagetable_dying. Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/xen-emu.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 2b235e7b2714..4002b1b797cb 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -26,6 +26,7 @@ #include "hw/xen/interface/version.h" #include "hw/xen/interface/sched.h" #include "hw/xen/interface/memory.h" +#include "hw/xen/interface/hvm/hvm_op.h" =20 #include "xen-compat.h" =20 @@ -349,6 +350,19 @@ static bool kvm_xen_hcall_memory_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, return true; } =20 +static bool kvm_xen_hcall_hvm_op(struct kvm_xen_exit *exit, X86CPU *cpu, + int cmd, uint64_t arg) +{ + switch (cmd) { + case HVMOP_pagetable_dying: + exit->u.hcall.result =3D -ENOSYS; + return true; + + default: + return false; + } +} + int kvm_xen_soft_reset(void) { int err; @@ -450,6 +464,9 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct = kvm_xen_exit *exit) case __HYPERVISOR_sched_op: return kvm_xen_hcall_sched_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); + case __HYPERVISOR_hvm_op: + return kvm_xen_hcall_hvm_op(exit, cpu, exit->u.hcall.params[0], + exit->u.hcall.params[1]); case __HYPERVISOR_memory_op: return kvm_xen_hcall_memory_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760714; cv=none; d=zohomail.com; s=zohoarc; b=Nug35ZGK9CG3Od54vZ0m8k2qNuv7hfukDGhtm4Dq0AfcFj+Lf06xUe5J4EV8uGMNcF4WbHkCOGFHVtB/tNreSShugNXErtYFpmIUzUgmZ1g8Bybh/06cqcsMXh6sDAu2zqu6Foc2GwWaQNHhp6rMEI9mrBc2EaXb0MGGGvSWkk8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760714; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=R7CwJxDfN3K2I2RtaBpt7PI+9HJfQj4Qdyc9Yuv/MO4=; b=b4bEKRecItyCThkKXC6sSDO0X7jkJ/nR+xbPsaTXG3BAVXytTEyH2gkfgcVr83C8WlpxQDaORY3oLSY4RS7I+vBCyYtwADcCNvq3tuPE3eJ2JVHtnxQ0mIvuL71g5uF9ZwhMXjq8hCTkd5XajMYtaoRlqO8Q6Aaq4UBvuXHgycc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760714191689.9264684211585; Thu, 2 Mar 2023 04:38:34 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6u-0002f2-G6; Thu, 02 Mar 2023 07:32:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5x-0000et-W7 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:38 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5w-00035L-FC for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:37 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-587-czv9tejjMNyerfiMOEao1g-1; Thu, 02 Mar 2023 07:31:34 -0500 Received: by mail-wr1-f70.google.com with SMTP id g6-20020adfa486000000b002c55ef1ec94so3146229wrb.0 for ; Thu, 02 Mar 2023 04:31:34 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id q10-20020adfea0a000000b002c567b58e9asm15364647wrm.56.2023.03.02.04.31.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760295; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=R7CwJxDfN3K2I2RtaBpt7PI+9HJfQj4Qdyc9Yuv/MO4=; b=gtOGSHJSwBvmPcktlFRmODW2IohsXCJQL3WDZREXCfj/PBTWtDt4MCQHDrL+hY/0kDnRZO Pfnnh8cxNHlrUaNOj6CffpKfzJbBi7ZLa2we+HretkEmku7FtA3vyszoLihISip8t9rKpn eJxDJUC6aY3O7m7/KzyPNI4VEZVMt4c= X-MC-Unique: czv9tejjMNyerfiMOEao1g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=R7CwJxDfN3K2I2RtaBpt7PI+9HJfQj4Qdyc9Yuv/MO4=; b=H9wEMk86R3JKoNAl8MW9nP+uZO/i9dB2hs/WJ1quUspuOTwEUPSw+Vq2KJSiCUXRZc qb4euulUU1pA8KxPdJS/woPSH0vW1gmDtbsWc0JvbWyUKpogUeB9XcRxk8KMRCjoxO+w I1Qb+/zDie01EY9T08uJv0+FILB+faBKEPlfQrIJlPhYahQQ+P/PNAd3XbGxFUmKIiZx A6FJq99YxXss26293vfm/bfIRtrr4efmbGrfegOkK5RxIvnrbPVdGWoi8vz/KX35DIRo qxKU7ShXD+V9Doc7otpJJiIaluphi/4EbZBg4BSrqzQHrZcAYbtsgOtssdjj3B3Jb32o 24mQ== X-Gm-Message-State: AO0yUKW2uNBTK1ORvXYSxtnUlUVGiKSE2xtNudxJBRqzQkVX1hXOjOQa 56ymhpKUKdcOtqjKTYc4gXhBcud1HVA1p9AR82tQ+OcYIjzjg5yyoSmTnY4CPAp7Z0NDImMBmQM pwWqNkeGYsoNzksgfJQM2EoVH8yiNbshbIqyusdW2ODtTJ5hvQcNNMyZ6dmEgdM5ztHzLeMgezW A= X-Received: by 2002:a05:600c:3148:b0:3df:f7f1:4faf with SMTP id h8-20020a05600c314800b003dff7f14fafmr7553852wmo.34.1677760292889; Thu, 02 Mar 2023 04:31:32 -0800 (PST) X-Google-Smtp-Source: AK7set+B6w6GCMVkZ04e9Ym7VB+ZGGz8RjyWDzjqIHAJaFSmIC3ne6IzYCbOOyEAf0WO9vzuq7eTIg== X-Received: by 2002:a05:600c:3148:b0:3df:f7f1:4faf with SMTP id h8-20020a05600c314800b003dff7f14fafmr7553836wmo.34.1677760292628; Thu, 02 Mar 2023 04:31:32 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 20/62] i386/xen: implement HYPERVISOR_vcpu_op Date: Thu, 2 Mar 2023 13:29:47 +0100 Message-Id: <20230302123029.153265-21-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760716361100001 Content-Type: text/plain; charset="utf-8" From: Joao Martins This is simply when guest tries to register a vcpu_info and since vcpu_info placement is optional in the minimum ABI therefore we can just fail with -ENOSYS Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/xen-emu.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 4002b1b797cb..e5ae0a9a386d 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -27,6 +27,7 @@ #include "hw/xen/interface/sched.h" #include "hw/xen/interface/memory.h" #include "hw/xen/interface/hvm/hvm_op.h" +#include "hw/xen/interface/vcpu.h" =20 #include "xen-compat.h" =20 @@ -363,6 +364,25 @@ static bool kvm_xen_hcall_hvm_op(struct kvm_xen_exit *= exit, X86CPU *cpu, } } =20 +static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu, + int cmd, int vcpu_id, uint64_t arg) +{ + int err; + + switch (cmd) { + case VCPUOP_register_vcpu_info: + /* no vcpu info placement for now */ + err =3D -ENOSYS; + break; + + default: + return false; + } + + exit->u.hcall.result =3D err; + return true; +} + int kvm_xen_soft_reset(void) { int err; @@ -464,6 +484,11 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct= kvm_xen_exit *exit) case __HYPERVISOR_sched_op: return kvm_xen_hcall_sched_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); + case __HYPERVISOR_vcpu_op: + return kvm_xen_hcall_vcpu_op(exit, cpu, + exit->u.hcall.params[0], + exit->u.hcall.params[1], + exit->u.hcall.params[2]); case __HYPERVISOR_hvm_op: return kvm_xen_hcall_hvm_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760867; cv=none; d=zohomail.com; s=zohoarc; b=fYs3EEumYFgyFOO/mK4y7/qg6QMIPmFJ82OozgLSORMwiLbLoRPK93/PHEor2FLxR7b+On56MC6avsqY3dVE9M8XwRBl8wjJ0O1+Zmxy1qYpjXdKqmAK04gCcpeio3yGm5osCZ4ML2Opg8f8+UaMurEXMnRYKSqPUkK3VKUMYrs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760867; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=W0bpVE4uH/lSlO1rU5S3/hK4YldwUzNm6GBRSdsBQeI=; b=VXi/koXWNiKZq7ye17zRnLHMr3IZCmeXBMUy2zrqdsp89zHdTYeoPQY3Mv9XDZJG6gMJO5LIQ9F6sZrZEFIZC0fE8osezDyBQH3zkMmkTAYh97swM7xw9zb3BgXedMOrXBWHo11dyEH5S85sgdac4NhW2n8HUatb/sFdPJ6ygpo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760867228416.58817510114875; Thu, 2 Mar 2023 04:41:07 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6I-0001Lg-IK; Thu, 02 Mar 2023 07:31:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi61-0000fk-DQ for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:44 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi5z-000387-Bb for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:41 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-98-fqk6lhoHNn6svmAOkr6kLA-1; Thu, 02 Mar 2023 07:31:37 -0500 Received: by mail-wm1-f71.google.com with SMTP id r7-20020a05600c35c700b003eb3f2c4fb4so1013586wmq.6 for ; Thu, 02 Mar 2023 04:31:37 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id v16-20020a5d4a50000000b002c5526234d2sm15373742wrs.8.2023.03.02.04.31.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760298; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W0bpVE4uH/lSlO1rU5S3/hK4YldwUzNm6GBRSdsBQeI=; b=UJdBnxZs5PzncyqmExgKya7pJzPDHt1S4UkwoNTLEj4Tou0rItMXatSw9q6t83nASIZwc9 HhvRb2G0FvlZ8K4mNO3YNrs+0JZ0ktV3yUCj8EgMW285elcaGyZp3O5P+a2rU+yRsIrFwc ChEIClHQgxaeMyhnzACOCbSbxjl9A4E= X-MC-Unique: fqk6lhoHNn6svmAOkr6kLA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=W0bpVE4uH/lSlO1rU5S3/hK4YldwUzNm6GBRSdsBQeI=; b=Io23GEKQsr2q4XLdIdFwEx0nHzHjlqaNX9JeOkFQOJxyYb8qm32B3WyE0nu9V1RePa Q20zYqENgI21wioJJQi/D6hevd0riEJ3mS2+bcKBaKfiZE9oxMEKKZxPRdMpt+W3DWG7 i1CfRVb1cl5Dq8kpjq5+Pn330pAJU2DZPlgTLydey/sN/eZ56nq6OUmez1GJMuM0q0Jk Xzq0RofBL0UFYhyQ1WsedHMJyAATCi+6ymFZQkD3OogzrKEBuwwTMK8gXBLdCd9mjpA1 HZ3YGuhv5ViYrsAjv7cPqFHaXRNHckLkRNhUhG9LKBlWEnmilj6NQ6HZUEu/hA+CiwOf dJxg== X-Gm-Message-State: AO0yUKWg/L1PyOMcbePy+iKXmX5xBFQJpRgSWjtR7P0Heoe6DdiWEOW9 Y/57+epGfhPFXpnwz9SiuOSktPEpAFunOnSELnRnBz6LX/AIj+A0DzPK2IoBXfIM75ihqEbl48X g2sEXUKP58ulNyiH5JXFwh1sQ593uJRSEuBJbBnnktADsK71e45EVrLs1xnagvGBSqRmQ2U7sr3 8= X-Received: by 2002:a05:600c:a691:b0:3eb:5d17:8ddc with SMTP id ip17-20020a05600ca69100b003eb5d178ddcmr2640265wmb.18.1677760295939; Thu, 02 Mar 2023 04:31:35 -0800 (PST) X-Google-Smtp-Source: AK7set/DXVlL+zY7Dmzmkg0DXvX0pzaHQlNKKdDUujk7s8Sfo+EosoQCwvCmwfHAo93wWhPKuFPQrA== X-Received: by 2002:a05:600c:a691:b0:3eb:5d17:8ddc with SMTP id ip17-20020a05600ca69100b003eb5d178ddcmr2640244wmb.18.1677760295520; Thu, 02 Mar 2023 04:31:35 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 21/62] i386/xen: handle VCPUOP_register_vcpu_info Date: Thu, 2 Mar 2023 13:29:48 +0100 Message-Id: <20230302123029.153265-22-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760867597100001 Content-Type: text/plain; charset="utf-8" From: Joao Martins Handle the hypercall to set a per vcpu info, and also wire up the default vcpu_info in the shared_info page for the first 32 vCPUs. To avoid deadlock within KVM a vCPU thread must set its *own* vcpu_info rather than it being set from the context in which the hypercall is invoked. Add the vcpu_info (and default) GPA to the vmstate_x86_cpu for migration, and restore it in kvm_arch_put_registers() appropriately. Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/cpu.h | 2 + target/i386/kvm/kvm.c | 17 ++++ target/i386/kvm/trace-events | 1 + target/i386/kvm/xen-emu.c | 153 ++++++++++++++++++++++++++++++++++- target/i386/kvm/xen-emu.h | 2 + target/i386/machine.c | 19 +++++ 6 files changed, 191 insertions(+), 3 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 5069adfbe7e0..9070efdc5184 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1799,6 +1799,8 @@ typedef struct CPUArchState { #endif #if defined(CONFIG_KVM) struct kvm_nested_state *nested_state; + uint64_t xen_vcpu_info_gpa; + uint64_t xen_vcpu_info_default_gpa; #endif #if defined(CONFIG_HVF) HVFX86LazyFlags hvf_lflags; diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index f43e5531bf85..5a144ec0de3a 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -4750,6 +4750,15 @@ int kvm_arch_put_registers(CPUState *cpu, int level) kvm_arch_set_tsc_khz(cpu); } =20 +#ifdef CONFIG_XEN_EMU + if (xen_mode =3D=3D XEN_EMULATE && level =3D=3D KVM_PUT_FULL_STATE) { + ret =3D kvm_put_xen_state(cpu); + if (ret < 0) { + return ret; + } + } +#endif + ret =3D kvm_getput_regs(x86_cpu, 1); if (ret < 0) { return ret; @@ -4849,6 +4858,14 @@ int kvm_arch_get_registers(CPUState *cs) if (ret < 0) { goto out; } +#ifdef CONFIG_XEN_EMU + if (xen_mode =3D=3D XEN_EMULATE) { + ret =3D kvm_get_xen_state(cs); + if (ret < 0) { + goto out; + } + } +#endif ret =3D 0; out: cpu_sync_bndcs_hflags(&cpu->env); diff --git a/target/i386/kvm/trace-events b/target/i386/kvm/trace-events index 8e9f269f5671..a840e0333de7 100644 --- a/target/i386/kvm/trace-events +++ b/target/i386/kvm/trace-events @@ -10,3 +10,4 @@ kvm_x86_update_msi_routes(int num) "Updated %d MSI routes" kvm_xen_hypercall(int cpu, uint8_t cpl, uint64_t input, uint64_t a0, uint6= 4_t a1, uint64_t a2, uint64_t ret) "xen_hypercall: cpu %d cpl %d input %" P= RIu64 " a0 0x%" PRIx64 " a1 0x%" PRIx64 " a2 0x%" PRIx64" ret 0x%" PRIx64 kvm_xen_soft_reset(void) "" kvm_xen_set_shared_info(uint64_t gfn) "shared info at gfn 0x%" PRIx64 +kvm_xen_set_vcpu_attr(int cpu, int type, uint64_t gpa) "vcpu attr cpu %d t= ype %d gpa 0x%" PRIx64 diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index e5ae0a9a386d..30b4789da394 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -119,6 +119,8 @@ int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) =20 int kvm_xen_init_vcpu(CPUState *cs) { + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; int err; =20 /* @@ -142,6 +144,9 @@ int kvm_xen_init_vcpu(CPUState *cs) } } =20 + env->xen_vcpu_info_gpa =3D INVALID_GPA; + env->xen_vcpu_info_default_gpa =3D INVALID_GPA; + return 0; } =20 @@ -187,10 +192,58 @@ static bool kvm_xen_hcall_xen_version(struct kvm_xen_= exit *exit, X86CPU *cpu, return true; } =20 +static int kvm_xen_set_vcpu_attr(CPUState *cs, uint16_t type, uint64_t gpa) +{ + struct kvm_xen_vcpu_attr xhsi; + + xhsi.type =3D type; + xhsi.u.gpa =3D gpa; + + trace_kvm_xen_set_vcpu_attr(cs->cpu_index, type, gpa); + + return kvm_vcpu_ioctl(cs, KVM_XEN_VCPU_SET_ATTR, &xhsi); +} + +static void do_set_vcpu_info_default_gpa(CPUState *cs, run_on_cpu_data dat= a) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + + env->xen_vcpu_info_default_gpa =3D data.host_ulong; + + /* Changing the default does nothing if a vcpu_info was explicitly set= . */ + if (env->xen_vcpu_info_gpa =3D=3D INVALID_GPA) { + kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, + env->xen_vcpu_info_default_gpa); + } +} + +static void do_set_vcpu_info_gpa(CPUState *cs, run_on_cpu_data data) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + + env->xen_vcpu_info_gpa =3D data.host_ulong; + + kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, + env->xen_vcpu_info_gpa); +} + +static void do_vcpu_soft_reset(CPUState *cs, run_on_cpu_data data) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + + env->xen_vcpu_info_gpa =3D INVALID_GPA; + env->xen_vcpu_info_default_gpa =3D INVALID_GPA; + + kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, INVALID_GP= A); +} + static int xen_set_shared_info(uint64_t gfn) { uint64_t gpa =3D gfn << TARGET_PAGE_BITS; - int err; + int i, err; =20 QEMU_IOTHREAD_LOCK_GUARD(); =20 @@ -207,6 +260,15 @@ static int xen_set_shared_info(uint64_t gfn) =20 trace_kvm_xen_set_shared_info(gfn); =20 + for (i =3D 0; i < XEN_LEGACY_MAX_VCPUS; i++) { + CPUState *cpu =3D qemu_get_cpu(i); + if (cpu) { + async_run_on_cpu(cpu, do_set_vcpu_info_default_gpa, + RUN_ON_CPU_HOST_ULONG(gpa)); + } + gpa +=3D sizeof(vcpu_info_t); + } + return err; } =20 @@ -364,15 +426,43 @@ static bool kvm_xen_hcall_hvm_op(struct kvm_xen_exit = *exit, X86CPU *cpu, } } =20 +static int vcpuop_register_vcpu_info(CPUState *cs, CPUState *target, + uint64_t arg) +{ + struct vcpu_register_vcpu_info rvi; + uint64_t gpa; + + /* No need for 32/64 compat handling */ + qemu_build_assert(sizeof(rvi) =3D=3D 16); + qemu_build_assert(sizeof(struct vcpu_info) =3D=3D 64); + + if (!target) { + return -ENOENT; + } + + if (kvm_copy_from_gva(cs, arg, &rvi, sizeof(rvi))) { + return -EFAULT; + } + + if (rvi.offset > TARGET_PAGE_SIZE - sizeof(struct vcpu_info)) { + return -EINVAL; + } + + gpa =3D ((rvi.mfn << TARGET_PAGE_BITS) + rvi.offset); + async_run_on_cpu(target, do_set_vcpu_info_gpa, RUN_ON_CPU_HOST_ULONG(g= pa)); + return 0; +} + static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu, int cmd, int vcpu_id, uint64_t arg) { + CPUState *dest =3D qemu_get_cpu(vcpu_id); + CPUState *cs =3D CPU(cpu); int err; =20 switch (cmd) { case VCPUOP_register_vcpu_info: - /* no vcpu info placement for now */ - err =3D -ENOSYS; + err =3D vcpuop_register_vcpu_info(cs, dest, arg); break; =20 default: @@ -385,12 +475,17 @@ static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit= *exit, X86CPU *cpu, =20 int kvm_xen_soft_reset(void) { + CPUState *cpu; int err; =20 assert(qemu_mutex_iothread_locked()); =20 trace_kvm_xen_soft_reset(); =20 + CPU_FOREACH(cpu) { + async_run_on_cpu(cpu, do_vcpu_soft_reset, RUN_ON_CPU_NULL); + } + err =3D xen_overlay_map_shinfo_page(INVALID_GFN); if (err) { return err; @@ -539,3 +634,55 @@ int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_ex= it *exit) exit->u.hcall.result); return 0; } + +int kvm_put_xen_state(CPUState *cs) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + uint64_t gpa; + int ret; + + gpa =3D env->xen_vcpu_info_gpa; + if (gpa =3D=3D INVALID_GPA) { + gpa =3D env->xen_vcpu_info_default_gpa; + } + + if (gpa !=3D INVALID_GPA) { + ret =3D kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO= , gpa); + if (ret < 0) { + return ret; + } + } + + return 0; +} + +int kvm_get_xen_state(CPUState *cs) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + uint64_t gpa; + + /* + * The kernel does not mark vcpu_info as dirty when it delivers interr= upts + * to it. It's up to userspace to *assume* that any page shared thus is + * always considered dirty. The shared_info page is different since it= 's + * an overlay and migrated separately anyway. + */ + gpa =3D env->xen_vcpu_info_gpa; + if (gpa =3D=3D INVALID_GPA) { + gpa =3D env->xen_vcpu_info_default_gpa; + } + if (gpa !=3D INVALID_GPA) { + MemoryRegionSection mrs =3D memory_region_find(get_system_memory(), + gpa, + sizeof(struct vcpu_in= fo)); + if (mrs.mr && + !int128_lt(mrs.size, int128_make64(sizeof(struct vcpu_info))))= { + memory_region_set_dirty(mrs.mr, mrs.offset_within_region, + sizeof(struct vcpu_info)); + } + } + + return 0; +} diff --git a/target/i386/kvm/xen-emu.h b/target/i386/kvm/xen-emu.h index 21faf6bf38fd..452605699abb 100644 --- a/target/i386/kvm/xen-emu.h +++ b/target/i386/kvm/xen-emu.h @@ -26,5 +26,7 @@ int kvm_xen_init(KVMState *s, uint32_t hypercall_msr); int kvm_xen_init_vcpu(CPUState *cs); int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit); +int kvm_put_xen_state(CPUState *cs); +int kvm_get_xen_state(CPUState *cs); =20 #endif /* QEMU_I386_KVM_XEN_EMU_H */ diff --git a/target/i386/machine.c b/target/i386/machine.c index 310b12523508..1215e616c8f4 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -6,8 +6,10 @@ #include "kvm/hyperv.h" #include "hw/i386/x86.h" #include "kvm/kvm_i386.h" +#include "hw/xen/xen.h" =20 #include "sysemu/kvm.h" +#include "sysemu/kvm_xen.h" #include "sysemu/tcg.h" =20 #include "qemu/error-report.h" @@ -1257,6 +1259,22 @@ static const VMStateDescription vmstate_nested_state= =3D { } }; =20 +static bool xen_vcpu_needed(void *opaque) +{ + return (xen_mode =3D=3D XEN_EMULATE); +} + +static const VMStateDescription vmstate_xen_vcpu =3D { + .name =3D "cpu/xen_vcpu", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D xen_vcpu_needed, + .fields =3D (VMStateField[]) { + VMSTATE_UINT64(env.xen_vcpu_info_gpa, X86CPU), + VMSTATE_UINT64(env.xen_vcpu_info_default_gpa, X86CPU), + VMSTATE_END_OF_LIST() + } +}; #endif =20 static bool mcg_ext_ctl_needed(void *opaque) @@ -1716,6 +1734,7 @@ const VMStateDescription vmstate_x86_cpu =3D { #endif #ifdef CONFIG_KVM &vmstate_nested_state, + &vmstate_xen_vcpu, #endif &vmstate_msr_tsx_ctrl, &vmstate_msr_intel_sgx, --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761861; cv=none; d=zohomail.com; s=zohoarc; b=WD0OHbm7+Sn2jZehHHY3mn27Cf8ErFi7evi+co8qAUaabJP2iPCxUu79QssoJ2BXe7x/ea0hLnD0fm/mtr+YAJ4260vWtVl+zwMSRoC5K+IOWeqJE9YHGgtukDnsuXYigKxAhnIBvOs5X/T2YNdGZEnotbziJB59UevLeWYfLGg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761861; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=7XhSrxs/zdUi9tnVi5PM2bz6j87O1lkWsZycP8yMoMA=; b=FJcEfh/6b8H4nS/R67t72W/oTHmqXV4jR7xF8iKwbwyQtQTlX46g8lxqS7LQrsMMhxLFydBEScyGsyQiBLlhpKfW4rqXgUjMOHzgNoZFtPgXHPsFN5TE2ZehNHAjMdWxTfRz+RcBp4i1cHd7FavEmEkyclYDHx68IbYkGht8qZE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761861906119.05710837125889; Thu, 2 Mar 2023 04:57:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8d-0003p0-CM; Thu, 02 Mar 2023 07:34:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi63-0000gW-PA for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:45 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi62-00038c-0i for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:43 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-170-ZcwKPMtkO-mf4E2lxl-69g-1; Thu, 02 Mar 2023 07:31:40 -0500 Received: by mail-wm1-f71.google.com with SMTP id k36-20020a05600c1ca400b003eac86e4387so1189241wms.8 for ; Thu, 02 Mar 2023 04:31:40 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id h12-20020a05600c314c00b003dfee43863fsm3071052wmo.26.2023.03.02.04.31.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760301; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7XhSrxs/zdUi9tnVi5PM2bz6j87O1lkWsZycP8yMoMA=; b=YMt/LeLzoL5KhJfYGMBPeCJqP5fg3GkA1Ngf+fNvkJ/u746qtPyBW0v8CD0yXiUhzQJMFO oD58VAsA2aCb0NIQlINV2cGKJCMK/kNBJMgdWPWSXQ/HcS3upgvxRhLPzkSC+ID5q87ZKh mV/2stINF6qSEXFFjj7K9b/2HE8vXpg= X-MC-Unique: ZcwKPMtkO-mf4E2lxl-69g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7XhSrxs/zdUi9tnVi5PM2bz6j87O1lkWsZycP8yMoMA=; b=nkDN6pkHOCXiOQZjSK5brBuUD+TENFmjv5WWKi+L3Iyul77/lvgQ4+aY6SNWR1mZLy ELdtHZJvDbGEy9wk2HoTy/ReYNFs9CP1Xtdrn0PYZFfTqJA2vq//NZ4nVmz6Xh3b53DA HxzSf94bF65Hw/7kbGvV734Q4z8WiqSiumw693jhTWOjQ6X4BxVsxKNCFjKf9kotg6zI Rhkq3fgKgL0LgpJAHuKd7hew7i1mOKf+/d5yY653bPV3Jfdb/VgkfBSCFdjx2oOPwgHf fIFjG+DPNK8sriidgFEQg+lol2LPLftj11l/4nniT+u31/YXB1y3Ucl5gzHT0rmi5QIC qqkA== X-Gm-Message-State: AO0yUKXu+/WUmjVhjvxJXHPsApfIIEl7rqgR+lF9SkXhkhkZ88jEndU7 HFI+VTkexwYmKLDdyKM5Afyne0VCaiLrfPTXwoAfCuVv/YRDXCcAEUtN7I8Kmrp8DUUaeuRe1aa o1oianFNeKt76e8csQMHtQ2BWtAYah438qrdFY0tPROtmw+vJZgTrqnKBCOaOFMJPni1ZYk+m+/ 0= X-Received: by 2002:a05:600c:c88:b0:3eb:3974:aad7 with SMTP id fj8-20020a05600c0c8800b003eb3974aad7mr7633341wmb.24.1677760298972; Thu, 02 Mar 2023 04:31:38 -0800 (PST) X-Google-Smtp-Source: AK7set89OisegUi+0chwWWgOTj33IyMKxmCo5ivRelfR1joP/exjSSpVUGU0/JhrbgJT96oPWqTVxg== X-Received: by 2002:a05:600c:c88:b0:3eb:3974:aad7 with SMTP id fj8-20020a05600c0c8800b003eb3974aad7mr7633325wmb.24.1677760298655; Thu, 02 Mar 2023 04:31:38 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 22/62] i386/xen: handle VCPUOP_register_vcpu_time_info Date: Thu, 2 Mar 2023 13:29:49 +0100 Message-Id: <20230302123029.153265-23-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761862757100007 From: Joao Martins In order to support Linux vdso in Xen. Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/cpu.h | 1 + target/i386/kvm/xen-emu.c | 102 +++++++++++++++++++++++++++++++++----- target/i386/machine.c | 1 + 3 files changed, 91 insertions(+), 13 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 9070efdc5184..7c39d917e8eb 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1801,6 +1801,7 @@ typedef struct CPUArchState { struct kvm_nested_state *nested_state; uint64_t xen_vcpu_info_gpa; uint64_t xen_vcpu_info_default_gpa; + uint64_t xen_vcpu_time_info_gpa; #endif #if defined(CONFIG_HVF) HVFX86LazyFlags hvf_lflags; diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 30b4789da394..04832522f5ca 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -37,28 +37,41 @@ #define hypercall_compat32(longmode) (false) #endif =20 -static int kvm_gva_rw(CPUState *cs, uint64_t gva, void *_buf, size_t sz, - bool is_write) +static bool kvm_gva_to_gpa(CPUState *cs, uint64_t gva, uint64_t *gpa, + size_t *len, bool is_write) { - uint8_t *buf =3D (uint8_t *)_buf; - int ret; - - while (sz) { struct kvm_translation tr =3D { .linear_address =3D gva, }; =20 - size_t len =3D TARGET_PAGE_SIZE - (tr.linear_address & ~TARGET_PAG= E_MASK); + if (len) { + *len =3D TARGET_PAGE_SIZE - (gva & ~TARGET_PAGE_MASK); + } + + if (kvm_vcpu_ioctl(cs, KVM_TRANSLATE, &tr) || !tr.valid || + (is_write && !tr.writeable)) { + return false; + } + *gpa =3D tr.physical_address; + return true; +} + +static int kvm_gva_rw(CPUState *cs, uint64_t gva, void *_buf, size_t sz, + bool is_write) +{ + uint8_t *buf =3D (uint8_t *)_buf; + uint64_t gpa; + size_t len; + + while (sz) { + if (!kvm_gva_to_gpa(cs, gva, &gpa, &len, is_write)) { + return -EFAULT; + } if (len > sz) { len =3D sz; } =20 - ret =3D kvm_vcpu_ioctl(cs, KVM_TRANSLATE, &tr); - if (ret || !tr.valid || (is_write && !tr.writeable)) { - return -EFAULT; - } - - cpu_physical_memory_rw(tr.physical_address, buf, len, is_write); + cpu_physical_memory_rw(gpa, buf, len, is_write); =20 buf +=3D len; sz -=3D len; @@ -146,6 +159,7 @@ int kvm_xen_init_vcpu(CPUState *cs) =20 env->xen_vcpu_info_gpa =3D INVALID_GPA; env->xen_vcpu_info_default_gpa =3D INVALID_GPA; + env->xen_vcpu_time_info_gpa =3D INVALID_GPA; =20 return 0; } @@ -229,6 +243,17 @@ static void do_set_vcpu_info_gpa(CPUState *cs, run_on_= cpu_data data) env->xen_vcpu_info_gpa); } =20 +static void do_set_vcpu_time_info_gpa(CPUState *cs, run_on_cpu_data data) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + + env->xen_vcpu_time_info_gpa =3D data.host_ulong; + + kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO, + env->xen_vcpu_time_info_gpa); +} + static void do_vcpu_soft_reset(CPUState *cs, run_on_cpu_data data) { X86CPU *cpu =3D X86_CPU(cs); @@ -236,8 +261,11 @@ static void do_vcpu_soft_reset(CPUState *cs, run_on_cp= u_data data) =20 env->xen_vcpu_info_gpa =3D INVALID_GPA; env->xen_vcpu_info_default_gpa =3D INVALID_GPA; + env->xen_vcpu_time_info_gpa =3D INVALID_GPA; =20 kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, INVALID_GP= A); + kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO, + INVALID_GPA); } =20 static int xen_set_shared_info(uint64_t gfn) @@ -453,6 +481,42 @@ static int vcpuop_register_vcpu_info(CPUState *cs, CPU= State *target, return 0; } =20 +static int vcpuop_register_vcpu_time_info(CPUState *cs, CPUState *target, + uint64_t arg) +{ + struct vcpu_register_time_memory_area tma; + uint64_t gpa; + size_t len; + + /* No need for 32/64 compat handling */ + qemu_build_assert(sizeof(tma) =3D=3D 8); + qemu_build_assert(sizeof(struct vcpu_time_info) =3D=3D 32); + + if (!target) { + return -ENOENT; + } + + if (kvm_copy_from_gva(cs, arg, &tma, sizeof(tma))) { + return -EFAULT; + } + + /* + * Xen actually uses the GVA and does the translation through the guest + * page tables each time. But Linux/KVM uses the GPA, on the assumption + * that guests only ever use *global* addresses (kernel virtual addres= ses) + * for it. If Linux is changed to redo the GVA=E2=86=92GPA translation= each time, + * it will offer a new vCPU attribute for that, and we'll use it inste= ad. + */ + if (!kvm_gva_to_gpa(cs, tma.addr.p, &gpa, &len, false) || + len < sizeof(struct vcpu_time_info)) { + return -EFAULT; + } + + async_run_on_cpu(target, do_set_vcpu_time_info_gpa, + RUN_ON_CPU_HOST_ULONG(gpa)); + return 0; +} + static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu, int cmd, int vcpu_id, uint64_t arg) { @@ -461,6 +525,9 @@ static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *= exit, X86CPU *cpu, int err; =20 switch (cmd) { + case VCPUOP_register_vcpu_time_memory_area: + err =3D vcpuop_register_vcpu_time_info(cs, dest, arg); + break; case VCPUOP_register_vcpu_info: err =3D vcpuop_register_vcpu_info(cs, dest, arg); break; @@ -654,6 +721,15 @@ int kvm_put_xen_state(CPUState *cs) } } =20 + gpa =3D env->xen_vcpu_time_info_gpa; + if (gpa !=3D INVALID_GPA) { + ret =3D kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME= _INFO, + gpa); + if (ret < 0) { + return ret; + } + } + return 0; } =20 diff --git a/target/i386/machine.c b/target/i386/machine.c index 1215e616c8f4..eb657907ca68 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -1272,6 +1272,7 @@ static const VMStateDescription vmstate_xen_vcpu =3D { .fields =3D (VMStateField[]) { VMSTATE_UINT64(env.xen_vcpu_info_gpa, X86CPU), VMSTATE_UINT64(env.xen_vcpu_info_default_gpa, X86CPU), + VMSTATE_UINT64(env.xen_vcpu_time_info_gpa, X86CPU), VMSTATE_END_OF_LIST() } }; --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761627; cv=none; d=zohomail.com; s=zohoarc; b=naWHv8sG/i9zIVO0sR1HrHo1SXbI3oKYsaUg5Tf5Bh8bZqp/tCb0QZE6aFZPWEPYBFgLzYqGtCpzqpbesLXBE5I1tfX8LnunW83iw2oRnHRcJc31zMaprRsIfUcv6YDOgLZpHGyxqL/mMauQ+BNBnw1cBm3MNukfMOg5Oa3AOik= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761627; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=h3PERiA99v5BqZPxeFuaYyRH8F2vcKSdk+7kSyjxX/o=; b=lWSLdPTFdT9r+KDgpTrjvU8LJ1Jf3ehR7XBkWEKLjgAjb+JhBD5m1sMQiV8h1u+m7jiQGAVN98lA2Asxi5MGRZ6PRxIjvUN7wqBBchQ1A/qkEyQNzWMdCvcFv9/i1MJIdZlFn7W7xlXQ/zhJBwDF8bwVgg4tsmTXamzrHgUSeok= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 167776162794665.61412765583975; Thu, 2 Mar 2023 04:53:47 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8d-0003op-1Q; Thu, 02 Mar 2023 07:34:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi66-0000mp-Tl for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:49 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi65-00039C-9S for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:46 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-644-SGcefpDjOiedl9oOWKGHXg-1; Thu, 02 Mar 2023 07:31:43 -0500 Received: by mail-wm1-f70.google.com with SMTP id az12-20020a05600c600c00b003e8910ec2fdso5692777wmb.6 for ; Thu, 02 Mar 2023 04:31:43 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id f6-20020adff586000000b002c56179d39esm15019744wro.44.2023.03.02.04.31.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760304; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h3PERiA99v5BqZPxeFuaYyRH8F2vcKSdk+7kSyjxX/o=; b=N33UfMdNJNrZs0M39VJ69Nfb8zn0f0El+N2oQbkNw3OAVt9xdc/diGms12kMxgixE7onVs okDUUm9Nuo4lx9/blwT26HEaXWwy/9pTmjF98wHyjkudnn3hBm2F/ENSE1/6zYDiKuxV72 ZqocJ5MPgJxNghLf6TX6qRyRnC3dBCw= X-MC-Unique: SGcefpDjOiedl9oOWKGHXg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=h3PERiA99v5BqZPxeFuaYyRH8F2vcKSdk+7kSyjxX/o=; b=i/LPsfiCNG7qYSuL57BAfDT/fDl4l13Qd09hEK5CU0qrISvACd+AUYqBCkWYy3OuFG X9FKKnjjGGJY4qvvWVo9GxIVx/Sd1SheypWmAnP+JagY3ojawgtHa6yZcQgmebr+6O/r 3y2VAO2C2YeaxzvKiNYXeb20+491Fm4U5B8rYU1VdbS8QxigYA0b/6nqpy7ZYxBVqtMf O4DbSr6lAQn3g82JDxiP/OFplA8h1Z3wfFg29SsfEOpDkKncji+q2j1RjhgO3iUcrKcS n51/1ED0nLtxFSMzf49ZiG1Ag8qHnvrCbvERBjC/mwBMxbaoMGI/2Xhv1Se3G78dNjKM a4KA== X-Gm-Message-State: AO0yUKUzVD5xf7DByDJgqM2uqNdGIMoMQiLxHTmqatxbO/6yCIJNtLvf NxeVDhL0TMGiwaDhPdWlhwM36DizYhrUoB9DCENPqO+1eUjd3ad+TNGEXZt0QjnsCrkyUQgBOld OG809YQsdAJtRLqFP74qBQM036hE1MQk7wmeEpI2Q1iFlwIJYRblYdUCPdFTDF6wVJ/Jb13E96/ M= X-Received: by 2002:a05:600c:3ac9:b0:3e7:6a59:d9d3 with SMTP id d9-20020a05600c3ac900b003e76a59d9d3mr7042376wms.37.1677760301712; Thu, 02 Mar 2023 04:31:41 -0800 (PST) X-Google-Smtp-Source: AK7set8nuiWDT6NxYeE5+cp1oP1h/ftCL1f2oeH2g11Au0EGpdOBx8JqaWzxS7dBkJDvhVp7JQCGaA== X-Received: by 2002:a05:600c:3ac9:b0:3e7:6a59:d9d3 with SMTP id d9-20020a05600c3ac900b003e76a59d9d3mr7042364wms.37.1677760301412; Thu, 02 Mar 2023 04:31:41 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 23/62] i386/xen: handle VCPUOP_register_runstate_memory_area Date: Thu, 2 Mar 2023 13:29:50 +0100 Message-Id: <20230302123029.153265-24-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761629104100003 Content-Type: text/plain; charset="utf-8" From: Joao Martins Allow guest to setup the vcpu runstates which is used as steal clock. Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/cpu.h | 1 + target/i386/kvm/xen-emu.c | 57 +++++++++++++++++++++++++++++++++++++++ target/i386/machine.c | 1 + 3 files changed, 59 insertions(+) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 7c39d917e8eb..5613df6d75a8 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1802,6 +1802,7 @@ typedef struct CPUArchState { uint64_t xen_vcpu_info_gpa; uint64_t xen_vcpu_info_default_gpa; uint64_t xen_vcpu_time_info_gpa; + uint64_t xen_vcpu_runstate_gpa; #endif #if defined(CONFIG_HVF) HVFX86LazyFlags hvf_lflags; diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 04832522f5ca..c0a8e4c34e70 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -160,6 +160,7 @@ int kvm_xen_init_vcpu(CPUState *cs) env->xen_vcpu_info_gpa =3D INVALID_GPA; env->xen_vcpu_info_default_gpa =3D INVALID_GPA; env->xen_vcpu_time_info_gpa =3D INVALID_GPA; + env->xen_vcpu_runstate_gpa =3D INVALID_GPA; =20 return 0; } @@ -254,6 +255,17 @@ static void do_set_vcpu_time_info_gpa(CPUState *cs, ru= n_on_cpu_data data) env->xen_vcpu_time_info_gpa); } =20 +static void do_set_vcpu_runstate_gpa(CPUState *cs, run_on_cpu_data data) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + + env->xen_vcpu_runstate_gpa =3D data.host_ulong; + + kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADDR, + env->xen_vcpu_runstate_gpa); +} + static void do_vcpu_soft_reset(CPUState *cs, run_on_cpu_data data) { X86CPU *cpu =3D X86_CPU(cs); @@ -262,10 +274,14 @@ static void do_vcpu_soft_reset(CPUState *cs, run_on_c= pu_data data) env->xen_vcpu_info_gpa =3D INVALID_GPA; env->xen_vcpu_info_default_gpa =3D INVALID_GPA; env->xen_vcpu_time_info_gpa =3D INVALID_GPA; + env->xen_vcpu_runstate_gpa =3D INVALID_GPA; =20 kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, INVALID_GP= A); kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO, INVALID_GPA); + kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADDR, + INVALID_GPA); + } =20 static int xen_set_shared_info(uint64_t gfn) @@ -517,6 +533,35 @@ static int vcpuop_register_vcpu_time_info(CPUState *cs= , CPUState *target, return 0; } =20 +static int vcpuop_register_runstate_info(CPUState *cs, CPUState *target, + uint64_t arg) +{ + struct vcpu_register_runstate_memory_area rma; + uint64_t gpa; + size_t len; + + /* No need for 32/64 compat handling */ + qemu_build_assert(sizeof(rma) =3D=3D 8); + /* The runstate area actually does change size, but Linux copes. */ + + if (!target) { + return -ENOENT; + } + + if (kvm_copy_from_gva(cs, arg, &rma, sizeof(rma))) { + return -EFAULT; + } + + /* As with vcpu_time_info, Xen actually uses the GVA but KVM doesn't. = */ + if (!kvm_gva_to_gpa(cs, rma.addr.p, &gpa, &len, false)) { + return -EFAULT; + } + + async_run_on_cpu(target, do_set_vcpu_runstate_gpa, + RUN_ON_CPU_HOST_ULONG(gpa)); + return 0; +} + static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu, int cmd, int vcpu_id, uint64_t arg) { @@ -525,6 +570,9 @@ static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *= exit, X86CPU *cpu, int err; =20 switch (cmd) { + case VCPUOP_register_runstate_memory_area: + err =3D vcpuop_register_runstate_info(cs, dest, arg); + break; case VCPUOP_register_vcpu_time_memory_area: err =3D vcpuop_register_vcpu_time_info(cs, dest, arg); break; @@ -730,6 +778,15 @@ int kvm_put_xen_state(CPUState *cs) } } =20 + gpa =3D env->xen_vcpu_runstate_gpa; + if (gpa !=3D INVALID_GPA) { + ret =3D kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_= ADDR, + gpa); + if (ret < 0) { + return ret; + } + } + return 0; } =20 diff --git a/target/i386/machine.c b/target/i386/machine.c index eb657907ca68..3f3d436aaaa0 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -1273,6 +1273,7 @@ static const VMStateDescription vmstate_xen_vcpu =3D { VMSTATE_UINT64(env.xen_vcpu_info_gpa, X86CPU), VMSTATE_UINT64(env.xen_vcpu_info_default_gpa, X86CPU), VMSTATE_UINT64(env.xen_vcpu_time_info_gpa, X86CPU), + VMSTATE_UINT64(env.xen_vcpu_runstate_gpa, X86CPU), VMSTATE_END_OF_LIST() } }; --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760549; cv=none; d=zohomail.com; s=zohoarc; b=j1tko4Rz99dsbFLcufnawq25FkWKwxqxOW+lZPTtxMsK5NC02bSvMPT/Sx0xuGRotqueO4UG6baO5+SRT26PkeRTqi8qw/wXngAaFus73ZvhS11/eLVtA0tXIlQ6vRiXfvCZ24+kDN8yzL+1UbNauaTrdyoVAIVXEC0eTVHksi4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760549; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=GEekgL67A2OQXUb7viJzgwaGITaNaMQ6WTyvmaKdRRQ=; b=DoSZIKfbx3Y7OQkJinMwyjZAkd86hd3K5ZR9mCPrUu6XMwPv78SY027UGJTSeNa8BDr6wzbHjPuQlvJ5L/FMxUR/6MPC2o03QPfL/9AWcGMJHkcoF9UgQ1OkTFlkBcc/pQR/N2mqeA+Rp/VwolL7ogTIxx228BaBQ7NRE/g1B2k= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760549558410.66474174620487; Thu, 2 Mar 2023 04:35:49 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi9P-0005DE-TG; Thu, 02 Mar 2023 07:35:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6B-00010d-EB for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:51 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi69-0003AL-Lg for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:51 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-151-3TQeuDX3OgKMSxFGFM5IWw-1; Thu, 02 Mar 2023 07:31:45 -0500 Received: by mail-wm1-f69.google.com with SMTP id j32-20020a05600c1c2000b003e9bdf02c9fso1193284wms.6 for ; Thu, 02 Mar 2023 04:31:45 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id d2-20020adfe842000000b002c552c6c8c2sm15314064wrn.87.2023.03.02.04.31.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760308; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GEekgL67A2OQXUb7viJzgwaGITaNaMQ6WTyvmaKdRRQ=; b=OFGlb93h0+UJhlmxulnyYGjwZXUBXcT2PkOP/YdITE69Kf3suc+Q1mLeeZhUq6MBZwRcVv TfGX+jg6S/hi2n6kfCltZkPWye6UUgH0Igv0gayu97IfnpNf3E4tbnFa00oLfueASOjUd8 i4VYYwwFE8VkG5tjKj2GmVyPgMG25t8= X-MC-Unique: 3TQeuDX3OgKMSxFGFM5IWw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GEekgL67A2OQXUb7viJzgwaGITaNaMQ6WTyvmaKdRRQ=; b=M2fbNf/GhAbGUBuja80pa5yRJs/+hJWhE2ZvGEG/fclG/Uhod1ouUR7+oyGb7zHZjv z8spQFh6KbWHrJ3ZtJFewPsaQC6haYQuqaEFmvdp9hpLqGsp/FJJe07a7Gi1y03CIF9b KfPg5M60U/Ygu7NMu/QLh4LcrJchFhCbyuUIc1y0cjCJVHbVEZy3iNo1JJAQZasOi/NP hS5fP1dspTR0qC7vD9ka+1r9jjWyP6dvtu/n399wvey1QfJ0qZvTDeAkK5i9S4fqD6eh ovAYN7bzCvBCmtdXI5UUFZHjK8zcoNzSe8RVOiebAOAY/wJPWSlPgHsl+XgU9LmIz+p/ HylA== X-Gm-Message-State: AO0yUKUar0YYJpfU3ht7k0jA3YMG1J/7199k89RXyttAZerLVVrxBvM6 wHMV7K+ODadQIBJDkKGRmS5zUm2QuJIzKpHY9OM/vrHPUHsGunvsM4TSwpiQkaBXPke4NJnlgre TuDIYom1Zqz/svp1/3QPjzyPj2itm0Bkh9EfixPHmjWO7KZ/ZdJNEebgP5gYz3ZeLpFY5qnCb/G I= X-Received: by 2002:adf:edc7:0:b0:2c7:a3c:5bd6 with SMTP id v7-20020adfedc7000000b002c70a3c5bd6mr7634306wro.52.1677760304531; Thu, 02 Mar 2023 04:31:44 -0800 (PST) X-Google-Smtp-Source: AK7set+WzV+t7tqK/mKzssMnzRaWeJYcnRfg9ua4tlpMjjTaGUhq7jUqCAxa6ap+1Ci4mNXh/S0LKw== X-Received: by 2002:adf:edc7:0:b0:2c7:a3c:5bd6 with SMTP id v7-20020adfedc7000000b002c70a3c5bd6mr7634289wro.52.1677760304234; Thu, 02 Mar 2023 04:31:44 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 24/62] i386/xen: implement HYPERVISOR_event_channel_op Date: Thu, 2 Mar 2023 13:29:51 +0100 Message-Id: <20230302123029.153265-25-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760551103100001 Content-Type: text/plain; charset="utf-8" From: Joao Martins Signed-off-by: Joao Martins [dwmw2: Ditch event_channel_op_compat which was never available to HVM gues= ts] Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/xen-emu.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index c0a8e4c34e70..ac143c05a441 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -28,6 +28,7 @@ #include "hw/xen/interface/memory.h" #include "hw/xen/interface/hvm/hvm_op.h" #include "hw/xen/interface/vcpu.h" +#include "hw/xen/interface/event_channel.h" =20 #include "xen-compat.h" =20 @@ -588,6 +589,27 @@ static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit = *exit, X86CPU *cpu, return true; } =20 +static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exit *exit, + int cmd, uint64_t arg) +{ + int err =3D -ENOSYS; + + switch (cmd) { + case EVTCHNOP_init_control: + case EVTCHNOP_expand_array: + case EVTCHNOP_set_priority: + /* We do not support FIFO channels at this point */ + err =3D -ENOSYS; + break; + + default: + return false; + } + + exit->u.hcall.result =3D err; + return true; +} + int kvm_xen_soft_reset(void) { CPUState *cpu; @@ -694,6 +716,9 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct = kvm_xen_exit *exit) case __HYPERVISOR_sched_op: return kvm_xen_hcall_sched_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); + case __HYPERVISOR_event_channel_op: + return kvm_xen_hcall_evtchn_op(exit, exit->u.hcall.params[0], + exit->u.hcall.params[1]); case __HYPERVISOR_vcpu_op: return kvm_xen_hcall_vcpu_op(exit, cpu, exit->u.hcall.params[0], --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761027; cv=none; d=zohomail.com; s=zohoarc; b=Mh8/ijGefP6eJqQZiRWrqSPXF/evGORTkAa3S/LIXsS9Sl0nuixHYSBdlXNy/pmv8Ta3Gtsw5dRm/IqNdqV/XXl/6wR3aMUgz9db3LMgIT5x8kRf39GsciaS5tL4rGeoRL78ozqaHHA4IJQM5iRgFnpoCjn1QC6kNKEZzZSPH2k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761027; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=iUu22BXVf+ZRbreJqmfzXzlEonPrzNJdVobwNZIzTgU=; b=WctTl2THx9dmctAKAjHiOkmqKbqyL2eeaSF5GVFwxvbU5jLHJyMyWvbx5QnKISCge18vWEqM89dFFo17PkEuepI2nAs+e9Ed8UN5F0GSMEhmK3pH4LStjha2IyuEjieB/9vPHw/gKP4sSJKN0S+h7VsEbc+/cKYtZsGcfEoGP0M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761027874947.3451276637435; Thu, 2 Mar 2023 04:43:47 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6I-0001OT-Ph; Thu, 02 Mar 2023 07:31:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6C-000153-UA for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:53 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6A-0003Al-UE for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:52 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-636-cqvtmrPSPF2FaBSirpy7ig-1; Thu, 02 Mar 2023 07:31:49 -0500 Received: by mail-wm1-f70.google.com with SMTP id 4-20020a05600c024400b003eb2e295c05so5712480wmj.0 for ; Thu, 02 Mar 2023 04:31:49 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id q18-20020a05600c46d200b003eaee9e0d22sm3096749wmo.33.2023.03.02.04.31.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760310; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=iUu22BXVf+ZRbreJqmfzXzlEonPrzNJdVobwNZIzTgU=; b=KGH33ftEcEQoQY7qPWmJH5wgEP1lfZdcGtgoGsA2MUlOZYMNbo4j2vElbQSiJTWkgGT8LQ AAVO3LlEMJDLTnD1PlkKZa2DS80CG4RPLl0lhq8xZBjh1HdFWvdWlrNhCgIBKx3csyXaT4 eJ3h2FbJfU6MLJ4bje5hW3LPnoGm+EQ= X-MC-Unique: cqvtmrPSPF2FaBSirpy7ig-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iUu22BXVf+ZRbreJqmfzXzlEonPrzNJdVobwNZIzTgU=; b=dOxTyZ10SfkrGnO2jZ0fsrvrpHrKmBUELMJ1FGcn5+y5eTUYTBSFiU+frxGd7TZYAU sO0hch/Cp4neBy9AvkrJSFJWJUA5UNj1xJlT+aFon+qLZCgMU9U3gs+Z2jkJIg/bNmrF PIUavCGCrQS7tJsah0HO2eIOOrQtan4Ut84rPlEyE6Z6bVZ6Ykonx6s0MR/yEkNAhbVH kNdKIzOyUT2qQPv4K7A1pzfVn0d6F/EVnWuT/Ob/AGbH2M9lySyqvJFLG7fO3E+989ST tmo1aogRGsQHemZjvSrHzIY6OGRa2+oYTaxkGoZZgFfsy0234iz6mFMUuaGf/KF4roe0 +gwQ== X-Gm-Message-State: AO0yUKU8s56mMRGEZxX1bGDs8ATVew/+6/i5dXZEi6aW9xPnCFJEO2Nn C0QYZtueSTdISzgaQnyAXIn2vRpRYIinvUAPr5pnGZHWCeP5j0FvayzQqfBQdBw3/+1GVaARRHh kXTQYWYS5YnKJsu6NUJEe7v6DXDQ1BDB/t66quwUnVd2JelAHeHkYRbUs/jvuGduVpHkKQV9t5z 0= X-Received: by 2002:a05:600c:5252:b0:3ea:8ed9:8f03 with SMTP id fc18-20020a05600c525200b003ea8ed98f03mr7513514wmb.24.1677760307581; Thu, 02 Mar 2023 04:31:47 -0800 (PST) X-Google-Smtp-Source: AK7set+XtLEyc0TR+1fBniFlfaN8hHWE15qiKG2sOI6aZrDjWBhE6qXhj+EdAemR298WeznuyaP35g== X-Received: by 2002:a05:600c:5252:b0:3ea:8ed9:8f03 with SMTP id fc18-20020a05600c525200b003ea8ed98f03mr7513494wmb.24.1677760307276; Thu, 02 Mar 2023 04:31:47 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ankur Arora , Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 25/62] i386/xen: implement HVMOP_set_evtchn_upcall_vector Date: Thu, 2 Mar 2023 13:29:52 +0100 Message-Id: <20230302123029.153265-26-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761028219100003 Content-Type: text/plain; charset="utf-8" From: Ankur Arora The HVMOP_set_evtchn_upcall_vector hypercall sets the per-vCPU upcall vector, to be delivered to the local APIC just like an MSI (with an EOI). This takes precedence over the system-wide delivery method set by the HVMOP_set_param hypercall with HVM_PARAM_CALLBACK_IRQ. It's used by Windows and Xen (PV shim) guests but normally not by Linux. Signed-off-by: Ankur Arora Signed-off-by: Joao Martins [dwmw2: Rework for upstream kernel changes and split from HVMOP_set_param] Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/cpu.h | 1 + target/i386/kvm/trace-events | 1 + target/i386/kvm/xen-emu.c | 84 ++++++++++++++++++++++++++++++++++-- target/i386/machine.c | 1 + 4 files changed, 84 insertions(+), 3 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 5613df6d75a8..e882c4e251c1 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1803,6 +1803,7 @@ typedef struct CPUArchState { uint64_t xen_vcpu_info_default_gpa; uint64_t xen_vcpu_time_info_gpa; uint64_t xen_vcpu_runstate_gpa; + uint8_t xen_vcpu_callback_vector; #endif #if defined(CONFIG_HVF) HVFX86LazyFlags hvf_lflags; diff --git a/target/i386/kvm/trace-events b/target/i386/kvm/trace-events index a840e0333de7..b365a8e8e282 100644 --- a/target/i386/kvm/trace-events +++ b/target/i386/kvm/trace-events @@ -11,3 +11,4 @@ kvm_xen_hypercall(int cpu, uint8_t cpl, uint64_t input, u= int64_t a0, uint64_t a1 kvm_xen_soft_reset(void) "" kvm_xen_set_shared_info(uint64_t gfn) "shared info at gfn 0x%" PRIx64 kvm_xen_set_vcpu_attr(int cpu, int type, uint64_t gpa) "vcpu attr cpu %d t= ype %d gpa 0x%" PRIx64 +kvm_xen_set_vcpu_callback(int cpu, int vector) "callback vcpu %d vector %d" diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index ac143c05a441..e9a4422d93f0 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -27,6 +27,7 @@ #include "hw/xen/interface/sched.h" #include "hw/xen/interface/memory.h" #include "hw/xen/interface/hvm/hvm_op.h" +#include "hw/xen/interface/hvm/params.h" #include "hw/xen/interface/vcpu.h" #include "hw/xen/interface/event_channel.h" =20 @@ -193,7 +194,8 @@ static bool kvm_xen_hcall_xen_version(struct kvm_xen_ex= it *exit, X86CPU *cpu, fi.submap |=3D 1 << XENFEAT_writable_page_tables | 1 << XENFEAT_writable_descriptor_tables | 1 << XENFEAT_auto_translated_physmap | - 1 << XENFEAT_supervisor_mode_kernel; + 1 << XENFEAT_supervisor_mode_kernel | + 1 << XENFEAT_hvm_callback_vector; } =20 err =3D kvm_copy_to_gva(CPU(cpu), arg, &fi, sizeof(fi)); @@ -220,6 +222,31 @@ static int kvm_xen_set_vcpu_attr(CPUState *cs, uint16_= t type, uint64_t gpa) return kvm_vcpu_ioctl(cs, KVM_XEN_VCPU_SET_ATTR, &xhsi); } =20 +static int kvm_xen_set_vcpu_callback_vector(CPUState *cs) +{ + uint8_t vector =3D X86_CPU(cs)->env.xen_vcpu_callback_vector; + struct kvm_xen_vcpu_attr xva; + + xva.type =3D KVM_XEN_VCPU_ATTR_TYPE_UPCALL_VECTOR; + xva.u.vector =3D vector; + + trace_kvm_xen_set_vcpu_callback(cs->cpu_index, vector); + + return kvm_vcpu_ioctl(cs, KVM_XEN_HVM_SET_ATTR, &xva); +} + +static void do_set_vcpu_callback_vector(CPUState *cs, run_on_cpu_data data) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + + env->xen_vcpu_callback_vector =3D data.host_int; + + if (kvm_xen_has_cap(EVTCHN_SEND)) { + kvm_xen_set_vcpu_callback_vector(cs); + } +} + static void do_set_vcpu_info_default_gpa(CPUState *cs, run_on_cpu_data dat= a) { X86CPU *cpu =3D X86_CPU(cs); @@ -276,12 +303,16 @@ static void do_vcpu_soft_reset(CPUState *cs, run_on_c= pu_data data) env->xen_vcpu_info_default_gpa =3D INVALID_GPA; env->xen_vcpu_time_info_gpa =3D INVALID_GPA; env->xen_vcpu_runstate_gpa =3D INVALID_GPA; + env->xen_vcpu_callback_vector =3D 0; =20 kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, INVALID_GP= A); kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO, INVALID_GPA); kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADDR, INVALID_GPA); + if (kvm_xen_has_cap(EVTCHN_SEND)) { + kvm_xen_set_vcpu_callback_vector(cs); + } =20 } =20 @@ -458,17 +489,53 @@ static bool kvm_xen_hcall_memory_op(struct kvm_xen_ex= it *exit, X86CPU *cpu, return true; } =20 +static int kvm_xen_hcall_evtchn_upcall_vector(struct kvm_xen_exit *exit, + X86CPU *cpu, uint64_t arg) +{ + struct xen_hvm_evtchn_upcall_vector up; + CPUState *target_cs; + + /* No need for 32/64 compat handling */ + qemu_build_assert(sizeof(up) =3D=3D 8); + + if (kvm_copy_from_gva(CPU(cpu), arg, &up, sizeof(up))) { + return -EFAULT; + } + + if (up.vector < 0x10) { + return -EINVAL; + } + + target_cs =3D qemu_get_cpu(up.vcpu); + if (!target_cs) { + return -EINVAL; + } + + async_run_on_cpu(target_cs, do_set_vcpu_callback_vector, + RUN_ON_CPU_HOST_INT(up.vector)); + return 0; +} + static bool kvm_xen_hcall_hvm_op(struct kvm_xen_exit *exit, X86CPU *cpu, int cmd, uint64_t arg) { + int ret =3D -ENOSYS; switch (cmd) { + case HVMOP_set_evtchn_upcall_vector: + ret =3D kvm_xen_hcall_evtchn_upcall_vector(exit, cpu, + exit->u.hcall.params[0]); + break; + case HVMOP_pagetable_dying: - exit->u.hcall.result =3D -ENOSYS; - return true; + ret =3D -ENOSYS; + break; =20 default: return false; } + + exit->u.hcall.result =3D ret; + return true; } =20 static int vcpuop_register_vcpu_info(CPUState *cs, CPUState *target, @@ -812,6 +879,17 @@ int kvm_put_xen_state(CPUState *cs) } } =20 + if (!kvm_xen_has_cap(EVTCHN_SEND)) { + return 0; + } + + if (env->xen_vcpu_callback_vector) { + ret =3D kvm_xen_set_vcpu_callback_vector(cs); + if (ret < 0) { + return ret; + } + } + return 0; } =20 diff --git a/target/i386/machine.c b/target/i386/machine.c index 3f3d436aaaa0..a4874eda9041 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -1274,6 +1274,7 @@ static const VMStateDescription vmstate_xen_vcpu =3D { VMSTATE_UINT64(env.xen_vcpu_info_default_gpa, X86CPU), VMSTATE_UINT64(env.xen_vcpu_time_info_gpa, X86CPU), VMSTATE_UINT64(env.xen_vcpu_runstate_gpa, X86CPU), + VMSTATE_UINT8(env.xen_vcpu_callback_vector, X86CPU), VMSTATE_END_OF_LIST() } }; --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761714; cv=none; d=zohomail.com; s=zohoarc; b=e5UsSc/BJ0SWr09oAtOqe9Ekq9OyeUWtestzG+rM5HKbvgAUDyHVbfZSboq0UV5Qh1sSjsBc7xiooMJHTwi6kmk9o+E1IwLOi+Uu2pE9+EE0Sorb/5QA5P2YmysEOgy4E2tMSohWhQYldfoX2ByS7X/NjqTv8X9MBUROT78LQTQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761714; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=k5rJBANBTNQoMcPYBk1lEdwItM0lARWYTN87VeLKF/w=; b=WkcG0mNUa/WRbplXetMfMjGVp5JEbIoel372uoOusTPRAPyBuE25FPDVcT8oZ+M4yHnvUpNqlhBkIKQy9G77mQ2/csXM3KaDOPfzkYediq68EZ3v9z5L5tLirj1VcJaX3f6aJECpM5EHfF/IR2W+TGfXRx4Zb7M5Lo9AqB6XN9A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761714489228.2248767196079; Thu, 2 Mar 2023 04:55:14 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi7g-0002vx-1S; Thu, 02 Mar 2023 07:33:24 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6F-0001Ff-47 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:55 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6D-0003BO-Ja for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:54 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-453-3atPxcyRMDaCNmSabmtEUg-1; Thu, 02 Mar 2023 07:31:51 -0500 Received: by mail-wm1-f72.google.com with SMTP id u19-20020a05600c00d300b003eb24ce58ceso5686402wmm.9 for ; Thu, 02 Mar 2023 04:31:51 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id iz12-20020a05600c554c00b003e1f2e43a1csm2847670wmb.48.2023.03.02.04.31.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760313; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=k5rJBANBTNQoMcPYBk1lEdwItM0lARWYTN87VeLKF/w=; b=FE6aakDjZsnkdcYyjjeZwcIxy5/0/L0yWWGYh6lnRDnCRz/eUwoRDdtBmwHd311MT1K7nO ujCCCXxvfydNa3UoUoRuQ+GvL+/VF8b7VlZDjHUnwskHqK6xkxOugN74PIQpa0QzQBj4fE CQjRk+zyhH8TgFua/QPN23y4v8uSEzc= X-MC-Unique: 3atPxcyRMDaCNmSabmtEUg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=k5rJBANBTNQoMcPYBk1lEdwItM0lARWYTN87VeLKF/w=; b=T4rZgJjmP8t5TjMyklQ9GD5w1kRDB33V76dUOCmIp7EDZENMp9yi6zgVPKY87xTKAz YBA71IJytB3V7EEUVswKZO/5+EY2UDMuvuEhANagecLBBuOAn4JWVwOiRnmGNrZbUUMM iksOKhZ3v1RM+xb5hX+H+1By/db0A/nCyiwyci67CDIkjq4to2AUYG14lpWtXAAj+rt0 A/D3jLfCZVCU49zc6twsgWF4WlJf55CWkrwUX3QveU0KH4BdyOmblWwcJxmrrXn+k4YJ AJFCU9eUA2Uj3kQPxj7QO43lwL/K0eZNwT6ukAxpGpDqf6nM3qAn4knLj3Ff1dPninMI BFOA== X-Gm-Message-State: AO0yUKW7JUgUCX8FJPXvzvfbXWjQqjMhWUIspQ8iaAlGr/Tw2HEkvIAS sYKR1hpaeOuXWIiwE5aUwvbXro7SzPhL7Pj6+5Nfirx+IDhT+jpO4KCUV/spiKVrncjCWQaH+SO f0j7NLDULtJnR7iPMkz7Qn5w3X442HzzhPn7smGvX8R8PcGljK8emMLxwE3PmypZFN3tFazynn0 I= X-Received: by 2002:adf:f74a:0:b0:2c7:1b1d:5aa with SMTP id z10-20020adff74a000000b002c71b1d05aamr6984386wrp.19.1677760310504; Thu, 02 Mar 2023 04:31:50 -0800 (PST) X-Google-Smtp-Source: AK7set9xawImKB/sedImxD/xywJHUhy4zQtJ19qiQd6gDxlC7hGlPJUpgdqI1k42OUPmQ/pexBh81A== X-Received: by 2002:adf:f74a:0:b0:2c7:1b1d:5aa with SMTP id z10-20020adff74a000000b002c71b1d05aamr6984367wrp.19.1677760310186; Thu, 02 Mar 2023 04:31:50 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Ankur Arora , Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 26/62] i386/xen: implement HVMOP_set_param Date: Thu, 2 Mar 2023 13:29:53 +0100 Message-Id: <20230302123029.153265-27-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761715557100003 Content-Type: text/plain; charset="utf-8" From: Ankur Arora This is the hook for adding the HVM_PARAM_CALLBACK_IRQ parameter in a subsequent commit. Signed-off-by: Ankur Arora Signed-off-by: Joao Martins [dwmw2: Split out from another commit] Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/xen-emu.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index e9a4422d93f0..ce858ac63ce1 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -489,6 +489,36 @@ static bool kvm_xen_hcall_memory_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, return true; } =20 +static bool handle_set_param(struct kvm_xen_exit *exit, X86CPU *cpu, + uint64_t arg) +{ + CPUState *cs =3D CPU(cpu); + struct xen_hvm_param hp; + int err =3D 0; + + /* No need for 32/64 compat handling */ + qemu_build_assert(sizeof(hp) =3D=3D 16); + + if (kvm_copy_from_gva(cs, arg, &hp, sizeof(hp))) { + err =3D -EFAULT; + goto out; + } + + if (hp.domid !=3D DOMID_SELF && hp.domid !=3D xen_domid) { + err =3D -ESRCH; + goto out; + } + + switch (hp.index) { + default: + return false; + } + +out: + exit->u.hcall.result =3D err; + return true; +} + static int kvm_xen_hcall_evtchn_upcall_vector(struct kvm_xen_exit *exit, X86CPU *cpu, uint64_t arg) { @@ -530,6 +560,9 @@ static bool kvm_xen_hcall_hvm_op(struct kvm_xen_exit *e= xit, X86CPU *cpu, ret =3D -ENOSYS; break; =20 + case HVMOP_set_param: + return handle_set_param(exit, cpu, arg); + default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761838; cv=none; d=zohomail.com; s=zohoarc; b=Q+CYbLxsE91/vk0KlMAKVMW+rF020phBvVyBqTroc1LQJj9FKcLNAzEtBqMvF/twd1/0q/0SWwV7VT2kG9z0Sky1EAfl92H/Hmt1l6I7gLjX237QT6041tvky/Bl+CpEQpi/KecgPlIkinkRk481GDzsw21GOiKhQ59Erg4qQw4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761838; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=/f4n0heKtlgxIGlurgOyqNgr90o1E7VyUCI3AaHXJrE=; b=aR8bIvIh3TGopD8wmVLYLkwRYRL7gu462oK1TT7cIGl2G3viwGwDM+d+U/+4TB4R32dDR73TFwIu8zLUfAjs3AEG4NGAxCgFW4nzi+YTRccjBSABCPkHX3SvAGSz5OjyJnqAk3rgNDEY/Mk6z/OH4idAoOWmNyyQXq0Pdnaz7OI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761838437525.6185897218803; Thu, 2 Mar 2023 04:57:18 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6N-0001xi-E9; Thu, 02 Mar 2023 07:32:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6I-0001MB-Gr for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:58 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6G-0003DE-LH for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:31:58 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-193-eLtvNPgPPv-352Q-eX1J4A-1; Thu, 02 Mar 2023 07:31:55 -0500 Received: by mail-wm1-f71.google.com with SMTP id bi21-20020a05600c3d9500b003e836e354e0so1014454wmb.5 for ; Thu, 02 Mar 2023 04:31:54 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id y14-20020adfee0e000000b002c71b4d476asm15401945wrn.106.2023.03.02.04.31.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760316; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/f4n0heKtlgxIGlurgOyqNgr90o1E7VyUCI3AaHXJrE=; b=BsY2VAEGqKfizpzBr/Uhlkr5iKww7X6xw1yytpride4SNU7ufsQPSoj8Yy23UM0rsiZC2V /T3v6zDJRYTzMWxiFoM8cwlToTPpIRy3aGW3kfjetlL6mFie3eeP8UuNG1XS1hFvJcbXxU wf9ZrIBtVsWOPNjGNrZqt9WFDpJz/bE= X-MC-Unique: eLtvNPgPPv-352Q-eX1J4A-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/f4n0heKtlgxIGlurgOyqNgr90o1E7VyUCI3AaHXJrE=; b=Vp89H9+fY23jWTv5CZQPGlU/jFMCZOC2j5cvrJuPvGxexZVQW4jg0seLVynb8pvJ9s +QJNUkLMOJA/9N5Wphifciv6/b8SP4eQHIsu6+x+XQX64pctVejcNk/+CshzkWY9+a2a KMlPv4jAkK4QC2MSQIRe28hGC8BpSoR2yfIpXzw2i38ukpqWmPg/y15s6WwgNYp3NdQi DwufbXAYSLCSWDb+KhhH1+/wLrDVInspo+a0xHLTjNPcS2x2Jy594OBwWCmxgBl3vSyM Uome68FKKYxtK5tiIRgw3PIoH89SAL6cuQ3xYsq0Nni9Uyg1L+fDByN2UkfJ+3qo+0X/ a5Tw== X-Gm-Message-State: AO0yUKUTHD1eOx06E5cTnIy0zrmXfdJNv0hfomLGh2uVBgMHhoJezuXH mqV8lB/3gOxEnTjt89XWxPAmRtEC/edRXEV1WOevpq4JsiJAUP9+pS0JzADUxAkgpLXPwHlgIWm deyplGJBNaI6O9jKqI1lkhbTzxxEQ7HamWsht4ZEurF/bSuov2KT9YNw+Xxh4aAriXyy3Kfgsb/ 8= X-Received: by 2002:a5d:5101:0:b0:2cc:4dac:fe39 with SMTP id s1-20020a5d5101000000b002cc4dacfe39mr6800579wrt.12.1677760313456; Thu, 02 Mar 2023 04:31:53 -0800 (PST) X-Google-Smtp-Source: AK7set/UaCB894oFYlcQd4hiw0POOFhKfHOVotoQXHzf3ucXU5vJt70Z6U+pHlzKhZJIX1E0kutJUQ== X-Received: by 2002:a5d:5101:0:b0:2cc:4dac:fe39 with SMTP id s1-20020a5d5101000000b002cc4dacfe39mr6800555wrt.12.1677760313127; Thu, 02 Mar 2023 04:31:53 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 27/62] hw/xen: Add xen_evtchn device for event channel emulation Date: Thu, 2 Mar 2023 13:29:54 +0100 Message-Id: <20230302123029.153265-28-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761840510100003 From: David Woodhouse Include basic support for setting HVM_PARAM_CALLBACK_IRQ to the global vector method HVM_PARAM_CALLBACK_TYPE_VECTOR, which is handled in-kernel by raising the vector whenever the vCPU's vcpu_info->evtchn_upcall_pending flag is set. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/meson.build | 5 +- hw/i386/kvm/xen_evtchn.c | 155 ++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 18 +++++ hw/i386/pc.c | 2 + target/i386/kvm/xen-emu.c | 15 ++++ 5 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 hw/i386/kvm/xen_evtchn.c create mode 100644 hw/i386/kvm/xen_evtchn.h diff --git a/hw/i386/kvm/meson.build b/hw/i386/kvm/meson.build index 6165cbf019d6..cab64df33982 100644 --- a/hw/i386/kvm/meson.build +++ b/hw/i386/kvm/meson.build @@ -4,6 +4,9 @@ i386_kvm_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c= ')) i386_kvm_ss.add(when: 'CONFIG_I8254', if_true: files('i8254.c')) i386_kvm_ss.add(when: 'CONFIG_I8259', if_true: files('i8259.c')) i386_kvm_ss.add(when: 'CONFIG_IOAPIC', if_true: files('ioapic.c')) -i386_kvm_ss.add(when: 'CONFIG_XEN_EMU', if_true: files('xen_overlay.c')) +i386_kvm_ss.add(when: 'CONFIG_XEN_EMU', if_true: files( + 'xen_overlay.c', + 'xen_evtchn.c', + )) =20 i386_ss.add_all(when: 'CONFIG_KVM', if_true: i386_kvm_ss) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c new file mode 100644 index 000000000000..9d6f4076ad44 --- /dev/null +++ b/hw/i386/kvm/xen_evtchn.c @@ -0,0 +1,155 @@ +/* + * QEMU Xen emulation: Event channel support + * + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: David Woodhouse + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/host-utils.h" +#include "qemu/module.h" +#include "qemu/main-loop.h" +#include "qapi/error.h" +#include "qom/object.h" +#include "exec/target_page.h" +#include "exec/address-spaces.h" +#include "migration/vmstate.h" + +#include "hw/sysbus.h" +#include "hw/xen/xen.h" +#include "xen_evtchn.h" + +#include "sysemu/kvm.h" +#include "sysemu/kvm_xen.h" +#include + +#include "hw/xen/interface/memory.h" +#include "hw/xen/interface/hvm/params.h" + +#define TYPE_XEN_EVTCHN "xen-evtchn" +OBJECT_DECLARE_SIMPLE_TYPE(XenEvtchnState, XEN_EVTCHN) + +struct XenEvtchnState { + /*< private >*/ + SysBusDevice busdev; + /*< public >*/ + + uint64_t callback_param; + bool evtchn_in_kernel; + + QemuMutex port_lock; +}; + +struct XenEvtchnState *xen_evtchn_singleton; + +/* Top bits of callback_param are the type (HVM_PARAM_CALLBACK_TYPE_xxx) */ +#define CALLBACK_VIA_TYPE_SHIFT 56 + +static int xen_evtchn_post_load(void *opaque, int version_id) +{ + XenEvtchnState *s =3D opaque; + + if (s->callback_param) { + xen_evtchn_set_callback_param(s->callback_param); + } + + return 0; +} + +static bool xen_evtchn_is_needed(void *opaque) +{ + return xen_mode =3D=3D XEN_EMULATE; +} + +static const VMStateDescription xen_evtchn_vmstate =3D { + .name =3D "xen_evtchn", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D xen_evtchn_is_needed, + .post_load =3D xen_evtchn_post_load, + .fields =3D (VMStateField[]) { + VMSTATE_UINT64(callback_param, XenEvtchnState), + VMSTATE_END_OF_LIST() + } +}; + +static void xen_evtchn_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->vmsd =3D &xen_evtchn_vmstate; +} + +static const TypeInfo xen_evtchn_info =3D { + .name =3D TYPE_XEN_EVTCHN, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(XenEvtchnState), + .class_init =3D xen_evtchn_class_init, +}; + +void xen_evtchn_create(void) +{ + XenEvtchnState *s =3D XEN_EVTCHN(sysbus_create_simple(TYPE_XEN_EVTCHN, + -1, NULL)); + xen_evtchn_singleton =3D s; + + qemu_mutex_init(&s->port_lock); +} + +static void xen_evtchn_register_types(void) +{ + type_register_static(&xen_evtchn_info); +} + +type_init(xen_evtchn_register_types) + +int xen_evtchn_set_callback_param(uint64_t param) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + struct kvm_xen_hvm_attr xa =3D { + .type =3D KVM_XEN_ATTR_TYPE_UPCALL_VECTOR, + .u.vector =3D 0, + }; + bool in_kernel =3D false; + int ret; + + if (!s) { + return -ENOTSUP; + } + + qemu_mutex_lock(&s->port_lock); + + switch (param >> CALLBACK_VIA_TYPE_SHIFT) { + case HVM_PARAM_CALLBACK_TYPE_VECTOR: { + xa.u.vector =3D (uint8_t)param, + + ret =3D kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_SET_ATTR, &xa); + if (!ret && kvm_xen_has_cap(EVTCHN_SEND)) { + in_kernel =3D true; + } + break; + } + default: + /* Xen doesn't return error even if you set something bogus */ + ret =3D 0; + break; + } + + if (!ret) { + /* If vector delivery was turned *off* then tell the kernel */ + if ((s->callback_param >> CALLBACK_VIA_TYPE_SHIFT) =3D=3D + HVM_PARAM_CALLBACK_TYPE_VECTOR && !xa.u.vector) { + kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_SET_ATTR, &xa); + } + s->callback_param =3D param; + s->evtchn_in_kernel =3D in_kernel; + } + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h new file mode 100644 index 000000000000..c9b7f9d11f10 --- /dev/null +++ b/hw/i386/kvm/xen_evtchn.h @@ -0,0 +1,18 @@ +/* + * QEMU Xen emulation: Event channel support + * + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: David Woodhouse + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#ifndef QEMU_XEN_EVTCHN_H +#define QEMU_XEN_EVTCHN_H + +void xen_evtchn_create(void); +int xen_evtchn_set_callback_param(uint64_t param); + +#endif /* QEMU_XEN_EVTCHN_H */ diff --git a/hw/i386/pc.c b/hw/i386/pc.c index a316a01b1594..f38e3f1be84a 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -91,6 +91,7 @@ #include "hw/virtio/virtio-pmem-pci.h" #include "hw/virtio/virtio-mem-pci.h" #include "hw/i386/kvm/xen_overlay.h" +#include "hw/i386/kvm/xen_evtchn.h" #include "hw/mem/memory-device.h" #include "sysemu/replay.h" #include "target/i386/cpu.h" @@ -1852,6 +1853,7 @@ int pc_machine_kvm_type(MachineState *machine, const = char *kvm_type) #ifdef CONFIG_XEN_EMU if (xen_mode =3D=3D XEN_EMULATE) { xen_overlay_create(); + xen_evtchn_create(); } #endif return 0; diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index ce858ac63ce1..435c51f625a1 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -22,6 +22,7 @@ #include "sysemu/runstate.h" =20 #include "hw/i386/kvm/xen_overlay.h" +#include "hw/i386/kvm/xen_evtchn.h" =20 #include "hw/xen/interface/version.h" #include "hw/xen/interface/sched.h" @@ -510,6 +511,10 @@ static bool handle_set_param(struct kvm_xen_exit *exit= , X86CPU *cpu, } =20 switch (hp.index) { + case HVM_PARAM_CALLBACK_IRQ: + err =3D xen_evtchn_set_callback_param(hp.value); + xen_set_long_mode(exit->u.hcall.longmode); + break; default: return false; } @@ -719,6 +724,16 @@ int kvm_xen_soft_reset(void) =20 trace_kvm_xen_soft_reset(); =20 + /* + * Zero is the reset/startup state for HVM_PARAM_CALLBACK_IRQ. Strictl= y, + * it maps to HVM_PARAM_CALLBACK_TYPE_GSI with GSI#0, but Xen refuses = to + * to deliver to the timer interrupt and treats that as 'disabled'. + */ + err =3D xen_evtchn_set_callback_param(0); + if (err) { + return err; + } + CPU_FOREACH(cpu) { async_run_on_cpu(cpu, do_vcpu_soft_reset, RUN_ON_CPU_NULL); } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760641; cv=none; d=zohomail.com; s=zohoarc; b=kWfb8+h5+Xr1C4d7Vb1IWQhdUM2wt3seWmMIDtKsNv/ZbFCs9Q3xdqBLo5U5H9UFYliT5cq/iNMJv50kPwBxJkjdB/2ID+XAqucIIlPfFJcQK9oc4CX7z/CwQfZqHoKFhLlawFMCiAHE4ZlMglkB/uIzTjNhyd1kzEZLvmpwUPk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760641; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=gRxuVZGl8h1KqXZTVo8H98oGMzaTj2zrcLO/J2UUgog=; b=VovoelAe5SOmQ3297LEa410OiUVu/fWNIvh2dU2w5xmBQwTBNqBPZw6fIzlGGb4I4opMw5B//A0FvJNbLtqzSvxT7KRMYdv29YcBN2vFUSeNKBtdgbX/j1xqrejceCk/otk7PUul0wJnRBJEqLT3/Iipm97JjP4CVHMMwUXfO7Y= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760641293702.6737262730138; Thu, 2 Mar 2023 04:37:21 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6u-0002eZ-9e; Thu, 02 Mar 2023 07:32:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6N-00020i-7e for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:03 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6L-0003E7-7P for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:02 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-204-vpTajjV8OCipOtNOQfHjmg-1; Thu, 02 Mar 2023 07:31:58 -0500 Received: by mail-wr1-f71.google.com with SMTP id m7-20020a056000008700b002c7047ea429so3199459wrx.21 for ; Thu, 02 Mar 2023 04:31:57 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id l10-20020a7bc44a000000b003e21dcccf9fsm2682467wmi.16.2023.03.02.04.31.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760320; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gRxuVZGl8h1KqXZTVo8H98oGMzaTj2zrcLO/J2UUgog=; b=TbSjVGauRQkR/x+VMWHXY7JTugA9n5Y4Ekm45XuO6P0WcZHn3MtQy0qdKwMVivMqiYSK5F GBH2SffJbvk93XM3duYxbShcxVxrHW7MF0Wd//iqWSR9o8tGvVo66Xt76hX7m8+Zxq3qFl 8y/XuDntr3U7ojPEoGRhoQRmanyua0k= X-MC-Unique: vpTajjV8OCipOtNOQfHjmg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gRxuVZGl8h1KqXZTVo8H98oGMzaTj2zrcLO/J2UUgog=; b=1oMPKEuTOVMPsb4/IAk2IQ0yMabVejHHaOGJ7zwCpo3McVVrR3Ff5S/qYbxlgyoLTO iL4BR+vbj2yvPFEHtGDqI6BmUcL1aha98UxHcPBNsUAUOOvrrjaSq3qI44cPFGu8A5uo 4XyUvIkBtBZKWEUrn5EX14aNeEPx6cpykQma+uFGTQcPDDXHc64hYhomq5QRjlcJXNGk 8kxGJ5aDrtZzX9jO7irsaJqTDJgTAYSzGKgvbj2pH3MnRTlxfSuvUUaqGiJqP58659b/ 6gcvvGukQwWNWoN1pAAgo2RN01ri/PAWeT+0x8UhZEMXwozos9NmtJIjPTuQMtRP7lt3 8ZTg== X-Gm-Message-State: AO0yUKXNh7E0T17LQG8fOMzKOD8kukf0jWq0sDM68QTctNlGNm8AOH2H SgZOU2zFykZ7IMhssfWYNB/vQqPtMROnxVrNgWkPA/KGpuVTsU228M71gz4UZ0PHLusumQsvHLU 87Byphe28vp1FuUmUwovgNUpoLOpryUB3DHICyVdcknkLTqJ4XNT7JKBec+DlOyaAhZZ5RcKSlC Q= X-Received: by 2002:adf:f34e:0:b0:2c3:dd81:49ad with SMTP id e14-20020adff34e000000b002c3dd8149admr7439773wrp.33.1677760316181; Thu, 02 Mar 2023 04:31:56 -0800 (PST) X-Google-Smtp-Source: AK7set8zIWKSs2SRXciyt57uVT3Ewmnu45+h4rumYDmelaOmbrxmMosQfppJRGC7wKRy6K0042bPsA== X-Received: by 2002:adf:f34e:0:b0:2c3:dd81:49ad with SMTP id e14-20020adff34e000000b002c3dd8149admr7439760wrp.33.1677760315846; Thu, 02 Mar 2023 04:31:55 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 28/62] i386/xen: Add support for Xen event channel delivery to vCPU Date: Thu, 2 Mar 2023 13:29:55 +0100 Message-Id: <20230302123029.153265-29-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760641493100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse The kvm_xen_inject_vcpu_callback_vector() function will either deliver the per-vCPU local APIC vector (as an MSI), or just kick the vCPU out of the kernel to trigger KVM's automatic delivery of the global vector. Support for asserting the GSI/PCI_INTX callbacks will come later. Also add kvm_xen_get_vcpu_info_hva() which returns the vcpu_info of a given vCPU. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- include/sysemu/kvm_xen.h | 2 + target/i386/cpu.h | 2 + target/i386/kvm/xen-emu.c | 94 ++++++++++++++++++++++++++++++++++++--- 3 files changed, 92 insertions(+), 6 deletions(-) diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h index cec21c8fab2f..644c7d889c6b 100644 --- a/include/sysemu/kvm_xen.h +++ b/include/sysemu/kvm_xen.h @@ -21,6 +21,8 @@ =20 int kvm_xen_soft_reset(void); uint32_t kvm_xen_get_caps(void); +void *kvm_xen_get_vcpu_info_hva(uint32_t vcpu_id); +void kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu_id, int type); =20 #define kvm_xen_has_cap(cap) (!!(kvm_xen_get_caps() & \ KVM_XEN_HVM_CONFIG_ ## cap)) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index e882c4e251c1..1c7603221dc6 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1799,6 +1799,8 @@ typedef struct CPUArchState { #endif #if defined(CONFIG_KVM) struct kvm_nested_state *nested_state; + MemoryRegion *xen_vcpu_info_mr; + void *xen_vcpu_info_hva; uint64_t xen_vcpu_info_gpa; uint64_t xen_vcpu_info_default_gpa; uint64_t xen_vcpu_time_info_gpa; diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 435c51f625a1..1b319e8bad69 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -21,6 +21,8 @@ #include "trace.h" #include "sysemu/runstate.h" =20 +#include "hw/pci/msi.h" +#include "hw/i386/apic-msidef.h" #include "hw/i386/kvm/xen_overlay.h" #include "hw/i386/kvm/xen_evtchn.h" =20 @@ -248,6 +250,43 @@ static void do_set_vcpu_callback_vector(CPUState *cs, = run_on_cpu_data data) } } =20 +static int set_vcpu_info(CPUState *cs, uint64_t gpa) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + MemoryRegionSection mrs =3D { .mr =3D NULL }; + void *vcpu_info_hva =3D NULL; + int ret; + + ret =3D kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, gp= a); + if (ret || gpa =3D=3D INVALID_GPA) { + goto out; + } + + mrs =3D memory_region_find(get_system_memory(), gpa, + sizeof(struct vcpu_info)); + if (mrs.mr && mrs.mr->ram_block && + !int128_lt(mrs.size, int128_make64(sizeof(struct vcpu_info)))) { + vcpu_info_hva =3D qemu_map_ram_ptr(mrs.mr->ram_block, + mrs.offset_within_region); + } + if (!vcpu_info_hva) { + if (mrs.mr) { + memory_region_unref(mrs.mr); + mrs.mr =3D NULL; + } + ret =3D -EINVAL; + } + + out: + if (env->xen_vcpu_info_mr) { + memory_region_unref(env->xen_vcpu_info_mr); + } + env->xen_vcpu_info_hva =3D vcpu_info_hva; + env->xen_vcpu_info_mr =3D mrs.mr; + return ret; +} + static void do_set_vcpu_info_default_gpa(CPUState *cs, run_on_cpu_data dat= a) { X86CPU *cpu =3D X86_CPU(cs); @@ -257,8 +296,7 @@ static void do_set_vcpu_info_default_gpa(CPUState *cs, = run_on_cpu_data data) =20 /* Changing the default does nothing if a vcpu_info was explicitly set= . */ if (env->xen_vcpu_info_gpa =3D=3D INVALID_GPA) { - kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, - env->xen_vcpu_info_default_gpa); + set_vcpu_info(cs, env->xen_vcpu_info_default_gpa); } } =20 @@ -269,8 +307,52 @@ static void do_set_vcpu_info_gpa(CPUState *cs, run_on_= cpu_data data) =20 env->xen_vcpu_info_gpa =3D data.host_ulong; =20 - kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, - env->xen_vcpu_info_gpa); + set_vcpu_info(cs, env->xen_vcpu_info_gpa); +} + +void *kvm_xen_get_vcpu_info_hva(uint32_t vcpu_id) +{ + CPUState *cs =3D qemu_get_cpu(vcpu_id); + if (!cs) { + return NULL; + } + + return X86_CPU(cs)->env.xen_vcpu_info_hva; +} + +void kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu_id, int type) +{ + CPUState *cs =3D qemu_get_cpu(vcpu_id); + uint8_t vector; + + if (!cs) { + return; + } + + vector =3D X86_CPU(cs)->env.xen_vcpu_callback_vector; + if (vector) { + /* + * The per-vCPU callback vector injected via lapic. Just + * deliver it as an MSI. + */ + MSIMessage msg =3D { + .address =3D APIC_DEFAULT_ADDRESS | X86_CPU(cs)->apic_id, + .data =3D vector | (1UL << MSI_DATA_LEVEL_SHIFT), + }; + kvm_irqchip_send_msi(kvm_state, msg); + return; + } + + switch (type) { + case HVM_PARAM_CALLBACK_TYPE_VECTOR: + /* + * If the evtchn_upcall_pending field in the vcpu_info is set, then + * KVM will automatically deliver the vector on entering the vCPU + * so all we have to do is kick it out. + */ + qemu_cpu_kick(cs); + break; + } } =20 static void do_set_vcpu_time_info_gpa(CPUState *cs, run_on_cpu_data data) @@ -306,7 +388,7 @@ static void do_vcpu_soft_reset(CPUState *cs, run_on_cpu= _data data) env->xen_vcpu_runstate_gpa =3D INVALID_GPA; env->xen_vcpu_callback_vector =3D 0; =20 - kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO, INVALID_GP= A); + set_vcpu_info(cs, INVALID_GPA); kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO, INVALID_GPA); kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_RUNSTATE_ADDR, @@ -903,7 +985,7 @@ int kvm_put_xen_state(CPUState *cs) } =20 if (gpa !=3D INVALID_GPA) { - ret =3D kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO= , gpa); + ret =3D set_vcpu_info(cs, gpa); if (ret < 0) { return ret; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761450; cv=none; d=zohomail.com; s=zohoarc; b=ehrVM3M3KrhX63wlcZJiOilBqzXIEqM+auoIqWd6J8Q/TWiZ3sBrNPsNUOpl0anK6eYqva4Fmd/QrT/Iy+xL6YGpW6tIRN20CP0bxbDppyqwrzkVerfnqzagsIbmeWr6TrDvdeivm3hPYX/6i9heHdneFgtNqNIZBPDiqXkRoDg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761450; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=XqLTIkYoYhWQRiyItM2Zkh56OP3oFj18fIhn6GWDMlA=; b=jbrDkc61tE/QZTqM9oaa6Jq91icIxsOLjj3EH1jb2led/AOAIiHsiii4lKtU8C71EVWGmpj3wd67ADSvxh6qPt8Uy9e1JKMZHE8UU2+jlwcRO+8PR81omMy+DGaJVTboICLid8HNbyq6Vi0JyT+HY+LNcVOKW2iEpOB7XQpWIy0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761450723585.5866807786547; Thu, 2 Mar 2023 04:50:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiAB-000621-LY; Thu, 02 Mar 2023 07:36:00 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6S-0002HR-GH for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:08 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6M-0003ES-Q7 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:04 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-465-KQ5H39kWPpKlGUeMPKykkA-1; Thu, 02 Mar 2023 07:32:01 -0500 Received: by mail-wm1-f72.google.com with SMTP id 4-20020a05600c024400b003eb2e295c05so5712675wmj.0 for ; Thu, 02 Mar 2023 04:32:00 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id d16-20020adff850000000b002c55306f6edsm15064822wrq.54.2023.03.02.04.31.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:31:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760322; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XqLTIkYoYhWQRiyItM2Zkh56OP3oFj18fIhn6GWDMlA=; b=bvXkCylgSprUoz7SPDm3/mlmPi72ImcMfS2Y/ALf5uZTsfG016+mSkkQJj2uOVtyF6q32v TIVZ3LUVXcdj7MB0Q/NFltFvqaXEnGxQfIcRl8x+Bst3iRcEOK3kRXvTRJKxBV/cpuBKyq XG3G7BpIdvQB/hRgOOooa4VLmuNUFxQ= X-MC-Unique: KQ5H39kWPpKlGUeMPKykkA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=XqLTIkYoYhWQRiyItM2Zkh56OP3oFj18fIhn6GWDMlA=; b=EFjkz4B3/bszxke/IsvZ6F5NPG+4y3WuEmGlXn6nZD5NyLIVwLdnNOuot/mP6FxRkS HQ+wq2JkaD6ysF5GKp1bMxZTQ1N7GCXi7yDVgmVix6+Lnm0vfEkv5Wr6Fm7bvQTjJvm3 Uy2zkhlE2R+W77ikG0nRdPLXjyklxx/Me94KK2kVHoMV8fBuNxWYAcM7utOSOgB5+731 yYuUQtJcLXxiBjo61PX8Duh1x9+xoD4JMM0r+KbD2k9Wzpx+CcSKw4XPlXR2/DsJ72di Ep9jdPgWvhAxzd/vHsTL9xsPS/IfSAzXLaf8VoDVlBaOIP0xy2UrJPp6BJUTVGJci9PJ 3rEw== X-Gm-Message-State: AO0yUKWZQitn5KJnQN3ghR1vG1zU5JR3udOsZhv8s7vo1deTprHqhu7R bcOBymD7dBn7Ts5ksvd1BCMMPsDdfEKoTieWit6isUxwj1+lgSMT13AEX9YjRPsKG8lUh/GE68O EKP7cANtxhQPWziRDCS8EeEgvt33digV4Z/kSwuFVnsWQgnBcORSte5WzuBIqQv95yFLgGpwJlb Y= X-Received: by 2002:a5d:4d43:0:b0:2c7:1e43:f46e with SMTP id a3-20020a5d4d43000000b002c71e43f46emr7790121wru.37.1677760319306; Thu, 02 Mar 2023 04:31:59 -0800 (PST) X-Google-Smtp-Source: AK7set9vDwDi0bTrE77lNk5jc879knHYYEtwwoflpUKKlZgaLuJELw5CobvIz2PAzZWH33nviYMm1Q== X-Received: by 2002:a5d:4d43:0:b0:2c7:1e43:f46e with SMTP id a3-20020a5d4d43000000b002c71e43f46emr7790100wru.37.1677760318888; Thu, 02 Mar 2023 04:31:58 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 29/62] hw/xen: Implement EVTCHNOP_status Date: Thu, 2 Mar 2023 13:29:56 +0100 Message-Id: <20230302123029.153265-30-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761452793100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse This adds the basic structure for maintaining the port table and reporting the status of ports therein. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 104 ++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 3 ++ target/i386/kvm/xen-emu.c | 20 +++++++- 3 files changed, 125 insertions(+), 2 deletions(-) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index 9d6f4076ad44..8bed33890f53 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -22,6 +22,7 @@ #include "hw/sysbus.h" #include "hw/xen/xen.h" #include "xen_evtchn.h" +#include "xen_overlay.h" =20 #include "sysemu/kvm.h" #include "sysemu/kvm_xen.h" @@ -33,6 +34,22 @@ #define TYPE_XEN_EVTCHN "xen-evtchn" OBJECT_DECLARE_SIMPLE_TYPE(XenEvtchnState, XEN_EVTCHN) =20 +typedef struct XenEvtchnPort { + uint32_t vcpu; /* Xen/ACPI vcpu_id */ + uint16_t type; /* EVTCHNSTAT_xxxx */ + uint16_t type_val; /* pirq# / virq# / remote port according to type */ +} XenEvtchnPort; + +#define COMPAT_EVTCHN_2L_NR_CHANNELS 1024 + +/* + * For unbound/interdomain ports there are only two possible remote + * domains; self and QEMU. Use a single high bit in type_val for that, + * and the low bits for the remote port number (or 0 for unbound). + */ +#define PORT_INFO_TYPEVAL_REMOTE_QEMU 0x8000 +#define PORT_INFO_TYPEVAL_REMOTE_PORT_MASK 0x7FFF + struct XenEvtchnState { /*< private >*/ SysBusDevice busdev; @@ -42,6 +59,8 @@ struct XenEvtchnState { bool evtchn_in_kernel; =20 QemuMutex port_lock; + uint32_t nr_ports; + XenEvtchnPort port_table[EVTCHN_2L_NR_CHANNELS]; }; =20 struct XenEvtchnState *xen_evtchn_singleton; @@ -65,6 +84,18 @@ static bool xen_evtchn_is_needed(void *opaque) return xen_mode =3D=3D XEN_EMULATE; } =20 +static const VMStateDescription xen_evtchn_port_vmstate =3D { + .name =3D "xen_evtchn_port", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(vcpu, XenEvtchnPort), + VMSTATE_UINT16(type, XenEvtchnPort), + VMSTATE_UINT16(type_val, XenEvtchnPort), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription xen_evtchn_vmstate =3D { .name =3D "xen_evtchn", .version_id =3D 1, @@ -73,6 +104,9 @@ static const VMStateDescription xen_evtchn_vmstate =3D { .post_load =3D xen_evtchn_post_load, .fields =3D (VMStateField[]) { VMSTATE_UINT64(callback_param, XenEvtchnState), + VMSTATE_UINT32(nr_ports, XenEvtchnState), + VMSTATE_STRUCT_VARRAY_UINT32(port_table, XenEvtchnState, nr_ports,= 1, + xen_evtchn_port_vmstate, XenEvtchnPor= t), VMSTATE_END_OF_LIST() } }; @@ -153,3 +187,73 @@ int xen_evtchn_set_callback_param(uint64_t param) =20 return ret; } + +static bool valid_port(evtchn_port_t port) +{ + if (!port) { + return false; + } + + if (xen_is_long_mode()) { + return port < EVTCHN_2L_NR_CHANNELS; + } else { + return port < COMPAT_EVTCHN_2L_NR_CHANNELS; + } +} + +int xen_evtchn_status_op(struct evtchn_status *status) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + XenEvtchnPort *p; + + if (!s) { + return -ENOTSUP; + } + + if (status->dom !=3D DOMID_SELF && status->dom !=3D xen_domid) { + return -ESRCH; + } + + if (!valid_port(status->port)) { + return -EINVAL; + } + + qemu_mutex_lock(&s->port_lock); + + p =3D &s->port_table[status->port]; + + status->status =3D p->type; + status->vcpu =3D p->vcpu; + + switch (p->type) { + case EVTCHNSTAT_unbound: + if (p->type_val & PORT_INFO_TYPEVAL_REMOTE_QEMU) { + status->u.unbound.dom =3D DOMID_QEMU; + } else { + status->u.unbound.dom =3D xen_domid; + } + break; + + case EVTCHNSTAT_interdomain: + if (p->type_val & PORT_INFO_TYPEVAL_REMOTE_QEMU) { + status->u.interdomain.dom =3D DOMID_QEMU; + } else { + status->u.interdomain.dom =3D xen_domid; + } + + status->u.interdomain.port =3D p->type_val & + PORT_INFO_TYPEVAL_REMOTE_PORT_MASK; + break; + + case EVTCHNSTAT_pirq: + status->u.pirq =3D p->type_val; + break; + + case EVTCHNSTAT_virq: + status->u.virq =3D p->type_val; + break; + } + + qemu_mutex_unlock(&s->port_lock); + return 0; +} diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index c9b7f9d11f10..76467636eed7 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -15,4 +15,7 @@ void xen_evtchn_create(void); int xen_evtchn_set_callback_param(uint64_t param); =20 +struct evtchn_status; +int xen_evtchn_status_op(struct evtchn_status *status); + #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 1b319e8bad69..45fac5ea03bd 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -776,9 +776,10 @@ static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit = *exit, X86CPU *cpu, return true; } =20 -static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exit *exit, +static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exit *exit, X86CPU *cpu, int cmd, uint64_t arg) { + CPUState *cs =3D CPU(cpu); int err =3D -ENOSYS; =20 switch (cmd) { @@ -789,6 +790,21 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, err =3D -ENOSYS; break; =20 + case EVTCHNOP_status: { + struct evtchn_status status; + + qemu_build_assert(sizeof(status) =3D=3D 24); + if (kvm_copy_from_gva(cs, arg, &status, sizeof(status))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_status_op(&status); + if (!err && kvm_copy_to_gva(cs, arg, &status, sizeof(status))) { + err =3D -EFAULT; + } + break; + } default: return false; } @@ -914,7 +930,7 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct = kvm_xen_exit *exit) return kvm_xen_hcall_sched_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); case __HYPERVISOR_event_channel_op: - return kvm_xen_hcall_evtchn_op(exit, exit->u.hcall.params[0], + return kvm_xen_hcall_evtchn_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); case __HYPERVISOR_vcpu_op: return kvm_xen_hcall_vcpu_op(exit, cpu, --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761588; cv=none; d=zohomail.com; s=zohoarc; b=YLnqqasL/6q+4597xAe2dLkoDV0vK/pwQSZEjSo/WAn8+eYQjNhoH241OHcJN+ZiYy2Y22dMlRgVD7ZzMRKUtaIccIo9byRS0eTnOedRAozudR+u2lmWqHwuVDIVd3NunahNhcp6zZbhjARg/RR+8i/ihXUMKAhqcx/1OBo28QE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761588; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=p045YGNsUkHLlYlprLAAlEdm8b7gdb975n9yXq24B9I=; b=kF2eAY/DW6zwdDWG5taxihhNlF/JmyfMPsUQDvO6cawtA9KW6SSM0gOznSj0t8mJ23HGv+qWfgFKu9dV+t5MFDLILqYuBF9ULj81rF4buiDKTJF/5fwAwbgrUe62BYfI6SB4YOfTAViIDmBlotdo34GBJ11Fhk0rCS/iwFcT2VY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761588649896.1687788983899; Thu, 2 Mar 2023 04:53:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8i-0003uV-H7; Thu, 02 Mar 2023 07:34:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6Z-0002Tv-HY for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:20 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6X-0003GB-3x for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:14 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-55-QttC81poPHe4QVqVy3IXFw-1; Thu, 02 Mar 2023 07:32:03 -0500 Received: by mail-wm1-f69.google.com with SMTP id l20-20020a05600c1d1400b003e10d3e1c23so1208305wms.1 for ; Thu, 02 Mar 2023 04:32:03 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id v16-20020a05600c471000b003e9ded91c27sm3215782wmo.4.2023.03.02.04.32.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760332; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=p045YGNsUkHLlYlprLAAlEdm8b7gdb975n9yXq24B9I=; b=an9znq3FMijRxqlnbdv3TvUaLdslgfTtzmgo8fHkakvQSmQC61aNAMRNrKxF8M98L5Kf9b DzwYoA/h5p4VbqO5mK29XH1NcWnAq0nRDi7f1K6bfDjzteO6ryTCOfj91QZJOdeYHRhHpR rWHjA5kMUuC7gvmNRAicNkJmdqaDYlI= X-MC-Unique: QttC81poPHe4QVqVy3IXFw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=p045YGNsUkHLlYlprLAAlEdm8b7gdb975n9yXq24B9I=; b=TN3bfHTuHEwv3bKUC/yWeEnaPfCAg7wqwyMbzulOHYPHoFUrCesQrRYOggfrkyHTqO wyW3CDTBuCmLfyvmKzjAY9/yiQtuy+D3rKTjWqE+OB4PxoEYsG9jUVgINctlcP++iJFe rRqoDDHPdLMYqIgxDwxvRSrQe7Q5keznePi9X5gt9CjSp+FnBv22mACMBgTn8P1CrQs3 KfUxYU77M427oy6fv02pXXUPbmmGpp3mZWgOl10hypcpCie3I/TV11/YmLMrNu3MfAux ctCuWM87AK/ugU94QDeYJFLOjNN9838KaZZ/ZkZaDRB0Lto4X4g2eWJeWBFcs9r8iaOI tuZw== X-Gm-Message-State: AO0yUKUTYaukBCFFJr/ZdlwOhOwPemgEtwQJv8RNUyjZD9qJ4CJucCv2 MGQ0Bm5rLt8s2OgwkSkLLUQZmSyl8kdEugiSdetwPd0lYHIjyuZpRw9K+WFAO9WWujuhRLhW4CJ v1gl1YYf5Ib3vx8SiRZDXdgza2tWJhY0fl2vKdyfoAAMgKMuvgVMlaUI70prJdiXhXNDp5dSnZF c= X-Received: by 2002:a05:600c:164a:b0:3eb:4cb5:dfa with SMTP id o10-20020a05600c164a00b003eb4cb50dfamr7373161wmn.31.1677760322176; Thu, 02 Mar 2023 04:32:02 -0800 (PST) X-Google-Smtp-Source: AK7set8DvfZ/BGEd9eMtuKpFW0d1J5sz7ClMPh8H3iTc5YlsQPGR0lDbJ1Ki7irzve6CP9UHLBPCQg== X-Received: by 2002:a05:600c:164a:b0:3eb:4cb5:dfa with SMTP id o10-20020a05600c164a00b003eb4cb50dfamr7373144wmn.31.1677760321852; Thu, 02 Mar 2023 04:32:01 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 30/62] hw/xen: Implement EVTCHNOP_close Date: Thu, 2 Mar 2023 13:29:57 +0100 Message-Id: <20230302123029.153265-31-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761588878100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse It calls an internal close_port() helper which will also be used from EVTCHNOP_reset and will actually do the work to disconnect/unbind a port once any of that is actually implemented in the first place. That in turn calls a free_port() internal function which will be in error paths after allocation. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 123 ++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 2 + target/i386/kvm/xen-emu.c | 12 ++++ 3 files changed, 137 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index 8bed33890f53..c57d36b492e0 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -21,6 +21,7 @@ =20 #include "hw/sysbus.h" #include "hw/xen/xen.h" + #include "xen_evtchn.h" #include "xen_overlay.h" =20 @@ -40,6 +41,41 @@ typedef struct XenEvtchnPort { uint16_t type_val; /* pirq# / virq# / remote port according to type */ } XenEvtchnPort; =20 +/* 32-bit compatibility definitions, also used natively in 32-bit build */ +struct compat_arch_vcpu_info { + unsigned int cr2; + unsigned int pad[5]; +}; + +struct compat_vcpu_info { + uint8_t evtchn_upcall_pending; + uint8_t evtchn_upcall_mask; + uint16_t pad; + uint32_t evtchn_pending_sel; + struct compat_arch_vcpu_info arch; + struct vcpu_time_info time; +}; /* 64 bytes (x86) */ + +struct compat_arch_shared_info { + unsigned int max_pfn; + unsigned int pfn_to_mfn_frame_list_list; + unsigned int nmi_reason; + unsigned int p2m_cr3; + unsigned int p2m_vaddr; + unsigned int p2m_generation; + uint32_t wc_sec_hi; +}; + +struct compat_shared_info { + struct compat_vcpu_info vcpu_info[XEN_LEGACY_MAX_VCPUS]; + uint32_t evtchn_pending[32]; + uint32_t evtchn_mask[32]; + uint32_t wc_version; /* Version counter: see vcpu_time_info_t. */ + uint32_t wc_sec; + uint32_t wc_nsec; + struct compat_arch_shared_info arch; +}; + #define COMPAT_EVTCHN_2L_NR_CHANNELS 1024 =20 /* @@ -257,3 +293,90 @@ int xen_evtchn_status_op(struct evtchn_status *status) qemu_mutex_unlock(&s->port_lock); return 0; } + +static int clear_port_pending(XenEvtchnState *s, evtchn_port_t port) +{ + void *p =3D xen_overlay_get_shinfo_ptr(); + + if (!p) { + return -ENOTSUP; + } + + if (xen_is_long_mode()) { + struct shared_info *shinfo =3D p; + const int bits_per_word =3D BITS_PER_BYTE * sizeof(shinfo->evtchn_= pending[0]); + typeof(shinfo->evtchn_pending[0]) mask; + int idx =3D port / bits_per_word; + int offset =3D port % bits_per_word; + + mask =3D 1UL << offset; + + qatomic_fetch_and(&shinfo->evtchn_pending[idx], ~mask); + } else { + struct compat_shared_info *shinfo =3D p; + const int bits_per_word =3D BITS_PER_BYTE * sizeof(shinfo->evtchn_= pending[0]); + typeof(shinfo->evtchn_pending[0]) mask; + int idx =3D port / bits_per_word; + int offset =3D port % bits_per_word; + + mask =3D 1UL << offset; + + qatomic_fetch_and(&shinfo->evtchn_pending[idx], ~mask); + } + return 0; +} + +static void free_port(XenEvtchnState *s, evtchn_port_t port) +{ + s->port_table[port].type =3D EVTCHNSTAT_closed; + s->port_table[port].type_val =3D 0; + s->port_table[port].vcpu =3D 0; + + if (s->nr_ports =3D=3D port + 1) { + do { + s->nr_ports--; + } while (s->nr_ports && + s->port_table[s->nr_ports - 1].type =3D=3D EVTCHNSTAT_clo= sed); + } + + /* Clear pending event to avoid unexpected behavior on re-bind. */ + clear_port_pending(s, port); +} + +static int close_port(XenEvtchnState *s, evtchn_port_t port) +{ + XenEvtchnPort *p =3D &s->port_table[port]; + + switch (p->type) { + case EVTCHNSTAT_closed: + return -ENOENT; + + default: + break; + } + + free_port(s, port); + return 0; +} + +int xen_evtchn_close_op(struct evtchn_close *close) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (!valid_port(close->port)) { + return -EINVAL; + } + + qemu_mutex_lock(&s->port_lock); + + ret =3D close_port(s, close->port); + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 76467636eed7..cb3924941a57 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -16,6 +16,8 @@ void xen_evtchn_create(void); int xen_evtchn_set_callback_param(uint64_t param); =20 struct evtchn_status; +struct evtchn_close; int xen_evtchn_status_op(struct evtchn_status *status); +int xen_evtchn_close_op(struct evtchn_close *close); =20 #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 45fac5ea03bd..fab7d6b6a914 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -805,6 +805,18 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, } break; } + case EVTCHNOP_close: { + struct evtchn_close close; + + qemu_build_assert(sizeof(close) =3D=3D 4); + if (kvm_copy_from_gva(cs, arg, &close, sizeof(close))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_close_op(&close); + break; + } default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761517; cv=none; d=zohomail.com; s=zohoarc; b=GkkuIgQM0DnI0haV2tYbF5g6tWSpjQjS5ua4zK3/5ZPhCfro9EXX+pThaLfYNd50SFvoQTYju/QuCcWSMuHEJxtxvDKxS/peQfwMgh5/lmjnVXAMW73JP/4GLEjjWDRjzv9JHZTZ6NqDBTZ0PzpbLwqVeLN/qFgpRIyALHI2ZHY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761517; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=bkYeojCCCHHlvA0WltcLcHJjtzQOyBV1IjUcPXVnKMA=; b=IY7/NuwY9t41xZETuYCPHccjPNOCSSvL/0BmvKTqYKZob/D/W3Ijd7d5UG1M2eB95h5OzqZF0LHyEQ5leWrjN0c7zAmLpdeC9guj/2BforDsx5dgwVcCXfpAdaW82oJm9NIxeRW8qckRArlaIQdjYrs8M0wQcZ/BRh2fmUzebBU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761517428685.8002820120978; Thu, 2 Mar 2023 04:51:57 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8K-0003Vq-07; Thu, 02 Mar 2023 07:34:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6U-0002PV-IT for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:11 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6S-0003FY-Fv for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:10 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-515-YgVelCr3MUaDGVMW6KTzzg-1; Thu, 02 Mar 2023 07:32:06 -0500 Received: by mail-wm1-f70.google.com with SMTP id j6-20020a05600c1c0600b003eaf882cb85so1009585wms.9 for ; Thu, 02 Mar 2023 04:32:06 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id h22-20020a05600c351600b003daf6e3bc2fsm6107711wmq.1.2023.03.02.04.32.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760327; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bkYeojCCCHHlvA0WltcLcHJjtzQOyBV1IjUcPXVnKMA=; b=OOXrVZwERah/SNSV3PFNlahnS9NfiHDLJvZvdKLWRwMsH7B99bSuKufLpU7k8KTViHZ4TT Sa2CXvGC5NGXSkFfneTIZfdtYAcVEIKZouznfSduPY+NgcUWhxgU8j9ngAvCxf4YvBDkIb uE/nmGa8CZlHPL9iAvJPM1XCI+YPiQc= X-MC-Unique: YgVelCr3MUaDGVMW6KTzzg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bkYeojCCCHHlvA0WltcLcHJjtzQOyBV1IjUcPXVnKMA=; b=v/yyWpbb0b8Y+ufXEdA142WxdPMHCchbgHbiVTPcoZAkntnrqrjLyScFTTIIi8viBw tI8RPoenIxeln+2A9k4a6RhRTaOk4qov0t94pdW2M+pZsJEBzIQLVpthoocgkRXMddnA k8Vygu1bbNPqh5kipQgN9W8yMqcX6+Znade3zlDOBwseLJeIISN68FsA4VE0wztHyp5T I6//6CtYQnafh72FO6s9vxOLkf5KahwbLi5c/+PsvNE0LuRzquvcefX6NmYUoFYQbhEh dXBMgQURry7I4hKmw/A0YhSRdXNKjeDgNQ0qMkyScvpfT802akASvM5V0mxuHfFMIKRW 9oEA== X-Gm-Message-State: AO0yUKU0EWWfmazDfSHbQrUvyCu5eTwWt+D6jNjWp+Q1tCbjTxe3ieOC tONzFrChPlKG1/7NfqJOyPAVx8KfJfV3ndsVfwcCMNoYMQCLXrTwDUj+nzYnHzTbUTEOAcMxg5e tp0gZrrH4YHQyE80tSywZ6P+fBTWTmCEC55pcjlu++XR4EaQNIsEjSBivhi8RL2r3/Tk27LRsy8 8= X-Received: by 2002:a05:600c:44d6:b0:3ea:e7f7:4faa with SMTP id f22-20020a05600c44d600b003eae7f74faamr8005924wmo.26.1677760325108; Thu, 02 Mar 2023 04:32:05 -0800 (PST) X-Google-Smtp-Source: AK7set++EpT43+eyMA3mxkETjZ/e09ZYv9+l+vZiGcrOGavnGhNp7obJ2v9ZVDscoAqkUeHlEooEUQ== X-Received: by 2002:a05:600c:44d6:b0:3ea:e7f7:4faa with SMTP id f22-20020a05600c44d600b003eae7f74faamr8005910wmo.26.1677760324867; Thu, 02 Mar 2023 04:32:04 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 31/62] hw/xen: Implement EVTCHNOP_unmask Date: Thu, 2 Mar 2023 13:29:58 +0100 Message-Id: <20230302123029.153265-32-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761519470100002 Content-Type: text/plain; charset="utf-8" From: David Woodhouse This finally comes with a mechanism for actually injecting events into the guest vCPU, with all the atomic-test-and-set that's involved in setting the bit in the shinfo, then the index in the vcpu_info, and injecting either the lapic vector as MSI, or letting KVM inject the bare vector. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 175 ++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 2 + target/i386/kvm/xen-emu.c | 12 +++ 3 files changed, 189 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index c57d36b492e0..54707f1f9fe1 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -224,6 +224,13 @@ int xen_evtchn_set_callback_param(uint64_t param) return ret; } =20 +static void inject_callback(XenEvtchnState *s, uint32_t vcpu) +{ + int type =3D s->callback_param >> CALLBACK_VIA_TYPE_SHIFT; + + kvm_xen_inject_vcpu_callback_vector(vcpu, type); +} + static bool valid_port(evtchn_port_t port) { if (!port) { @@ -294,6 +301,152 @@ int xen_evtchn_status_op(struct evtchn_status *status) return 0; } =20 +/* + * Never thought I'd hear myself say this, but C++ templates would be + * kind of nice here. + * + * template static int do_unmask_port(T *shinfo, ...); + */ +static int do_unmask_port_lm(XenEvtchnState *s, evtchn_port_t port, + bool do_unmask, struct shared_info *shinfo, + struct vcpu_info *vcpu_info) +{ + const int bits_per_word =3D BITS_PER_BYTE * sizeof(shinfo->evtchn_pend= ing[0]); + typeof(shinfo->evtchn_pending[0]) mask; + int idx =3D port / bits_per_word; + int offset =3D port % bits_per_word; + + mask =3D 1UL << offset; + + if (idx >=3D bits_per_word) { + return -EINVAL; + } + + if (do_unmask) { + /* + * If this is a true unmask operation, clear the mask bit. If + * it was already unmasked, we have nothing further to do. + */ + if (!((qatomic_fetch_and(&shinfo->evtchn_mask[idx], ~mask) & mask)= )) { + return 0; + } + } else { + /* + * This is a pseudo-unmask for affinity changes. We don't + * change the mask bit, and if it's *masked* we have nothing + * else to do. + */ + if (qatomic_fetch_or(&shinfo->evtchn_mask[idx], 0) & mask) { + return 0; + } + } + + /* If the event was not pending, we're done. */ + if (!(qatomic_fetch_or(&shinfo->evtchn_pending[idx], 0) & mask)) { + return 0; + } + + /* Now on to the vcpu_info evtchn_pending_sel index... */ + mask =3D 1UL << idx; + + /* If a port in this word was already pending for this vCPU, all done.= */ + if (qatomic_fetch_or(&vcpu_info->evtchn_pending_sel, mask) & mask) { + return 0; + } + + /* Set evtchn_upcall_pending for this vCPU */ + if (qatomic_fetch_or(&vcpu_info->evtchn_upcall_pending, 1)) { + return 0; + } + + inject_callback(s, s->port_table[port].vcpu); + + return 0; +} + +static int do_unmask_port_compat(XenEvtchnState *s, evtchn_port_t port, + bool do_unmask, + struct compat_shared_info *shinfo, + struct compat_vcpu_info *vcpu_info) +{ + const int bits_per_word =3D BITS_PER_BYTE * sizeof(shinfo->evtchn_pend= ing[0]); + typeof(shinfo->evtchn_pending[0]) mask; + int idx =3D port / bits_per_word; + int offset =3D port % bits_per_word; + + mask =3D 1UL << offset; + + if (idx >=3D bits_per_word) { + return -EINVAL; + } + + if (do_unmask) { + /* + * If this is a true unmask operation, clear the mask bit. If + * it was already unmasked, we have nothing further to do. + */ + if (!((qatomic_fetch_and(&shinfo->evtchn_mask[idx], ~mask) & mask)= )) { + return 0; + } + } else { + /* + * This is a pseudo-unmask for affinity changes. We don't + * change the mask bit, and if it's *masked* we have nothing + * else to do. + */ + if (qatomic_fetch_or(&shinfo->evtchn_mask[idx], 0) & mask) { + return 0; + } + } + + /* If the event was not pending, we're done. */ + if (!(qatomic_fetch_or(&shinfo->evtchn_pending[idx], 0) & mask)) { + return 0; + } + + /* Now on to the vcpu_info evtchn_pending_sel index... */ + mask =3D 1UL << idx; + + /* If a port in this word was already pending for this vCPU, all done.= */ + if (qatomic_fetch_or(&vcpu_info->evtchn_pending_sel, mask) & mask) { + return 0; + } + + /* Set evtchn_upcall_pending for this vCPU */ + if (qatomic_fetch_or(&vcpu_info->evtchn_upcall_pending, 1)) { + return 0; + } + + inject_callback(s, s->port_table[port].vcpu); + + return 0; +} + +static int unmask_port(XenEvtchnState *s, evtchn_port_t port, bool do_unma= sk) +{ + void *vcpu_info, *shinfo; + + if (s->port_table[port].type =3D=3D EVTCHNSTAT_closed) { + return -EINVAL; + } + + shinfo =3D xen_overlay_get_shinfo_ptr(); + if (!shinfo) { + return -ENOTSUP; + } + + vcpu_info =3D kvm_xen_get_vcpu_info_hva(s->port_table[port].vcpu); + if (!vcpu_info) { + return -EINVAL; + } + + if (xen_is_long_mode()) { + return do_unmask_port_lm(s, port, do_unmask, shinfo, vcpu_info); + } else { + return do_unmask_port_compat(s, port, do_unmask, shinfo, vcpu_info= ); + } +} + static int clear_port_pending(XenEvtchnState *s, evtchn_port_t port) { void *p =3D xen_overlay_get_shinfo_ptr(); @@ -380,3 +533,25 @@ int xen_evtchn_close_op(struct evtchn_close *close) =20 return ret; } + +int xen_evtchn_unmask_op(struct evtchn_unmask *unmask) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (!valid_port(unmask->port)) { + return -EINVAL; + } + + qemu_mutex_lock(&s->port_lock); + + ret =3D unmask_port(s, unmask->port, true); + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index cb3924941a57..69c6b0d743ae 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -17,7 +17,9 @@ int xen_evtchn_set_callback_param(uint64_t param); =20 struct evtchn_status; struct evtchn_close; +struct evtchn_unmask; int xen_evtchn_status_op(struct evtchn_status *status); int xen_evtchn_close_op(struct evtchn_close *close); +int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); =20 #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index fab7d6b6a914..884e1c9c11d1 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -817,6 +817,18 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, err =3D xen_evtchn_close_op(&close); break; } + case EVTCHNOP_unmask: { + struct evtchn_unmask unmask; + + qemu_build_assert(sizeof(unmask) =3D=3D 4); + if (kvm_copy_from_gva(cs, arg, &unmask, sizeof(unmask))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_unmask_op(&unmask); + break; + } default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760790; cv=none; d=zohomail.com; s=zohoarc; b=WLrpnrhfSiwblkDVOrK5sZ0xdtxnEArlAN8oSY90vDRvWKmYNFmQQsH5IXyfT1kzMFkyoBX4op4oZZTS0a7JiwqoqEL8gh9nJ9cbnt5Wpa9/8GrRxo/0KBi3HtUGmbn8ALu9M2rwrkiVoAw3Ykly3K0AqzbJwSZdwRvZjGNDjd8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760790; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=3pw9fO1sLqyUroktc4FbV7fzqXom90HdSf+/2Lgsk5I=; b=Zx8UbFyHv7NqeeeEEnfcvhAs1uwgNqSvtRkn+hOC6+I3/6JZ0Ic/Liq86zb9jrkpMUKAtxJtoyBxwnmRQQnwbyureePEkrN2RxdodZQPKau7PhAmP/eCjYrUTUQ8E7Y702mxcbRbmwWoKGeUKZr0RSwzkO2z1pY+2wYNtPtw6Ls= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760790011482.41047180482315; Thu, 2 Mar 2023 04:39:50 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi6u-0002ec-9Z; Thu, 02 Mar 2023 07:32:38 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6X-0002Tu-Jb for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:20 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6V-0003G1-L3 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:13 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-494-OQqTlGD8O_ij0g3_P6zRhg-1; Thu, 02 Mar 2023 07:32:10 -0500 Received: by mail-wr1-f70.google.com with SMTP id i18-20020a05600011d200b002c94d861113so3141978wrx.16 for ; Thu, 02 Mar 2023 04:32:09 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id h16-20020adff4d0000000b002c70851fdd8sm15274112wrp.75.2023.03.02.04.32.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760331; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3pw9fO1sLqyUroktc4FbV7fzqXom90HdSf+/2Lgsk5I=; b=CCr+JEqw/ouU/CUOqpUTfU5eTwfNRFkUNr21iQtucIrN9vuro3ZGSs6JLRv2x28BXe2rC0 H/Bb/BWOtIr6n8ww5qLG1tkndGI1GDZxs4lN4Ce73kJ+Ha7gTfAPqtz90MMzMj72+w7j55 HIOOmOwufQKB0+skzAuldXpm53M2qmw= X-MC-Unique: OQqTlGD8O_ij0g3_P6zRhg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3pw9fO1sLqyUroktc4FbV7fzqXom90HdSf+/2Lgsk5I=; b=AsBypl9xYn/Z5NwelptDPkg82tZjYX8Og489wva8HsP2llYubx9rdYk4BKYhHCn7qV gVC2Qj13uySu2CxFf5gyGqHa/GP7OYJJmaf8CEnGU+D2UAktQOnHfva/BMZ9ChKnpx7c LR8JxlU1lbu3t4VWTyZixCcVV6+LLQoCr06nrWBrvJWkjGwSW/ba5WuuCTHBM82QMAI1 AEzPAP9PT5U8BXnpRycViuBKfU++CudeMrcXBrajLfM3FUc422WBJVVV7HYWOTeHIXhN hFgjIyQttQeh/isduKx3H0Jn7cjh2jlWZLpWpQTBU3mPLvJJW4swNuITYAte1lUqtuTG boXw== X-Gm-Message-State: AO0yUKU6NSuekxvdkqVb25ik/YUNCS8aKVimhgIVR+UL/G10lRvjuKTl PFlRxngKVWs++3dWTHSpo8lWoeZ1Xn9UYG8bjltbln4VmaODyubJbyrqaZFglfV/OoaYTliogVV uSxBmiMu1vJiMSU9rHoYKMgEZDTy/n5svs6vh74syJlEAfn9OLat17890pF9rsfT8ChPFr6Nycn 4= X-Received: by 2002:adf:e945:0:b0:2c7:17a0:c6b5 with SMTP id m5-20020adfe945000000b002c717a0c6b5mr6734931wrn.34.1677760328362; Thu, 02 Mar 2023 04:32:08 -0800 (PST) X-Google-Smtp-Source: AK7set8vBGW4Dybl840vBkTaNpcaKuLCjQjAcQvnmvS/Xd9VIGuwOHy3mnCSobENI6oJy64exT3DxA== X-Received: by 2002:adf:e945:0:b0:2c7:17a0:c6b5 with SMTP id m5-20020adfe945000000b002c717a0c6b5mr6734907wrn.34.1677760327778; Thu, 02 Mar 2023 04:32:07 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 32/62] hw/xen: Implement EVTCHNOP_bind_virq Date: Thu, 2 Mar 2023 13:29:59 +0100 Message-Id: <20230302123029.153265-33-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760790983100007 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Add the array of virq ports to each vCPU so that we can deliver timers, debug ports, etc. Global virqs are allocated against vCPU 0 initially, but can be migrated to other vCPUs (when we implement that). The kernel needs to know about VIRQ_TIMER in order to accelerate timers, so tell it via KVM_XEN_VCPU_ATTR_TYPE_TIMER. Also save/restore the value of the singleshot timer across migration, as the kernel will handle the hypercalls automatically now. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 85 ++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 2 + include/sysemu/kvm_xen.h | 1 + target/i386/cpu.h | 4 ++ target/i386/kvm/xen-emu.c | 91 +++++++++++++++++++++++++++++++++++++++ target/i386/machine.c | 2 + 6 files changed, 185 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index 54707f1f9fe1..a3202d39abca 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -244,6 +244,11 @@ static bool valid_port(evtchn_port_t port) } } =20 +static bool valid_vcpu(uint32_t vcpu) +{ + return !!qemu_get_cpu(vcpu); +} + int xen_evtchn_status_op(struct evtchn_status *status) { XenEvtchnState *s =3D xen_evtchn_singleton; @@ -496,6 +501,43 @@ static void free_port(XenEvtchnState *s, evtchn_port_t= port) clear_port_pending(s, port); } =20 +static int allocate_port(XenEvtchnState *s, uint32_t vcpu, uint16_t type, + uint16_t val, evtchn_port_t *port) +{ + evtchn_port_t p =3D 1; + + for (p =3D 1; valid_port(p); p++) { + if (s->port_table[p].type =3D=3D EVTCHNSTAT_closed) { + s->port_table[p].vcpu =3D vcpu; + s->port_table[p].type =3D type; + s->port_table[p].type_val =3D val; + + *port =3D p; + + if (s->nr_ports < p + 1) { + s->nr_ports =3D p + 1; + } + + return 0; + } + } + return -ENOSPC; +} + +static bool virq_is_global(uint32_t virq) +{ + switch (virq) { + case VIRQ_TIMER: + case VIRQ_DEBUG: + case VIRQ_XENOPROF: + case VIRQ_XENPMU: + return false; + + default: + return true; + } +} + static int close_port(XenEvtchnState *s, evtchn_port_t port) { XenEvtchnPort *p =3D &s->port_table[port]; @@ -504,6 +546,11 @@ static int close_port(XenEvtchnState *s, evtchn_port_t= port) case EVTCHNSTAT_closed: return -ENOENT; =20 + case EVTCHNSTAT_virq: + kvm_xen_set_vcpu_virq(virq_is_global(p->type_val) ? 0 : p->vcpu, + p->type_val, 0); + break; + default: break; } @@ -555,3 +602,41 @@ int xen_evtchn_unmask_op(struct evtchn_unmask *unmask) =20 return ret; } + +int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (virq->virq >=3D NR_VIRQS) { + return -EINVAL; + } + + /* Global VIRQ must be allocated on vCPU0 first */ + if (virq_is_global(virq->virq) && virq->vcpu !=3D 0) { + return -EINVAL; + } + + if (!valid_vcpu(virq->vcpu)) { + return -ENOENT; + } + + qemu_mutex_lock(&s->port_lock); + + ret =3D allocate_port(s, virq->vcpu, EVTCHNSTAT_virq, virq->virq, + &virq->port); + if (!ret) { + ret =3D kvm_xen_set_vcpu_virq(virq->vcpu, virq->virq, virq->port); + if (ret) { + free_port(s, virq->port); + } + } + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 69c6b0d743ae..0ea13dda3a25 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -18,8 +18,10 @@ int xen_evtchn_set_callback_param(uint64_t param); struct evtchn_status; struct evtchn_close; struct evtchn_unmask; +struct evtchn_bind_virq; int xen_evtchn_status_op(struct evtchn_status *status); int xen_evtchn_close_op(struct evtchn_close *close); int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); +int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq); =20 #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h index 644c7d889c6b..fbb7414eb797 100644 --- a/include/sysemu/kvm_xen.h +++ b/include/sysemu/kvm_xen.h @@ -23,6 +23,7 @@ int kvm_xen_soft_reset(void); uint32_t kvm_xen_get_caps(void); void *kvm_xen_get_vcpu_info_hva(uint32_t vcpu_id); void kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu_id, int type); +int kvm_xen_set_vcpu_virq(uint32_t vcpu_id, uint16_t virq, uint16_t port); =20 #define kvm_xen_has_cap(cap) (!!(kvm_xen_get_caps() & \ KVM_XEN_HVM_CONFIG_ ## cap)) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 1c7603221dc6..4b70257db5dd 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -27,6 +27,8 @@ #include "qapi/qapi-types-common.h" #include "qemu/cpu-float.h" =20 +#define XEN_NR_VIRQS 24 + /* The x86 has a strong memory model with some store-after-load re-orderin= g */ #define TCG_GUEST_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD) =20 @@ -1806,6 +1808,8 @@ typedef struct CPUArchState { uint64_t xen_vcpu_time_info_gpa; uint64_t xen_vcpu_runstate_gpa; uint8_t xen_vcpu_callback_vector; + uint16_t xen_virq[XEN_NR_VIRQS]; + uint64_t xen_singleshot_timer_ns; #endif #if defined(CONFIG_HVF) HVFX86LazyFlags hvf_lflags; diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 884e1c9c11d1..e0417f3d1359 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -355,6 +355,53 @@ void kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu= _id, int type) } } =20 +static int kvm_xen_set_vcpu_timer(CPUState *cs) +{ + X86CPU *cpu =3D X86_CPU(cs); + CPUX86State *env =3D &cpu->env; + + struct kvm_xen_vcpu_attr va =3D { + .type =3D KVM_XEN_VCPU_ATTR_TYPE_TIMER, + .u.timer.port =3D env->xen_virq[VIRQ_TIMER], + .u.timer.priority =3D KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL, + .u.timer.expires_ns =3D env->xen_singleshot_timer_ns, + }; + + return kvm_vcpu_ioctl(cs, KVM_XEN_VCPU_SET_ATTR, &va); +} + +static void do_set_vcpu_timer_virq(CPUState *cs, run_on_cpu_data data) +{ + kvm_xen_set_vcpu_timer(cs); +} + +int kvm_xen_set_vcpu_virq(uint32_t vcpu_id, uint16_t virq, uint16_t port) +{ + CPUState *cs =3D qemu_get_cpu(vcpu_id); + + if (!cs) { + return -ENOENT; + } + + /* cpu.h doesn't include the actual Xen header. */ + qemu_build_assert(NR_VIRQS =3D=3D XEN_NR_VIRQS); + + if (virq >=3D NR_VIRQS) { + return -EINVAL; + } + + if (port && X86_CPU(cs)->env.xen_virq[virq]) { + return -EEXIST; + } + + X86_CPU(cs)->env.xen_virq[virq] =3D port; + if (virq =3D=3D VIRQ_TIMER && kvm_xen_has_cap(EVTCHN_SEND)) { + async_run_on_cpu(cs, do_set_vcpu_timer_virq, + RUN_ON_CPU_HOST_INT(port)); + } + return 0; +} + static void do_set_vcpu_time_info_gpa(CPUState *cs, run_on_cpu_data data) { X86CPU *cpu =3D X86_CPU(cs); @@ -387,6 +434,8 @@ static void do_vcpu_soft_reset(CPUState *cs, run_on_cpu= _data data) env->xen_vcpu_time_info_gpa =3D INVALID_GPA; env->xen_vcpu_runstate_gpa =3D INVALID_GPA; env->xen_vcpu_callback_vector =3D 0; + env->xen_singleshot_timer_ns =3D 0; + memset(env->xen_virq, 0, sizeof(env->xen_virq)); =20 set_vcpu_info(cs, INVALID_GPA); kvm_xen_set_vcpu_attr(cs, KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO, @@ -395,6 +444,7 @@ static void do_vcpu_soft_reset(CPUState *cs, run_on_cpu= _data data) INVALID_GPA); if (kvm_xen_has_cap(EVTCHN_SEND)) { kvm_xen_set_vcpu_callback_vector(cs); + kvm_xen_set_vcpu_timer(cs); } =20 } @@ -829,6 +879,21 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, err =3D xen_evtchn_unmask_op(&unmask); break; } + case EVTCHNOP_bind_virq: { + struct evtchn_bind_virq virq; + + qemu_build_assert(sizeof(virq) =3D=3D 12); + if (kvm_copy_from_gva(cs, arg, &virq, sizeof(virq))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_bind_virq_op(&virq); + if (!err && kvm_copy_to_gva(cs, arg, &virq, sizeof(virq))) { + err =3D -EFAULT; + } + break; + } default: return false; } @@ -1060,6 +1125,12 @@ int kvm_put_xen_state(CPUState *cs) } } =20 + if (env->xen_virq[VIRQ_TIMER]) { + ret =3D kvm_xen_set_vcpu_timer(cs); + if (ret < 0) { + return ret; + } + } return 0; } =20 @@ -1068,6 +1139,7 @@ int kvm_get_xen_state(CPUState *cs) X86CPU *cpu =3D X86_CPU(cs); CPUX86State *env =3D &cpu->env; uint64_t gpa; + int ret; =20 /* * The kernel does not mark vcpu_info as dirty when it delivers interr= upts @@ -1090,5 +1162,24 @@ int kvm_get_xen_state(CPUState *cs) } } =20 + if (!kvm_xen_has_cap(EVTCHN_SEND)) { + return 0; + } + + /* + * If the kernel is accelerating timers, read out the current value of= the + * singleshot timer deadline. + */ + if (env->xen_virq[VIRQ_TIMER]) { + struct kvm_xen_vcpu_attr va =3D { + .type =3D KVM_XEN_VCPU_ATTR_TYPE_TIMER, + }; + ret =3D kvm_vcpu_ioctl(cs, KVM_XEN_VCPU_GET_ATTR, &va); + if (ret < 0) { + return ret; + } + env->xen_singleshot_timer_ns =3D va.u.timer.expires_ns; + } + return 0; } diff --git a/target/i386/machine.c b/target/i386/machine.c index a4874eda9041..603a1077e34a 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -1275,6 +1275,8 @@ static const VMStateDescription vmstate_xen_vcpu =3D { VMSTATE_UINT64(env.xen_vcpu_time_info_gpa, X86CPU), VMSTATE_UINT64(env.xen_vcpu_runstate_gpa, X86CPU), VMSTATE_UINT8(env.xen_vcpu_callback_vector, X86CPU), + VMSTATE_UINT16_ARRAY(env.xen_virq, X86CPU, XEN_NR_VIRQS), + VMSTATE_UINT64(env.xen_singleshot_timer_ns, X86CPU), VMSTATE_END_OF_LIST() } }; --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761182; cv=none; d=zohomail.com; s=zohoarc; b=mSh6rKa0g2h+cOar4SixmVpxwgZb8EGDqWs8lIZrnKgaP/NN6D5h/DkAzmoVPeNIRdKYHFDu7J269CzrGoJdo3LE6CJCDNE+MEFy7s3YYJx5ku1/jmtqk7TS+lHyE0FytH+Lo8Q6KxjJVKOQfEJJG7oxxsQeDQNkVG59rdZ5rgY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761182; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=FIKwKWqUOCSiWu2p2gUDsBHJkqpDVFpWc/+2LmVsUoU=; b=FzP7PRauZLnMdKglHhaYHVMelNHf6vM29qPtboLM+i8+3clt8EH4+nQ4WZJpFhfwzsAtsvNVe9PRU6pb96EyllmjM4+rLzhE+0SLXjEhsGCRsJVYkLo1akr8nG+HHHzy39hu5YJGrF6A6GHPPCdVC7KEr/kuHQoSg/zogZx4/8E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761182373947.4258396111591; Thu, 2 Mar 2023 04:46:22 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiAN-0006p5-Mn; Thu, 02 Mar 2023 07:36:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6Z-0002U1-Ru for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:20 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6Y-0003Gg-7e for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:15 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-491-9duY3y3RPtqsF7GxA0zzeg-1; Thu, 02 Mar 2023 07:32:12 -0500 Received: by mail-wr1-f69.google.com with SMTP id 15-20020a056000156f00b002ca79db6d42so2953226wrz.18 for ; Thu, 02 Mar 2023 04:32:12 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id g9-20020a056000118900b002c794495f6fsm14782569wrx.117.2023.03.02.04.32.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760333; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FIKwKWqUOCSiWu2p2gUDsBHJkqpDVFpWc/+2LmVsUoU=; b=L0asrbyHresefVOPubiGLeTuqXbNhJIO+fbA1p4iGQzuMCwjICkKxK4WNZtcyanzd2OIXx 6nSG4pSYeYSeVNrmN+mHx5ENysnuQbS8FHH/5eFNv8W011gIITp/qvOcjGmupJ8A3cTmKj 4pO9M97lgfIeqCa6WT2gvjwI3lOETec= X-MC-Unique: 9duY3y3RPtqsF7GxA0zzeg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FIKwKWqUOCSiWu2p2gUDsBHJkqpDVFpWc/+2LmVsUoU=; b=sdoW/x0AfqTxPdTBDi6eTZp1zHGNdIstm5EvE5E+30+uARSKB4m0oWKfdXsZFCaCvo u2nCFcKJLYOz76+ywstiW4/sCJsfQc48Uj2AtSLWWgZVGosbaxFygmFGp6MA60QFqYIZ /qOes9dhk2gTg2cZaQsF8UZVbpsek0eeasvwgvdiG85bDE4E0BS5SFmqmF+D53xJJdjf LD0ccaDUzXxGwkt7epprczj1+RaerkYs6vm4DT1Vl3icXTFsP5uPJbfcuv5jsWRdHsQy xIQGuymfMsLFQ28Ch7KxLALpEuQZGm87VMIradAqz+03z6I7NSDjJprWn0J2XkkSGt7y mgGw== X-Gm-Message-State: AO0yUKVw1+2fuNavwAwf8Iwvv/57NxXuLRusWn2N57zxS4cjl6VkkOwu 63fOtDNQ3VgO4xpYWUEB8jNJIvb7ipC2xlcIwwJTI2ugoVmUIYV4swRydaul3A1ECMTUPZmxppL i0gYFodLkkEgkDBdN+b8ukNgqNrKoHshEg9jI1Ivd3sjCq460k1XYBeuV2mlCWatVffOWVtck9d A= X-Received: by 2002:adf:dbc2:0:b0:2cc:5ee8:fee5 with SMTP id e2-20020adfdbc2000000b002cc5ee8fee5mr7125481wrj.71.1677760331096; Thu, 02 Mar 2023 04:32:11 -0800 (PST) X-Google-Smtp-Source: AK7set+9i3d7PNdNTnrXwfc7BomluIwADu8qGoyyWalUo1lj0CFY5T4NIdsfgyIp7zBOXrpZcEm2aw== X-Received: by 2002:adf:dbc2:0:b0:2cc:5ee8:fee5 with SMTP id e2-20020adfdbc2000000b002cc5ee8fee5mr7125459wrj.71.1677760330724; Thu, 02 Mar 2023 04:32:10 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 33/62] hw/xen: Implement EVTCHNOP_bind_ipi Date: Thu, 2 Mar 2023 13:30:00 +0100 Message-Id: <20230302123029.153265-34-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761183054100003 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 69 +++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 2 ++ target/i386/kvm/xen-emu.c | 15 +++++++++ 3 files changed, 86 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index a3202d39abca..eea80dc0f53c 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -13,6 +13,7 @@ #include "qemu/host-utils.h" #include "qemu/module.h" #include "qemu/main-loop.h" +#include "qemu/log.h" #include "qapi/error.h" #include "qom/object.h" #include "exec/target_page.h" @@ -231,6 +232,43 @@ static void inject_callback(XenEvtchnState *s, uint32_= t vcpu) kvm_xen_inject_vcpu_callback_vector(vcpu, type); } =20 +static void deassign_kernel_port(evtchn_port_t port) +{ + struct kvm_xen_hvm_attr ha; + int ret; + + ha.type =3D KVM_XEN_ATTR_TYPE_EVTCHN; + ha.u.evtchn.send_port =3D port; + ha.u.evtchn.flags =3D KVM_XEN_EVTCHN_DEASSIGN; + + ret =3D kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_SET_ATTR, &ha); + if (ret) { + qemu_log_mask(LOG_GUEST_ERROR, "Failed to unbind kernel port %d: %= s\n", + port, strerror(ret)); + } +} + +static int assign_kernel_port(uint16_t type, evtchn_port_t port, + uint32_t vcpu_id) +{ + CPUState *cpu =3D qemu_get_cpu(vcpu_id); + struct kvm_xen_hvm_attr ha; + + if (!cpu) { + return -ENOENT; + } + + ha.type =3D KVM_XEN_ATTR_TYPE_EVTCHN; + ha.u.evtchn.send_port =3D port; + ha.u.evtchn.type =3D type; + ha.u.evtchn.flags =3D 0; + ha.u.evtchn.deliver.port.port =3D port; + ha.u.evtchn.deliver.port.vcpu =3D kvm_arch_vcpu_id(cpu); + ha.u.evtchn.deliver.port.priority =3D KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_= 2LEVEL; + + return kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_SET_ATTR, &ha); +} + static bool valid_port(evtchn_port_t port) { if (!port) { @@ -551,6 +589,12 @@ static int close_port(XenEvtchnState *s, evtchn_port_t= port) p->type_val, 0); break; =20 + case EVTCHNSTAT_ipi: + if (s->evtchn_in_kernel) { + deassign_kernel_port(port); + } + break; + default: break; } @@ -640,3 +684,28 @@ int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *v= irq) =20 return ret; } + +int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (!valid_vcpu(ipi->vcpu)) { + return -ENOENT; + } + + qemu_mutex_lock(&s->port_lock); + + ret =3D allocate_port(s, ipi->vcpu, EVTCHNSTAT_ipi, 0, &ipi->port); + if (!ret && s->evtchn_in_kernel) { + assign_kernel_port(EVTCHNSTAT_ipi, ipi->port, ipi->vcpu); + } + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 0ea13dda3a25..107f4208485e 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -19,9 +19,11 @@ struct evtchn_status; struct evtchn_close; struct evtchn_unmask; struct evtchn_bind_virq; +struct evtchn_bind_ipi; int xen_evtchn_status_op(struct evtchn_status *status); int xen_evtchn_close_op(struct evtchn_close *close); int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq); +int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi); =20 #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index e0417f3d1359..b8b439dd311a 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -894,6 +894,21 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, } break; } + case EVTCHNOP_bind_ipi: { + struct evtchn_bind_ipi ipi; + + qemu_build_assert(sizeof(ipi) =3D=3D 8); + if (kvm_copy_from_gva(cs, arg, &ipi, sizeof(ipi))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_bind_ipi_op(&ipi); + if (!err && kvm_copy_to_gva(cs, arg, &ipi, sizeof(ipi))) { + err =3D -EFAULT; + } + break; + } default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760647; cv=none; d=zohomail.com; s=zohoarc; b=f0NgjYZKmYJ/n5TAvEdy3kGwM1eJaXXaGBdW4HQOMG90KfN2lZuYqiagLcvxVyyVoH3K8SMXCdUuey9DK8qKArWszewk+J2qg6cCpVRGDj3Z7s2SuX5XvMf2TV9jtg4/Rivx1g4wFo8zm7qEnH5/ZqDFvqk3VtaxyBc15tTsnsA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760647; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=NDjVGp0dIGJEJab/RXk335NOwHswWdDScGy8GXlP8Sk=; b=PDxWgu5UAAhCmXiX+DKnESTYQ7uPEXVMRfN4MJ59owePRPw+wNCUyFidnk3gOmLsiYsk5MbxJlS0O08jcGD+hRGR+GjhsMlkiSxRD578ApC0Msqf/IA1vdSLvaHNivmsjHoFScjKITTf1OgZydip7lYJk8G5KRQVYHuXk0yf9UU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760647482461.3224803142099; Thu, 2 Mar 2023 04:37:27 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi7k-0002yq-39; Thu, 02 Mar 2023 07:33:28 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6d-0002UT-2E for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:21 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6b-0003HL-BX for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:18 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-580-ZxYhGsxUNcyAP3xbur1ygw-1; Thu, 02 Mar 2023 07:32:15 -0500 Received: by mail-wm1-f72.google.com with SMTP id r7-20020a05600c35c700b003eb3f2c4fb4so1014357wmq.6 for ; Thu, 02 Mar 2023 04:32:15 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id ja20-20020a05600c557400b003eb596cbc54sm2954411wmb.0.2023.03.02.04.32.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760336; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=NDjVGp0dIGJEJab/RXk335NOwHswWdDScGy8GXlP8Sk=; b=bhFkpVXzYHyoaWjSO51zerKyuc24Fn3OndGt65uA8LJ3i/6ojFHZtxg7uA+2qBrEhj0bjN ZfLDn1KSWnrp6FpgzAba5ZO8pqkqG3aVTP47wEL3axvdppY4AfOTAvGrcw3fg8cRRD56fy A9UQ/4T9bOwfoJAO59peiiWg2Dw8Rg4= X-MC-Unique: ZxYhGsxUNcyAP3xbur1ygw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NDjVGp0dIGJEJab/RXk335NOwHswWdDScGy8GXlP8Sk=; b=Bps7n9jY/8UujX/WpldgB3/WSWVErersNhyVZn8vQCoiveNuRvKvh4aEibX2O0X7FK Kms6KY958IgxG+MjS9PN6LNVSjFvOOmza6moxfEGyn+U0mEFK0gvypeIkQlTGNdqwUi+ s57KV2JdKPPHFghy9K3I9MbZvig3Z+JK/2KQ/bLPTRepEF50MBM0GE/hnKiIxQaIGvN5 u1vhTraNVngFm0Q2P2ipZVyf0U6/xE4rxqJuw6yLDJZJQ6i6Fr5MNGIK56nJWovetoZN VM79R4EEVo/PB6uNbFQh2PXopmPExdyToHHzwHNrKciYNMCdrG11eakCKrafsd2fw7tg WP2Q== X-Gm-Message-State: AO0yUKXUb4USgsnKj+2ne0YKy29hdXqfvKh/DFm49SSQeipnTTTaMYiP wj2khKvpTpa6yPrup41tsvaO4WXiYKk0C3VNK8RPf9felbBdP7rvzzjpJpQ+Fn9k4RHxGhDmg5z T1VlFT6FDscTR7KziObASLzB+ZBllpaA59D4/XHmDRKm0ZN+/cc+1LOObA//rgRf+bSb33B/rcu 4= X-Received: by 2002:a5d:6545:0:b0:2c7:cc8:782c with SMTP id z5-20020a5d6545000000b002c70cc8782cmr1429931wrv.1.1677760333891; Thu, 02 Mar 2023 04:32:13 -0800 (PST) X-Google-Smtp-Source: AK7set8qXkTO8FTYfmiDo8WWd+lhsFDCOl+jq8OWxWQ3/LhBvV7/f49W1bsDuEO4qggO32MeIAQJEw== X-Received: by 2002:a5d:6545:0:b0:2c7:cc8:782c with SMTP id z5-20020a5d6545000000b002c70cc8782cmr1429917wrv.1.1677760333551; Thu, 02 Mar 2023 04:32:13 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 34/62] hw/xen: Implement EVTCHNOP_send Date: Thu, 2 Mar 2023 13:30:01 +0100 Message-Id: <20230302123029.153265-35-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760649516100004 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 180 ++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 2 + target/i386/kvm/xen-emu.c | 12 +++ 3 files changed, 194 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index eea80dc0f53c..ce7a96923409 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -490,6 +490,133 @@ static int unmask_port(XenEvtchnState *s, evtchn_port= _t port, bool do_unmask) } } =20 +static int do_set_port_lm(XenEvtchnState *s, evtchn_port_t port, + struct shared_info *shinfo, + struct vcpu_info *vcpu_info) +{ + const int bits_per_word =3D BITS_PER_BYTE * sizeof(shinfo->evtchn_pend= ing[0]); + typeof(shinfo->evtchn_pending[0]) mask; + int idx =3D port / bits_per_word; + int offset =3D port % bits_per_word; + + mask =3D 1UL << offset; + + if (idx >=3D bits_per_word) { + return -EINVAL; + } + + /* Update the pending bit itself. If it was already set, we're done. */ + if (qatomic_fetch_or(&shinfo->evtchn_pending[idx], mask) & mask) { + return 0; + } + + /* Check if it's masked. */ + if (qatomic_fetch_or(&shinfo->evtchn_mask[idx], 0) & mask) { + return 0; + } + + /* Now on to the vcpu_info evtchn_pending_sel index... */ + mask =3D 1UL << idx; + + /* If a port in this word was already pending for this vCPU, all done.= */ + if (qatomic_fetch_or(&vcpu_info->evtchn_pending_sel, mask) & mask) { + return 0; + } + + /* Set evtchn_upcall_pending for this vCPU */ + if (qatomic_fetch_or(&vcpu_info->evtchn_upcall_pending, 1)) { + return 0; + } + + inject_callback(s, s->port_table[port].vcpu); + + return 0; +} + +static int do_set_port_compat(XenEvtchnState *s, evtchn_port_t port, + struct compat_shared_info *shinfo, + struct compat_vcpu_info *vcpu_info) +{ + const int bits_per_word =3D BITS_PER_BYTE * sizeof(shinfo->evtchn_pend= ing[0]); + typeof(shinfo->evtchn_pending[0]) mask; + int idx =3D port / bits_per_word; + int offset =3D port % bits_per_word; + + mask =3D 1UL << offset; + + if (idx >=3D bits_per_word) { + return -EINVAL; + } + + /* Update the pending bit itself. If it was already set, we're done. */ + if (qatomic_fetch_or(&shinfo->evtchn_pending[idx], mask) & mask) { + return 0; + } + + /* Check if it's masked. */ + if (qatomic_fetch_or(&shinfo->evtchn_mask[idx], 0) & mask) { + return 0; + } + + /* Now on to the vcpu_info evtchn_pending_sel index... */ + mask =3D 1UL << idx; + + /* If a port in this word was already pending for this vCPU, all done.= */ + if (qatomic_fetch_or(&vcpu_info->evtchn_pending_sel, mask) & mask) { + return 0; + } + + /* Set evtchn_upcall_pending for this vCPU */ + if (qatomic_fetch_or(&vcpu_info->evtchn_upcall_pending, 1)) { + return 0; + } + + inject_callback(s, s->port_table[port].vcpu); + + return 0; +} + +static int set_port_pending(XenEvtchnState *s, evtchn_port_t port) +{ + void *vcpu_info, *shinfo; + + if (s->port_table[port].type =3D=3D EVTCHNSTAT_closed) { + return -EINVAL; + } + + if (s->evtchn_in_kernel) { + XenEvtchnPort *p =3D &s->port_table[port]; + CPUState *cpu =3D qemu_get_cpu(p->vcpu); + struct kvm_irq_routing_xen_evtchn evt; + + if (!cpu) { + return 0; + } + + evt.port =3D port; + evt.vcpu =3D kvm_arch_vcpu_id(cpu); + evt.priority =3D KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVEL; + + return kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_EVTCHN_SEND, &evt); + } + + shinfo =3D xen_overlay_get_shinfo_ptr(); + if (!shinfo) { + return -ENOTSUP; + } + + vcpu_info =3D kvm_xen_get_vcpu_info_hva(s->port_table[port].vcpu); + if (!vcpu_info) { + return -EINVAL; + } + + if (xen_is_long_mode()) { + return do_set_port_lm(s, port, shinfo, vcpu_info); + } else { + return do_set_port_compat(s, port, shinfo, vcpu_info); + } +} + static int clear_port_pending(XenEvtchnState *s, evtchn_port_t port) { void *p =3D xen_overlay_get_shinfo_ptr(); @@ -709,3 +836,56 @@ int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi) =20 return ret; } + +int xen_evtchn_send_op(struct evtchn_send *send) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + XenEvtchnPort *p; + int ret =3D 0; + + if (!s) { + return -ENOTSUP; + } + + if (!valid_port(send->port)) { + return -EINVAL; + } + + qemu_mutex_lock(&s->port_lock); + + p =3D &s->port_table[send->port]; + + switch (p->type) { + case EVTCHNSTAT_interdomain: + if (p->type_val & PORT_INFO_TYPEVAL_REMOTE_QEMU) { + /* + * This is an event from the guest to qemu itself, which is + * serving as the driver domain. Not yet implemented; it will + * be hooked up to the qemu implementation of xenstore, + * console, PV net/block drivers etc. + */ + ret =3D -ENOSYS; + } else { + /* Loopback interdomain ports; just a complex IPI */ + set_port_pending(s, p->type_val); + } + break; + + case EVTCHNSTAT_ipi: + set_port_pending(s, send->port); + break; + + case EVTCHNSTAT_unbound: + /* Xen will silently drop these */ + break; + + default: + ret =3D -EINVAL; + break; + } + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} + diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 107f4208485e..500fdbe8b804 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -20,10 +20,12 @@ struct evtchn_close; struct evtchn_unmask; struct evtchn_bind_virq; struct evtchn_bind_ipi; +struct evtchn_send; int xen_evtchn_status_op(struct evtchn_status *status); int xen_evtchn_close_op(struct evtchn_close *close); int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq); int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi); +int xen_evtchn_send_op(struct evtchn_send *send); =20 #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index b8b439dd311a..19a7f16ebe6b 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -909,6 +909,18 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, } break; } + case EVTCHNOP_send: { + struct evtchn_send send; + + qemu_build_assert(sizeof(send) =3D=3D 4); + if (kvm_copy_from_gva(cs, arg, &send, sizeof(send))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_send_op(&send); + break; + } default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761230; cv=none; d=zohomail.com; s=zohoarc; b=gITDLAVtrBRbA/jY5Q4nooQcgdb2fuxv9+0hDufvX3aAJ6YG+dcmL4qVXukiipt7vs5NmkWS/EaUIARCa7y8wk/Dqjvwb9GeY1GxkoKGzP9iYfVN1NEv+RHUAMs/bZs9kFUXmcCNMmrWHKjuv0w7LekIk9FaMOxR8k6s7dmcdA4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761230; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=vZfBxoh7Wrng0fCAeGlFcvxIWoPFPSBw1bsSTHLjfmI=; b=UAbUcVR0+l3SbGzdmQD3sMgxI/+rwswDEMu7rJiS1rTOkBGokMm3g/aiqW2a44jYpHzXtlGA0p9EYi9OtN4hF79OvZa7wDmTspcZQHcMHpoxa0ReehQSzNbfq127DSj1OjVMkNIc8EdVfrs6cb5hMt3u7HfEwq/Jvk754sq697M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761230421821.1135514839564; Thu, 2 Mar 2023 04:47:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8K-0003XP-HO; Thu, 02 Mar 2023 07:34:04 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6g-0002Wn-Ex for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:27 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6e-0003Hi-3z for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:21 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-171-Hg_1hQ7QNEarvbN4Gt93PA-1; Thu, 02 Mar 2023 07:32:18 -0500 Received: by mail-wr1-f70.google.com with SMTP id l14-20020a5d526e000000b002cd851d79b2so1995749wrc.5 for ; Thu, 02 Mar 2023 04:32:18 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id y12-20020a1c4b0c000000b003eb39e60ec9sm2801210wma.36.2023.03.02.04.32.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760339; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vZfBxoh7Wrng0fCAeGlFcvxIWoPFPSBw1bsSTHLjfmI=; b=NKUHbJ4G1odcdyqK9qM7yqlBW82UsoEMxXaxY+f3+yL5yfrFuqw6f4cBTDnoMrV/6VsL8f SwhpW2r+4r+GpubGtpta8T0y3RijKT5B0wNnCfLvGS/FJoYWXBN8XAutIjFQ9GXKsBw61W 2O1ZArxcQdQn1Vw1aDNt9OmQkWrXnfI= X-MC-Unique: Hg_1hQ7QNEarvbN4Gt93PA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vZfBxoh7Wrng0fCAeGlFcvxIWoPFPSBw1bsSTHLjfmI=; b=sctWBXea1VopHfiMMVSVDLHYkj9h/4tFmwyIKK9hTyH7PqU/en7YKJymcEPJEIqmf9 5L1to/eIW3Hz1dR6MJ6mBMQCBcMy6FkjfvyJt9BbAw7kYgAAFUe4WVfgvjk9TKk1HN0W Jfk5LVkih+KD8NTkLbKpnzj/w+6Ocf+wq1p4lYLMC6QFSL637uM17YuT5yC3eK09G+6n v4qFfkWId+Jq/pMsgqeMh745LTpym9NVpyM0yVLN1gURcObrnTQG4fi2/OTK7OoeNM16 PwOrOYaQWCK0nXZVYLLRZw+gKYPP65WOOK9h+cKEiwxj8tzhHsUojvVUra0x2JgYaqXt TYxw== X-Gm-Message-State: AO0yUKVdVQQc8Tgblw/8U9bfFpWLtZbZInBo7kTAEq+VX/i7Tl2JY7Qf cOdVve8Q9hXtY4dO1E+dHIn2pSEeU2eele/B43AssbVbemI1yXH/x7xY6aW4BvX5pHckWOlsZ0e g7CWuwX2KFixA3wb2/PG7SKnQ4NYybZvPL2vpcy0IuUtbeCKp+DBVmKS5Sfzj6jgeGIwNdGtyfA 4= X-Received: by 2002:a05:6000:10d1:b0:2cc:4dad:e484 with SMTP id b17-20020a05600010d100b002cc4dade484mr7679797wrx.42.1677760336695; Thu, 02 Mar 2023 04:32:16 -0800 (PST) X-Google-Smtp-Source: AK7set+8dysViEL79HdqeKs3JskvS3PW+Isk3IRFIkKsZAFg5DMfQN+s2mQTODbMJCHLjtpo7taxbA== X-Received: by 2002:a05:6000:10d1:b0:2cc:4dad:e484 with SMTP id b17-20020a05600010d100b002cc4dade484mr7679776wrx.42.1677760336288; Thu, 02 Mar 2023 04:32:16 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 35/62] hw/xen: Implement EVTCHNOP_alloc_unbound Date: Thu, 2 Mar 2023 13:30:02 +0100 Message-Id: <20230302123029.153265-36-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761232059100003 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 32 ++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 2 ++ target/i386/kvm/xen-emu.c | 15 +++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index ce7a96923409..df25bf0806a6 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -837,6 +837,38 @@ int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi) return ret; } =20 +int xen_evtchn_alloc_unbound_op(struct evtchn_alloc_unbound *alloc) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + uint16_t type_val; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (alloc->dom !=3D DOMID_SELF && alloc->dom !=3D xen_domid) { + return -ESRCH; + } + + if (alloc->remote_dom =3D=3D DOMID_QEMU) { + type_val =3D PORT_INFO_TYPEVAL_REMOTE_QEMU; + } else if (alloc->remote_dom =3D=3D DOMID_SELF || + alloc->remote_dom =3D=3D xen_domid) { + type_val =3D 0; + } else { + return -EPERM; + } + + qemu_mutex_lock(&s->port_lock); + + ret =3D allocate_port(s, 0, EVTCHNSTAT_unbound, type_val, &alloc->port= ); + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} + int xen_evtchn_send_op(struct evtchn_send *send) { XenEvtchnState *s =3D xen_evtchn_singleton; diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 500fdbe8b804..fc080138e3f2 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -21,11 +21,13 @@ struct evtchn_unmask; struct evtchn_bind_virq; struct evtchn_bind_ipi; struct evtchn_send; +struct evtchn_alloc_unbound; int xen_evtchn_status_op(struct evtchn_status *status); int xen_evtchn_close_op(struct evtchn_close *close); int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq); int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi); int xen_evtchn_send_op(struct evtchn_send *send); +int xen_evtchn_alloc_unbound_op(struct evtchn_alloc_unbound *alloc); =20 #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 19a7f16ebe6b..ac04387a6a12 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -921,6 +921,21 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, err =3D xen_evtchn_send_op(&send); break; } + case EVTCHNOP_alloc_unbound: { + struct evtchn_alloc_unbound alloc; + + qemu_build_assert(sizeof(alloc) =3D=3D 8); + if (kvm_copy_from_gva(cs, arg, &alloc, sizeof(alloc))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_alloc_unbound_op(&alloc); + if (!err && kvm_copy_to_gva(cs, arg, &alloc, sizeof(alloc))) { + err =3D -EFAULT; + } + break; + } default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761825; cv=none; d=zohomail.com; s=zohoarc; b=b8HagLvK5ayoA/QW8FV1z8bzX4xdCs2VJ4dy+rmetij02AcWFug+ZS2qOw2LFYyJkHjLgYr4NF+qpYH70MfqBTtIKJ0ZSbNiEjGFyWwQ278twheS8TP3fBPjwV/S8WRHLWXhHqt90TSv6TBh6qfZCRS6hjobaF+apvlAoXJS8ng= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761825; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=5rqgVeJf/beC3uBaalPhqtNLIfVze+AudTdQPh37DMk=; b=m2aL4owXj4XcyFX7SHAztWxW7pEGZ5dxsuwHyuvtkAq6PHi7ZHUz1Bec1sRdJ8mkzfrLzV5hFjcBrfRb95XFh/I7CcMb6UPVw8T4zVURJEMOm9Ez/KNRIKCGku2e1XndRsIXwFZK5l71UAuMB92BXWyN2SlZdn0kpNTsFSATP60= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761825044587.1130824305948; Thu, 2 Mar 2023 04:57:05 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi7f-0002ve-3P; Thu, 02 Mar 2023 07:33:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6j-0002Yv-Tn for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:31 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6h-0003IC-Ov for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:25 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-623-i799-jDKPuOtrNYqS1Wl3Q-1; Thu, 02 Mar 2023 07:32:21 -0500 Received: by mail-wm1-f72.google.com with SMTP id m28-20020a05600c3b1c00b003e7d4662b83so1222407wms.0 for ; Thu, 02 Mar 2023 04:32:20 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id y18-20020adffa52000000b002c55efa9cbesm14836526wrr.39.2023.03.02.04.32.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760342; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5rqgVeJf/beC3uBaalPhqtNLIfVze+AudTdQPh37DMk=; b=GmxTFoWoqsJ8sB5me0/L8rWgibFzdasDnyfBuLgsrYPYvVzHClsD0JJM4w9rmXpx2IXFpq Hw6vSufZcjUkTyUzMFBZF4lla0tYCeGH6kUlfoVs5i/0K040xZrq2+6Y6iuUjQjs/TMABS 2gunCcnDHapr5P2GMS7/pfAaA9tQg9Q= X-MC-Unique: i799-jDKPuOtrNYqS1Wl3Q-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5rqgVeJf/beC3uBaalPhqtNLIfVze+AudTdQPh37DMk=; b=ArzoVKp8NmMyJGQilxxJPs1uc9p+V+93LcPT4mxq1e87OQdbT2NttYeaJh1TZlrT0O uax84MjGJW9z9IVV/OkvgrRcEykHtiBP8CD7PZXiN6vM13nO0+VtKfF0L2KPFIuH+Mo6 NJoL+FVSmU30xVcAFuYVKGMtKFH208yN6q7LygtMnrQ95022lPkZvEC42QUrppBwJHvB j5lGDyokOTRBCbqMBwJ/Dg/Kr0lK/NvlKbINCt4aU9XuFzYljp7uPu36FxQEQSSO45A3 +d5HiPDzkISf7VtdDQEA1w5wKkcbsiFqwQYDSlf6TO09EOH8ogPbKyNCpV6I46xIQaXI 59yQ== X-Gm-Message-State: AO0yUKXrdTBpcO4Fr7zi4+wQQdX81N5ggWTBqPgW5j/aMFMVPfT7BUGA vqnhX3FG68ocmbFnOQiIfpRV66WxuXWdnko1uOOly35q97g+QTyzUNWN4zEVNds0GRJTpbHdwwZ nyc180YQfbbPV0aCWYqVK7BMoiyvE12Ey1ly8XHc4uOxFKLr2XCXso5PDEQN8kGDQ42S0gvxCDQ Q= X-Received: by 2002:adf:f111:0:b0:2c7:17a2:b70 with SMTP id r17-20020adff111000000b002c717a20b70mr6697784wro.69.1677760339491; Thu, 02 Mar 2023 04:32:19 -0800 (PST) X-Google-Smtp-Source: AK7set8s33TaVCgvEtztZX6+QcBLlaUiaeTD5kWQDZJXhnGdICE81+xApUUC/5N46/jczfpF9j1iMg== X-Received: by 2002:adf:f111:0:b0:2c7:17a2:b70 with SMTP id r17-20020adff111000000b002c717a20b70mr6697765wro.69.1677760339206; Thu, 02 Mar 2023 04:32:19 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 36/62] hw/xen: Implement EVTCHNOP_bind_interdomain Date: Thu, 2 Mar 2023 13:30:03 +0100 Message-Id: <20230302123029.153265-37-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761826430100003 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 78 +++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 2 + target/i386/kvm/xen-emu.c | 16 ++++++++ 3 files changed, 96 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index df25bf0806a6..e2e36d94f670 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -722,6 +722,23 @@ static int close_port(XenEvtchnState *s, evtchn_port_t= port) } break; =20 + case EVTCHNSTAT_interdomain: + if (p->type_val & PORT_INFO_TYPEVAL_REMOTE_QEMU) { + /* Not yet implemented. This can't happen! */ + } else { + /* Loopback interdomain */ + XenEvtchnPort *rp =3D &s->port_table[p->type_val]; + if (!valid_port(p->type_val) || rp->type_val !=3D port || + rp->type !=3D EVTCHNSTAT_interdomain) { + error_report("Inconsistent state for interdomain unbind"); + } else { + /* Set the other end back to unbound */ + rp->type =3D EVTCHNSTAT_unbound; + rp->type_val =3D 0; + } + } + break; + default: break; } @@ -837,6 +854,67 @@ int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi) return ret; } =20 +int xen_evtchn_bind_interdomain_op(struct evtchn_bind_interdomain *interdo= main) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + uint16_t type_val; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (interdomain->remote_dom =3D=3D DOMID_QEMU) { + type_val =3D PORT_INFO_TYPEVAL_REMOTE_QEMU; + } else if (interdomain->remote_dom =3D=3D DOMID_SELF || + interdomain->remote_dom =3D=3D xen_domid) { + type_val =3D 0; + } else { + return -ESRCH; + } + + if (!valid_port(interdomain->remote_port)) { + return -EINVAL; + } + + qemu_mutex_lock(&s->port_lock); + + /* The newly allocated port starts out as unbound */ + ret =3D allocate_port(s, 0, EVTCHNSTAT_unbound, type_val, + &interdomain->local_port); + if (ret) { + goto out; + } + + if (interdomain->remote_dom =3D=3D DOMID_QEMU) { + /* We haven't hooked up QEMU's PV drivers to this yet */ + ret =3D -ENOSYS; + } else { + /* Loopback */ + XenEvtchnPort *rp =3D &s->port_table[interdomain->remote_port]; + XenEvtchnPort *lp =3D &s->port_table[interdomain->local_port]; + + if (rp->type =3D=3D EVTCHNSTAT_unbound && rp->type_val =3D=3D 0) { + /* It's a match! */ + rp->type =3D EVTCHNSTAT_interdomain; + rp->type_val =3D interdomain->local_port; + + lp->type =3D EVTCHNSTAT_interdomain; + lp->type_val =3D interdomain->remote_port; + } else { + ret =3D -EINVAL; + } + } + + if (ret) { + free_port(s, interdomain->local_port); + } + out: + qemu_mutex_unlock(&s->port_lock); + + return ret; + +} int xen_evtchn_alloc_unbound_op(struct evtchn_alloc_unbound *alloc) { XenEvtchnState *s =3D xen_evtchn_singleton; diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index fc080138e3f2..1ebc7580eba5 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -22,6 +22,7 @@ struct evtchn_bind_virq; struct evtchn_bind_ipi; struct evtchn_send; struct evtchn_alloc_unbound; +struct evtchn_bind_interdomain; int xen_evtchn_status_op(struct evtchn_status *status); int xen_evtchn_close_op(struct evtchn_close *close); int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); @@ -29,5 +30,6 @@ int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq= ); int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi); int xen_evtchn_send_op(struct evtchn_send *send); int xen_evtchn_alloc_unbound_op(struct evtchn_alloc_unbound *alloc); +int xen_evtchn_bind_interdomain_op(struct evtchn_bind_interdomain *interdo= main); =20 #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index ac04387a6a12..1aff6b104259 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -936,6 +936,22 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, } break; } + case EVTCHNOP_bind_interdomain: { + struct evtchn_bind_interdomain interdomain; + + qemu_build_assert(sizeof(interdomain) =3D=3D 12); + if (kvm_copy_from_gva(cs, arg, &interdomain, sizeof(interdomain)))= { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_bind_interdomain_op(&interdomain); + if (!err && + kvm_copy_to_gva(cs, arg, &interdomain, sizeof(interdomain))) { + err =3D -EFAULT; + } + break; + } default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761743; cv=none; d=zohomail.com; s=zohoarc; b=cGj2aO3tW2TeNlLjxP7OaFsvymm5aJouBPQ3UC6y47pQx6FIgCgxdK9a4iRLuVP2gV+5a11PARGDDD8nHNYkFRkyJKanS+y4jmvrJ1fY6iJ1HV3VCSkP0/P/1SP8asSgpJdpFUW7/76zt99i9SmEI1Om3Fx3UFi7CKptF5dVyt0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761743; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=79RsmoLxuuXkGBmklmtuZd+2O+6/W1NcISno4kDP6RA=; b=KwNWcswTmxY+20fMaPhLTr/HJzCf2PF213yeGRFcSUKMFIMiCzmLa3irxCpgGtVxovwAdcvoraMdcspAOH1P96nnz4zJygGdbSGhtMi+zIz1XdkbWznDGnxuCoFM+ebIljEjbUkLRW5qHMtq7VsqSGtNeqEmsPs9tfXfqNgScXo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761743216758.7117907650431; Thu, 2 Mar 2023 04:55:43 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8f-0003qJ-2K; Thu, 02 Mar 2023 07:34:25 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6m-0002ZS-UW for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:34 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6j-0003IY-Lo for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:26 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-322-JTgOrAalMVyl7zOH1sEP5g-1; Thu, 02 Mar 2023 07:32:24 -0500 Received: by mail-wm1-f70.google.com with SMTP id n27-20020a05600c3b9b00b003e9ca0f4677so1010332wms.8 for ; Thu, 02 Mar 2023 04:32:23 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id e15-20020a5d594f000000b002c5d3f0f737sm15078271wri.30.2023.03.02.04.32.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760345; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=79RsmoLxuuXkGBmklmtuZd+2O+6/W1NcISno4kDP6RA=; b=PwLiaKxDr/ytuXcvGx9+fuMbtcZqfDZUUE5gPP2XWd5y68s9miLptxLesvwaaAYlZIWjPw /V00bhUyPJQXGje94/Fwufb9zvpqoc9iHUlf7zZPTlOdcLbAtgvCKkyuEMCSdsEy6ouj3S WkXjGwHTl3CWsFDZHDMeNUgJUSI02mU= X-MC-Unique: JTgOrAalMVyl7zOH1sEP5g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=79RsmoLxuuXkGBmklmtuZd+2O+6/W1NcISno4kDP6RA=; b=hmabz0enfTCAAakb1+nfGomvcUdYTyThYxPWTjfGBzaDYVpw5QiSideKndNAxIX5OO 7qMQGn8B7/hraySQzicpRZ6Y8zXeA3Wg7gVWR6bV+C57g/rnQialIoHuSTxTokEfbXco PLKuVetZHbLNvBfB/lEx8Nb/6diM6ljqrL0NoZG5iajVVxZxixsPYweYrGBTtUNuEcgA d6I9sOMeJz7InE0g0DR8wxzXFdNeYPWTeRPBMlsgTPd3O1mAYjM+6YIZlFe0uIVRIQEk 3HSdAID8APns+nX4pDnrzwi2qj4fLYf01LRI0aHpbrSL3IDQ4FRPuALs4n0TBjv0O1ib wR5w== X-Gm-Message-State: AO0yUKVsntvrIB2sT5CAO3j+FniI3jiCflDjjSYw+BQQ0IoJwmyZdO9c mvN1VU1Vc5YxHD6nv8mbzSDk4RS8RJdLFHvy29hipOFD2N/8VvJFIol3UhwM1J5U1BrUMdA0z+O NTdOUnpHTQ8438sKquF6xol2NK9RddG99StSY/ikkOXwx/6F0ssBoOAgM8mfJYVvveUn3/lqSmU o= X-Received: by 2002:adf:f186:0:b0:2c7:4d7d:56b1 with SMTP id h6-20020adff186000000b002c74d7d56b1mr7249072wro.4.1677760342310; Thu, 02 Mar 2023 04:32:22 -0800 (PST) X-Google-Smtp-Source: AK7set+Ws7tPK7WGkY5fYaSyk/SBexLrfdBUnDwvPiSI+xvCv9mVHEfdWJsIcH33IDzuMQbstnmEJw== X-Received: by 2002:adf:f186:0:b0:2c7:4d7d:56b1 with SMTP id h6-20020adff186000000b002c74d7d56b1mr7249056wro.4.1677760342007; Thu, 02 Mar 2023 04:32:22 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 37/62] hw/xen: Implement EVTCHNOP_bind_vcpu Date: Thu, 2 Mar 2023 13:30:04 +0100 Message-Id: <20230302123029.153265-38-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761743886100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 40 +++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 2 ++ target/i386/kvm/xen-emu.c | 12 ++++++++++++ 3 files changed, 54 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index e2e36d94f670..cbaf4f535aaf 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -791,6 +791,46 @@ int xen_evtchn_unmask_op(struct evtchn_unmask *unmask) return ret; } =20 +int xen_evtchn_bind_vcpu_op(struct evtchn_bind_vcpu *vcpu) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + XenEvtchnPort *p; + int ret =3D -EINVAL; + + if (!s) { + return -ENOTSUP; + } + + if (!valid_port(vcpu->port)) { + return -EINVAL; + } + + if (!valid_vcpu(vcpu->vcpu)) { + return -ENOENT; + } + + qemu_mutex_lock(&s->port_lock); + + p =3D &s->port_table[vcpu->port]; + + if (p->type =3D=3D EVTCHNSTAT_interdomain || + p->type =3D=3D EVTCHNSTAT_unbound || + p->type =3D=3D EVTCHNSTAT_pirq || + (p->type =3D=3D EVTCHNSTAT_virq && virq_is_global(p->type_val))) { + /* + * unmask_port() with do_unmask=3D=3Dfalse will just raise the eve= nt + * on the new vCPU if the port was already pending. + */ + p->vcpu =3D vcpu->vcpu; + unmask_port(s, vcpu->port, false); + ret =3D 0; + } + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} + int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq) { XenEvtchnState *s =3D xen_evtchn_singleton; diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 1ebc7580eba5..486b031c8292 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -23,6 +23,7 @@ struct evtchn_bind_ipi; struct evtchn_send; struct evtchn_alloc_unbound; struct evtchn_bind_interdomain; +struct evtchn_bind_vcpu; int xen_evtchn_status_op(struct evtchn_status *status); int xen_evtchn_close_op(struct evtchn_close *close); int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); @@ -31,5 +32,6 @@ int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi); int xen_evtchn_send_op(struct evtchn_send *send); int xen_evtchn_alloc_unbound_op(struct evtchn_alloc_unbound *alloc); int xen_evtchn_bind_interdomain_op(struct evtchn_bind_interdomain *interdo= main); +int xen_evtchn_bind_vcpu_op(struct evtchn_bind_vcpu *vcpu); =20 #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 1aff6b104259..8dc0d320f5ea 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -952,6 +952,18 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, } break; } + case EVTCHNOP_bind_vcpu: { + struct evtchn_bind_vcpu vcpu; + + qemu_build_assert(sizeof(vcpu) =3D=3D 8); + if (kvm_copy_from_gva(cs, arg, &vcpu, sizeof(vcpu))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_bind_vcpu_op(&vcpu); + break; + } default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761517; cv=none; d=zohomail.com; s=zohoarc; b=bYb8od0vKvVuyiXplwKcGZi/J8Y/0PKohakv65/yLj0e7zcqDJZA9YasySDouaLBh+MsncdV5vJzQpDLRJMGe1PTDv4HeWtBJ02pxGNGulHN7nJrb+52+oeOyA3/zrCYJSoXgRX9z23QHazn42kZ+id+tlJFQqLkBLq54/HKtCk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761517; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=w2Lkd43zRTJy6RHJewz2yutPwRBKk/prXz6vda9RNlM=; b=PtnAQSvDuwqJ3Nnymx4LC1yWe/jCV7Cz5vs45NVT2UCbCitIT5Gmg9sA0ttjJmTaAQU4BC8QA2vy1Den4eQeKjj4cfk1mMk8DIOCr4r3RptGtvnYPv7Yjc8EjaEtiyapgxt1fq3tQtSyD1KCo/9FYfZmSFztQq6HzaIbp7W7uwo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761517262251.16452767298767; Thu, 2 Mar 2023 04:51:57 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8J-0003Jd-3T; Thu, 02 Mar 2023 07:34:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6p-0002aK-Lu for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:34 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6m-0003JC-Nn for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:31 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-393-22jN_2gIODaNxprPUoGBrg-1; Thu, 02 Mar 2023 07:32:27 -0500 Received: by mail-wr1-f70.google.com with SMTP id bx25-20020a5d5b19000000b002c7ce4ce3c3so3197989wrb.13 for ; Thu, 02 Mar 2023 04:32:26 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id s11-20020a5d424b000000b002c55521903bsm15013482wrr.51.2023.03.02.04.32.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760348; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=w2Lkd43zRTJy6RHJewz2yutPwRBKk/prXz6vda9RNlM=; b=fv7b38zSIxV8mCgkJFpZ0p402Fqr2yi+/AQYV/1sKS60+BQ7o9cuaaw9sUwHozURl4iDON f/GuuJTnaK9Vr3cOHn2uy6jKjtxgHifEh+4X2v/0OrCTw2epZrbi+/PfcqD1fLE7tuLXFC D23/Izmxqk3hJoZAjgCSKSpDWlXn+Zs= X-MC-Unique: 22jN_2gIODaNxprPUoGBrg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=w2Lkd43zRTJy6RHJewz2yutPwRBKk/prXz6vda9RNlM=; b=uHQ0FNGvRGLc4up8CVeyfLRKZ/FVcFU6RzKRlAGaW0j8lUPvYrX1XZ6Soy8U6FcvQS aPRgQ8dHuGtT1JFUbxX9lgCP7BnWoNpQK2zKOHtSMkRM6/jrFdINteLlTUnqsSDqLefM 9hlkdL0Ij6ojI7ckyO6D3XjiKZYSYQDWzdFcgbhIz7AdGXBWArsYF9qyMPOYEspwJpFr jvZlO08UYkdshkzU9bLFKvu+KuQAVuSpnZYMp769R/fLGClQETDCzS4PwTJf6MuTLN29 b44JmyhWNi1B5hTarpqGx0KmXsxvsl2DbmPqwgCOx2zCv5BRqOZUR/PvTgBrnGfUj/In OV9Q== X-Gm-Message-State: AO0yUKXdwC8UZMNuBUyoIcHQML9aF75R0wFs3GShDV9ujyYSlLiYHCF3 nW4ByDvSpC5a1c1F+SZvwVt3+Yl/vWYteXzoXTcOwvi5H1RO8QegQlzdFA0TyKucmxih/O0/Vj5 WOQDnfnbZMFXoB+PGBMFL9ZDYxjGoLJapY9zKQbwluEc89glFjUHJi8pPzsJhFcL277Ux5v2Y8m Y= X-Received: by 2002:adf:efd0:0:b0:2c7:1c36:3c67 with SMTP id i16-20020adfefd0000000b002c71c363c67mr7787533wrp.23.1677760345197; Thu, 02 Mar 2023 04:32:25 -0800 (PST) X-Google-Smtp-Source: AK7set+c5wPKlJscVJdESlmGbYk3ZGHbhK5U4bZyVABLAhhOp97QtfjDdDvl6Fc/NTNAx6h+nfBOeA== X-Received: by 2002:adf:efd0:0:b0:2c7:1c36:3c67 with SMTP id i16-20020adfefd0000000b002c71c363c67mr7787509wrp.23.1677760344786; Thu, 02 Mar 2023 04:32:24 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 38/62] hw/xen: Implement EVTCHNOP_reset Date: Thu, 2 Mar 2023 13:30:05 +0100 Message-Id: <20230302123029.153265-39-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761519440100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 30 ++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 3 +++ target/i386/kvm/xen-emu.c | 17 +++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index cbaf4f535aaf..c804a315e046 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -12,6 +12,7 @@ #include "qemu/osdep.h" #include "qemu/host-utils.h" #include "qemu/module.h" +#include "qemu/lockable.h" #include "qemu/main-loop.h" #include "qemu/log.h" #include "qapi/error.h" @@ -747,6 +748,35 @@ static int close_port(XenEvtchnState *s, evtchn_port_t= port) return 0; } =20 +int xen_evtchn_soft_reset(void) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int i; + + if (!s) { + return -ENOTSUP; + } + + assert(qemu_mutex_iothread_locked()); + + QEMU_LOCK_GUARD(&s->port_lock); + + for (i =3D 0; i < s->nr_ports; i++) { + close_port(s, i); + } + + return 0; +} + +int xen_evtchn_reset_op(struct evtchn_reset *reset) +{ + if (reset->dom !=3D DOMID_SELF && reset->dom !=3D xen_domid) { + return -ESRCH; + } + + return xen_evtchn_soft_reset(); +} + int xen_evtchn_close_op(struct evtchn_close *close) { XenEvtchnState *s =3D xen_evtchn_singleton; diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 486b031c8292..5d3e03553f34 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -13,6 +13,7 @@ #define QEMU_XEN_EVTCHN_H =20 void xen_evtchn_create(void); +int xen_evtchn_soft_reset(void); int xen_evtchn_set_callback_param(uint64_t param); =20 struct evtchn_status; @@ -24,6 +25,7 @@ struct evtchn_send; struct evtchn_alloc_unbound; struct evtchn_bind_interdomain; struct evtchn_bind_vcpu; +struct evtchn_reset; int xen_evtchn_status_op(struct evtchn_status *status); int xen_evtchn_close_op(struct evtchn_close *close); int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); @@ -33,5 +35,6 @@ int xen_evtchn_send_op(struct evtchn_send *send); int xen_evtchn_alloc_unbound_op(struct evtchn_alloc_unbound *alloc); int xen_evtchn_bind_interdomain_op(struct evtchn_bind_interdomain *interdo= main); int xen_evtchn_bind_vcpu_op(struct evtchn_bind_vcpu *vcpu); +int xen_evtchn_reset_op(struct evtchn_reset *reset); =20 #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 8dc0d320f5ea..821629f07765 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -964,6 +964,18 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, err =3D xen_evtchn_bind_vcpu_op(&vcpu); break; } + case EVTCHNOP_reset: { + struct evtchn_reset reset; + + qemu_build_assert(sizeof(reset) =3D=3D 2); + if (kvm_copy_from_gva(cs, arg, &reset, sizeof(reset))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_reset_op(&reset); + break; + } default: return false; } @@ -981,6 +993,11 @@ int kvm_xen_soft_reset(void) =20 trace_kvm_xen_soft_reset(); =20 + err =3D xen_evtchn_soft_reset(); + if (err) { + return err; + } + /* * Zero is the reset/startup state for HVM_PARAM_CALLBACK_IRQ. Strictl= y, * it maps to HVM_PARAM_CALLBACK_TYPE_GSI with GSI#0, but Xen refuses = to --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761770; cv=none; d=zohomail.com; s=zohoarc; b=WGs3OGWyOv4kxLxPOlaziU6VDfczFTV6SGL0Zg4/0qn1Dhe/EcIEM3+m7UZIlR53C25HZ6YeyJIrijMBkzPDAyhH89V1I8BEvAPUAB9dd3mUNHgPjM4tel/D3d+DqfCqIL6DEwooAo3M/GdlVfEN4BjZg/FW+sRko1fNqClbuQw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761770; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=qaZoORtZamq6HE1TUZYQTRs6Dt1ZRQeGb3Eqwi7fS1k=; b=Pen31QbXOXEg9uvsDM7lj/xk+kGNRTnJhqBFp/sHyrMtig1Ym9eXDKPHcMBySJcnQfE0OL/AplqDttRJSk8phnFZockDQg9rUQ4+u5igJ8WIoa5K+voFXxlOGM79yK9pKd7fWtwdgEv1ydkD1evi1QxladwizIXDu/UVkKtY2D8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761770382603.5466461201231; Thu, 2 Mar 2023 04:56:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8j-00047u-Sm; Thu, 02 Mar 2023 07:34:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6r-0002aU-Il for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:34 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6p-0003Jq-Hn for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:33 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-245-WC9tBMzIPTGJIlcP_47ZmQ-1; Thu, 02 Mar 2023 07:32:29 -0500 Received: by mail-wr1-f71.google.com with SMTP id x3-20020a5d6503000000b002c8c421fdfaso3189104wru.15 for ; Thu, 02 Mar 2023 04:32:29 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id p21-20020a05600c359500b003e0238d9101sm3024387wmq.31.2023.03.02.04.32.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760351; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qaZoORtZamq6HE1TUZYQTRs6Dt1ZRQeGb3Eqwi7fS1k=; b=DdW5bjT44Kx4TK+Ci30Oz0NyDsZG48zAGlLC3mm6H5peCu6dJkaovv2tIFhVpn17uwVFso A8/Gf46f/1xHEIt84sKSYGKvGy5vnpY8Tt+zR8PBpidS/tdAtfS1JcSPa8tlbwiIIigG0a qOx68/S7sQHpONRdgUDOvxGqg+xyAXQ= X-MC-Unique: WC9tBMzIPTGJIlcP_47ZmQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qaZoORtZamq6HE1TUZYQTRs6Dt1ZRQeGb3Eqwi7fS1k=; b=efIjCmpDii/nD/kY8/MaJi+zp4rPM/iu7n6xPtr/6onhwj/2QWOS6bbdPjCvp+Vvot wH5tDYIgbJuHY8AsmuI1zfYzYiR1MOe7civPDNwg6IvQHEx2+nz9xHHjYZYWbL8JlxlV 9gJWtapEOUjqdbN79Oibm2auM5mo/wVsIr/FB8he+09Ewt6H4rP/h4AgQ3HaSlTA4KQJ D+1XJ+FvMq+ON3Jl/gAwyrqr+FLip862FxP6W59k3WURv1aPS8Lbr/0CbK1C4SXllo9S WgFdDN7EmhxBvwFxEb2h1iaVpJzworlh1UwZUCnde+L9javD5AaHpBTTKwK5PXAjX62J 2DpA== X-Gm-Message-State: AO0yUKWw9hFmCFgqSf37bemuHPU2BHWYfzDSBxf4ylEYN26ijewCGzD6 1w/LJ+m8xeu7EcnYxjG+d0mpJHhChkgOLcma34W2V8IFrpRfVo1KoxJpQk5V2FzIPTFrZ1zZJGz mgxz0qSTJ2OzHWN3eWNjKYCqfR40SzSFh07jsEHR8TnS8/BPAMLQVeeoMJk3hYEoU0bGeD9plXR k= X-Received: by 2002:a05:600c:491d:b0:3e2:6ec:7fb7 with SMTP id f29-20020a05600c491d00b003e206ec7fb7mr7199801wmp.0.1677760348062; Thu, 02 Mar 2023 04:32:28 -0800 (PST) X-Google-Smtp-Source: AK7set9N8eDWJNwxN5h1sUm0hPoOGRDr48DMnyVBe9d1J2cgt/hG2KDA0s5AaQlSxNTnwceXK7wlhw== X-Received: by 2002:a05:600c:491d:b0:3e2:6ec:7fb7 with SMTP id f29-20020a05600c491d00b003e206ec7fb7mr7199784wmp.0.1677760347717; Thu, 02 Mar 2023 04:32:27 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , "Dr . David Alan Gilbert" , Paul Durrant Subject: [PULL 39/62] i386/xen: add monitor commands to test event injection Date: Thu, 2 Mar 2023 13:30:06 +0100 Message-Id: <20230302123029.153265-40-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761772118100003 From: Joao Martins Specifically add listing, injection of event channels. Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Acked-by: Dr. David Alan Gilbert Reviewed-by: Paul Durrant --- hmp-commands.hx | 29 ++++++++ hw/i386/kvm/meson.build | 7 ++ hw/i386/kvm/xen-stubs.c | 28 ++++++++ hw/i386/kvm/xen_evtchn.c | 137 +++++++++++++++++++++++++++++++++++++ include/monitor/hmp.h | 2 + qapi/misc-target.json | 116 +++++++++++++++++++++++++++++++ tests/qtest/qmp-cmd-test.c | 1 + 7 files changed, 320 insertions(+) create mode 100644 hw/i386/kvm/xen-stubs.c diff --git a/hmp-commands.hx b/hmp-commands.hx index fbb5daf09bed..b87c250e23b8 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -1815,3 +1815,32 @@ SRST Dump the FDT in dtb format to *filename*. ERST #endif + +#if defined(CONFIG_XEN_EMU) + { + .name =3D "xen-event-inject", + .args_type =3D "port:i", + .params =3D "port", + .help =3D "inject event channel", + .cmd =3D hmp_xen_event_inject, + }, + +SRST +``xen-event-inject`` *port* + Notify guest via event channel on port *port*. +ERST + + + { + .name =3D "xen-event-list", + .args_type =3D "", + .params =3D "", + .help =3D "list event channel state", + .cmd =3D hmp_xen_event_list, + }, + +SRST +``xen-event-list`` + List event channels in the guest +ERST +#endif diff --git a/hw/i386/kvm/meson.build b/hw/i386/kvm/meson.build index cab64df33982..325c9014965b 100644 --- a/hw/i386/kvm/meson.build +++ b/hw/i386/kvm/meson.build @@ -10,3 +10,10 @@ i386_kvm_ss.add(when: 'CONFIG_XEN_EMU', if_true: files( )) =20 i386_ss.add_all(when: 'CONFIG_KVM', if_true: i386_kvm_ss) + +xen_stubs_ss =3D ss.source_set() +xen_stubs_ss.add(when: 'CONFIG_XEN_EMU', if_false: files( + 'xen-stubs.c', +)) + +specific_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: xen_stubs_ss) diff --git a/hw/i386/kvm/xen-stubs.c b/hw/i386/kvm/xen-stubs.c new file mode 100644 index 000000000000..720590aedddf --- /dev/null +++ b/hw/i386/kvm/xen-stubs.c @@ -0,0 +1,28 @@ +/* + * QEMU Xen emulation: QMP stubs + * + * Copyright =C2=A9 2023 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: David Woodhouse + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" + +#include "qapi/error.h" +#include "qapi/qapi-commands-misc-target.h" + +#ifdef TARGET_I386 +EvtchnInfoList *qmp_xen_event_list(Error **errp) +{ + error_setg(errp, "Xen event channel emulation not enabled"); + return NULL; +} + +void qmp_xen_event_inject(uint32_t port, Error **errp) +{ + error_setg(errp, "Xen event channel emulation not enabled"); +} +#endif diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index c804a315e046..e937de7a9358 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -15,7 +15,11 @@ #include "qemu/lockable.h" #include "qemu/main-loop.h" #include "qemu/log.h" +#include "monitor/monitor.h" +#include "monitor/hmp.h" #include "qapi/error.h" +#include "qapi/qapi-commands-misc-target.h" +#include "qapi/qmp/qdict.h" #include "qom/object.h" #include "exec/target_page.h" #include "exec/address-spaces.h" @@ -1069,3 +1073,136 @@ int xen_evtchn_send_op(struct evtchn_send *send) return ret; } =20 +EvtchnInfoList *qmp_xen_event_list(Error **errp) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + EvtchnInfoList *head =3D NULL, **tail =3D &head; + void *shinfo, *pending, *mask; + int i; + + if (!s) { + error_setg(errp, "Xen event channel emulation not enabled"); + return NULL; + } + + shinfo =3D xen_overlay_get_shinfo_ptr(); + if (!shinfo) { + error_setg(errp, "Xen shared info page not allocated"); + return NULL; + } + + if (xen_is_long_mode()) { + pending =3D shinfo + offsetof(struct shared_info, evtchn_pending); + mask =3D shinfo + offsetof(struct shared_info, evtchn_mask); + } else { + pending =3D shinfo + offsetof(struct compat_shared_info, evtchn_pe= nding); + mask =3D shinfo + offsetof(struct compat_shared_info, evtchn_mask); + } + + QEMU_LOCK_GUARD(&s->port_lock); + + for (i =3D 0; i < s->nr_ports; i++) { + XenEvtchnPort *p =3D &s->port_table[i]; + EvtchnInfo *info; + + if (p->type =3D=3D EVTCHNSTAT_closed) { + continue; + } + + info =3D g_new0(EvtchnInfo, 1); + + info->port =3D i; + qemu_build_assert(EVTCHN_PORT_TYPE_CLOSED =3D=3D EVTCHNSTAT_closed= ); + qemu_build_assert(EVTCHN_PORT_TYPE_UNBOUND =3D=3D EVTCHNSTAT_unbou= nd); + qemu_build_assert(EVTCHN_PORT_TYPE_INTERDOMAIN =3D=3D EVTCHNSTAT_i= nterdomain); + qemu_build_assert(EVTCHN_PORT_TYPE_PIRQ =3D=3D EVTCHNSTAT_pirq); + qemu_build_assert(EVTCHN_PORT_TYPE_VIRQ =3D=3D EVTCHNSTAT_virq); + qemu_build_assert(EVTCHN_PORT_TYPE_IPI =3D=3D EVTCHNSTAT_ipi); + + info->type =3D p->type; + if (p->type =3D=3D EVTCHNSTAT_interdomain) { + info->remote_domain =3D g_strdup((p->type_val & PORT_INFO_TYPE= VAL_REMOTE_QEMU) ? + "qemu" : "loopback"); + info->target =3D p->type_val & PORT_INFO_TYPEVAL_REMOTE_PORT_M= ASK; + } else { + info->target =3D p->type_val; + } + info->vcpu =3D p->vcpu; + info->pending =3D test_bit(i, pending); + info->masked =3D test_bit(i, mask); + + QAPI_LIST_APPEND(tail, info); + } + + return head; +} + +void qmp_xen_event_inject(uint32_t port, Error **errp) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + + if (!s) { + error_setg(errp, "Xen event channel emulation not enabled"); + return; + } + + if (!valid_port(port)) { + error_setg(errp, "Invalid port %u", port); + } + + QEMU_LOCK_GUARD(&s->port_lock); + + if (set_port_pending(s, port)) { + error_setg(errp, "Failed to set port %u", port); + return; + } +} + +void hmp_xen_event_list(Monitor *mon, const QDict *qdict) +{ + EvtchnInfoList *iter, *info_list; + Error *err =3D NULL; + + info_list =3D qmp_xen_event_list(&err); + if (err) { + hmp_handle_error(mon, err); + return; + } + + for (iter =3D info_list; iter; iter =3D iter->next) { + EvtchnInfo *info =3D iter->value; + + monitor_printf(mon, "port %4u: vcpu: %d %s", info->port, info->vcp= u, + EvtchnPortType_str(info->type)); + if (info->type !=3D EVTCHN_PORT_TYPE_IPI) { + monitor_printf(mon, "("); + if (info->remote_domain) { + monitor_printf(mon, "%s:", info->remote_domain); + } + monitor_printf(mon, "%d)", info->target); + } + if (info->pending) { + monitor_printf(mon, " PENDING"); + } + if (info->masked) { + monitor_printf(mon, " MASKED"); + } + monitor_printf(mon, "\n"); + } + + qapi_free_EvtchnInfoList(info_list); +} + +void hmp_xen_event_inject(Monitor *mon, const QDict *qdict) +{ + int port =3D qdict_get_int(qdict, "port"); + Error *err =3D NULL; + + qmp_xen_event_inject(port, &err); + if (err) { + hmp_handle_error(mon, err); + } else { + monitor_printf(mon, "Delivered port %d\n", port); + } +} + diff --git a/include/monitor/hmp.h b/include/monitor/hmp.h index 2220f14fc98b..efae6b06bc32 100644 --- a/include/monitor/hmp.h +++ b/include/monitor/hmp.h @@ -114,6 +114,8 @@ void hmp_virtio_status(Monitor *mon, const QDict *qdict= ); void hmp_virtio_queue_status(Monitor *mon, const QDict *qdict); void hmp_vhost_queue_status(Monitor *mon, const QDict *qdict); void hmp_virtio_queue_element(Monitor *mon, const QDict *qdict); +void hmp_xen_event_inject(Monitor *mon, const QDict *qdict); +void hmp_xen_event_list(Monitor *mon, const QDict *qdict); void object_add_completion(ReadLineState *rs, int nb_args, const char *str= ); void object_del_completion(ReadLineState *rs, int nb_args, const char *str= ); void device_add_completion(ReadLineState *rs, int nb_args, const char *str= ); diff --git a/qapi/misc-target.json b/qapi/misc-target.json index 5b6a8e91850a..de9105452377 100644 --- a/qapi/misc-target.json +++ b/qapi/misc-target.json @@ -380,3 +380,119 @@ # ## { 'command': 'query-sgx-capabilities', 'returns': 'SGXInfo', 'if': 'TARGET= _I386' } + + +## +# @EvtchnPortType: +# +# An enumeration of Xen event channel port types. +# +# @closed: The port is unused. +# +# @unbound: The port is allocated and ready to be bound. +# +# @interdomain: The port is connected as an interdomain interrupt. +# +# @pirq: The port is bound to a physical IRQ (PIRQ). +# +# @virq: The port is bound to a virtual IRQ (VIRQ). +# +# @ipi: The post is an inter-processor interrupt (IPI). +# +# Since: 8.0 +## +{ 'enum': 'EvtchnPortType', + 'data': ['closed', 'unbound', 'interdomain', 'pirq', 'virq', 'ipi'], + 'if': 'TARGET_I386' } + +## +# @EvtchnInfo: +# +# Information about a Xen event channel port +# +# @port: the port number +# +# @vcpu: target vCPU for this port +# +# @type: the port type +# +# @remote-domain: remote domain for interdomain ports +# +# @target: remote port ID, or virq/pirq number +# +# @pending: port is currently active pending delivery +# +# @masked: port is masked +# +# Since: 8.0 +## +{ 'struct': 'EvtchnInfo', + 'data': {'port': 'uint16', + 'vcpu': 'uint32', + 'type': 'EvtchnPortType', + 'remote-domain': 'str', + 'target': 'uint16', + 'pending': 'bool', + 'masked': 'bool'}, + 'if': 'TARGET_I386' } + + +## +# @xen-event-list: +# +# Query the Xen event channels opened by the guest. +# +# Returns: list of open event channel ports. +# +# Since: 8.0 +# +# Example: +# +# -> { "execute": "xen-event-list" } +# <- { "return": [ +# { +# "pending": false, +# "port": 1, +# "vcpu": 1, +# "remote-domain": "qemu", +# "masked": false, +# "type": "interdomain", +# "target": 1 +# }, +# { +# "pending": false, +# "port": 2, +# "vcpu": 0, +# "remote-domain": "", +# "masked": false, +# "type": "virq", +# "target": 0 +# } +# ] +# } +# +## +{ 'command': 'xen-event-list', + 'returns': ['EvtchnInfo'], + 'if': 'TARGET_I386' } + +## +# @xen-event-inject: +# +# Inject a Xen event channel port (interrupt) to the guest. +# +# @port: The port number +# +# Returns: - Nothing on success. +# +# Since: 8.0 +# +# Example: +# +# -> { "execute": "xen-event-inject", "arguments": { "port": 1 } } +# <- { "return": { } } +# +## +{ 'command': 'xen-event-inject', + 'data': { 'port': 'uint32' }, + 'if': 'TARGET_I386' } diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c index 98caf6fef6d3..a58de48d2a48 100644 --- a/tests/qtest/qmp-cmd-test.c +++ b/tests/qtest/qmp-cmd-test.c @@ -54,6 +54,7 @@ static int query_error_class(const char *cmd) /* Only valid with accel=3Dtcg */ { "x-query-jit", ERROR_CLASS_GENERIC_ERROR }, { "x-query-opcount", ERROR_CLASS_GENERIC_ERROR }, + { "xen-event-list", ERROR_CLASS_GENERIC_ERROR }, { NULL, -1 } }; int i; --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760796; cv=none; d=zohomail.com; s=zohoarc; b=j51FXm/u720punIqASpE87mSX30C6XXN3255H3qz5ttMHBnroIq3opBMk56DISxEGFhpTQ544JBnf0QDKCawIiEapQ0iwmtZsdMuxf1nS2G5mWiXPk7266OfercnaN4lph6jLMd4bdqwMm/8+8+53kUn70XwGiIulPxiSegF76g= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760796; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=F7B8kC9fbTJB8WNXRcT9rQGyNOTgXhWFYATbCndhLFE=; b=SeIjPL00wkZfsTQQcv5RW9VwT65PLePXjTshIkWjs/WCjGipV80TE1vngmwakCOXESlBhgx/uQA/sgNUSWnO09G8z1RikgxUXXCy/QHyIg08YWdT9qj3tMcuXoQz0tHH+6O2Xl7Uk1blvTowK7SoZYnRsTen49fOlFIR+sxoKYI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760796122260.68400196097275; Thu, 2 Mar 2023 04:39:56 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi9z-0005tQ-Pn; Thu, 02 Mar 2023 07:35:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6u-0002fC-C7 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:38 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6s-0003KQ-Av for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:36 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-620-21lVMP0wPDeIplf76na6mw-1; Thu, 02 Mar 2023 07:32:32 -0500 Received: by mail-wr1-f72.google.com with SMTP id m7-20020a056000008700b002c7047ea429so3199691wrx.21 for ; Thu, 02 Mar 2023 04:32:32 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id s11-20020a5d424b000000b002c55521903bsm15013670wrr.51.2023.03.02.04.32.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760353; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=F7B8kC9fbTJB8WNXRcT9rQGyNOTgXhWFYATbCndhLFE=; b=QzAw9I04jxa+1XMulNIoT5rDqGbvBiziWTEcWIELmic83PeRu9et7HPp52LgtHUgjakRjd H6mHO02JZTh9ZNz9LHsDpY5ea8GNqbMGFVOeXFQ76UOXDaJohhz+BJ/HocqkjWMr9/bCZl 1NoU00mwx63/hmnk2IfJF4AnU57skLg= X-MC-Unique: 21lVMP0wPDeIplf76na6mw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=F7B8kC9fbTJB8WNXRcT9rQGyNOTgXhWFYATbCndhLFE=; b=dvtc4hDksAWoMrHEnk410xB8N5F/5pxY/qGvyF3CqiNbN5iv4/M6c5bXBDx9AbxrDt 9qIddj/dfk4G/5X+zUkxpFojl81fE7rpBQSKUqEsw815CnnbbGkk/yTRqw4Rsx1rBxII VGMHL821yN3E2chwndBQZbAUxuztrvVqV4Tom726vMR2cSM+hQlr+jVLZpaKzTh5csoI 3vOO+YBFQ4js2L2T6ZtyDz6sheceqnARGUGa6/1xoyNbT5xBQMHQhpwgTxzs61bG4bt1 tBTXNwgB5vDf3rQqMfZd1jrjrPR+upm3UEmwPFDDtzdt4SsD3cUpGqKeogQrObOOVLaa VGkg== X-Gm-Message-State: AO0yUKVt1Oq99H+FWMUYHWrqIL+1gmDgHJx9ZjLeENKzEEIqclVZJloS 22ceyTECfkM3XKeHRGKaOAGbTkpqO4k9MjEzgO/fgC+siIHQ8f/ybomLOlc/4F8ty8LNCWwuoce WgyqdLffDRXLm/uVmd2F4JiLRGli17jr+0RPCLwZKugttAcaVIqfNr1Hoab/m+Wrp6rK55UiNQm M= X-Received: by 2002:adf:dd0b:0:b0:2c7:bbe:456c with SMTP id a11-20020adfdd0b000000b002c70bbe456cmr7104484wrm.63.1677760351040; Thu, 02 Mar 2023 04:32:31 -0800 (PST) X-Google-Smtp-Source: AK7set9Qi0LbLluQ5da7GSD4reh+6G+PiOs9KEYsBASCOFJMuDQMWD9uyDaNtOvqtJcx8eIYUR7thQ== X-Received: by 2002:adf:dd0b:0:b0:2c7:bbe:456c with SMTP id a11-20020adfdd0b000000b002c70bbe456cmr7104465wrm.63.1677760350606; Thu, 02 Mar 2023 04:32:30 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 40/62] hw/xen: Support HVM_PARAM_CALLBACK_TYPE_GSI callback Date: Thu, 2 Mar 2023 13:30:07 +0100 Message-Id: <20230302123029.153265-41-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760797088100003 From: David Woodhouse The GSI callback (and later PCI_INTX) is a level triggered interrupt. It is asserted when an event channel is delivered to vCPU0, and is supposed to be cleared when the vcpu_info->evtchn_upcall_pending field for vCPU0 is cleared again. Thankfully, Xen does *not* assert the GSI if the guest sets its own evtchn_upcall_pending field; we only need to assert the GSI when we have delivered an event for ourselves. So that's the easy part, kind of. There's a slight complexity in that we need to hold the BQL before we can call qemu_set_irq(), and we definitely can't do that while holding our own port_lock (because we'll need to take that from the qemu-side functions that the PV backend drivers will call). So if we end up wanting to set the IRQ in a context where we *don't* already hold the BQL, defer to a BH. However, we *do* need to poll for the evtchn_upcall_pending flag being cleared. In an ideal world we would poll that when the EOI happens on the PIC/IOAPIC. That's how it works in the kernel with the VFIO eventfd pairs =E2=80=94 one is used to trigger the interrupt, and the other works i= n the other direction to 'resample' on EOI, and trigger the first eventfd again if the line is still active. However, QEMU doesn't seem to do that. Even VFIO level interrupts seem to be supported by temporarily unmapping the device's BARs from the guest when an interrupt happens, then trapping *all* MMIO to the device and sending the 'resample' event on *every* MMIO access until the IRQ is cleared! Maybe in future we'll plumb the 'resample' concept through QEMU's irq framework but for now we'll do what Xen itself does: just check the flag on every vmexit if the upcall GSI is known to be asserted. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 97 +++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_evtchn.h | 4 ++ hw/i386/pc.c | 6 +++ include/sysemu/kvm_xen.h | 1 + target/i386/cpu.h | 1 + target/i386/kvm/kvm.c | 11 +++++ target/i386/kvm/xen-emu.c | 40 ++++++++++++++++ target/i386/kvm/xen-emu.h | 1 + 8 files changed, 161 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index e937de7a9358..6b0bdba65df3 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -27,6 +27,8 @@ =20 #include "hw/sysbus.h" #include "hw/xen/xen.h" +#include "hw/i386/x86.h" +#include "hw/irq.h" =20 #include "xen_evtchn.h" #include "xen_overlay.h" @@ -100,9 +102,12 @@ struct XenEvtchnState { uint64_t callback_param; bool evtchn_in_kernel; =20 + QEMUBH *gsi_bh; + QemuMutex port_lock; uint32_t nr_ports; XenEvtchnPort port_table[EVTCHN_2L_NR_CHANNELS]; + qemu_irq gsis[IOAPIC_NUM_PINS]; }; =20 struct XenEvtchnState *xen_evtchn_singleton; @@ -167,13 +172,42 @@ static const TypeInfo xen_evtchn_info =3D { .class_init =3D xen_evtchn_class_init, }; =20 +static void gsi_assert_bh(void *opaque) +{ + struct vcpu_info *vi =3D kvm_xen_get_vcpu_info_hva(0); + if (vi) { + xen_evtchn_set_callback_level(!!vi->evtchn_upcall_pending); + } +} + void xen_evtchn_create(void) { XenEvtchnState *s =3D XEN_EVTCHN(sysbus_create_simple(TYPE_XEN_EVTCHN, -1, NULL)); + int i; + xen_evtchn_singleton =3D s; =20 qemu_mutex_init(&s->port_lock); + s->gsi_bh =3D aio_bh_new(qemu_get_aio_context(), gsi_assert_bh, s); + + for (i =3D 0; i < IOAPIC_NUM_PINS; i++) { + sysbus_init_irq(SYS_BUS_DEVICE(s), &s->gsis[i]); + } +} + +void xen_evtchn_connect_gsis(qemu_irq *system_gsis) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int i; + + if (!s) { + return; + } + + for (i =3D 0; i < IOAPIC_NUM_PINS; i++) { + sysbus_connect_irq(SYS_BUS_DEVICE(s), i, system_gsis[i]); + } } =20 static void xen_evtchn_register_types(void) @@ -183,6 +217,64 @@ static void xen_evtchn_register_types(void) =20 type_init(xen_evtchn_register_types) =20 +void xen_evtchn_set_callback_level(int level) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + uint32_t param; + + if (!s) { + return; + } + + /* + * We get to this function in a number of ways: + * + * =E2=80=A2 From I/O context, via PV backend drivers sending a notif= ication to + * the guest. + * + * =E2=80=A2 From guest vCPU context, via loopback interdomain event = channels + * (or theoretically even IPIs but guests don't use those with GSI + * delivery because that's pointless. We don't want a malicious gue= st + * to be able to trigger a deadlock though, so we can't rule it out= .) + * + * =E2=80=A2 From guest vCPU context when the HVM_PARAM_CALLBACK_IRQ = is being + * configured. + * + * =E2=80=A2 From guest vCPU context in the KVM exit handler, if the = upcall + * pending flag has been cleared and the GSI needs to be deasserted. + * + * =E2=80=A2 Maybe in future, in an interrupt ack/eoi notifier when t= he GSI has + * been acked in the irqchip. + * + * Whichever context we come from if we aren't already holding the BQL + * then e can't take it now, as we may already hold s->port_lock. So + * trigger the BH to set the IRQ for us instead of doing it immediatel= y. + * + * In the HVM_PARAM_CALLBACK_IRQ and KVM exit handler cases, the caller + * will deliberately take the BQL because they want the change to take + * effect immediately. That just leaves interdomain loopback as the ca= se + * which uses the BH. + */ + if (!qemu_mutex_iothread_locked()) { + qemu_bh_schedule(s->gsi_bh); + return; + } + + param =3D (uint32_t)s->callback_param; + + switch (s->callback_param >> CALLBACK_VIA_TYPE_SHIFT) { + case HVM_PARAM_CALLBACK_TYPE_GSI: + if (param < IOAPIC_NUM_PINS) { + qemu_set_irq(s->gsis[param], level); + if (level) { + /* Ensure the vCPU polls for deassertion */ + kvm_xen_set_callback_asserted(); + } + } + break; + } +} + int xen_evtchn_set_callback_param(uint64_t param) { XenEvtchnState *s =3D xen_evtchn_singleton; @@ -209,6 +301,11 @@ int xen_evtchn_set_callback_param(uint64_t param) } break; } + + case HVM_PARAM_CALLBACK_TYPE_GSI: + ret =3D 0; + break; + default: /* Xen doesn't return error even if you set something bogus */ ret =3D 0; diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 5d3e03553f34..b03c3108bcba 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -12,9 +12,13 @@ #ifndef QEMU_XEN_EVTCHN_H #define QEMU_XEN_EVTCHN_H =20 +#include "hw/sysbus.h" + void xen_evtchn_create(void); int xen_evtchn_soft_reset(void); int xen_evtchn_set_callback_param(uint64_t param); +void xen_evtchn_connect_gsis(qemu_irq *system_gsis); +void xen_evtchn_set_callback_level(int level); =20 struct evtchn_status; struct evtchn_close; diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f38e3f1be84a..71d3b8bec260 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1310,6 +1310,12 @@ void pc_basic_device_init(struct PCMachineState *pcm= s, } *rtc_state =3D ISA_DEVICE(mc146818_rtc_init(isa_bus, 2000, rtc_irq)); =20 +#ifdef CONFIG_XEN_EMU + if (xen_mode =3D=3D XEN_EMULATE) { + xen_evtchn_connect_gsis(gsi); + } +#endif + qemu_register_boot_set(pc_boot_set, *rtc_state); =20 if (!xen_enabled() && diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h index fbb7414eb797..2b200302810b 100644 --- a/include/sysemu/kvm_xen.h +++ b/include/sysemu/kvm_xen.h @@ -23,6 +23,7 @@ int kvm_xen_soft_reset(void); uint32_t kvm_xen_get_caps(void); void *kvm_xen_get_vcpu_info_hva(uint32_t vcpu_id); void kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu_id, int type); +void kvm_xen_set_callback_asserted(void); int kvm_xen_set_vcpu_virq(uint32_t vcpu_id, uint16_t virq, uint16_t port); =20 #define kvm_xen_has_cap(cap) (!!(kvm_xen_get_caps() & \ diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 4b70257db5dd..7227a8ec08d8 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1808,6 +1808,7 @@ typedef struct CPUArchState { uint64_t xen_vcpu_time_info_gpa; uint64_t xen_vcpu_runstate_gpa; uint8_t xen_vcpu_callback_vector; + bool xen_callback_asserted; uint16_t xen_virq[XEN_NR_VIRQS]; uint64_t xen_singleshot_timer_ns; #endif diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 5a144ec0de3a..3c3795506dbe 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -4990,6 +4990,17 @@ MemTxAttrs kvm_arch_post_run(CPUState *cpu, struct k= vm_run *run) kvm_rate_limit_on_bus_lock(); } =20 + /* + * If the callback is asserted as a GSI (or PCI INTx) then check if + * vcpu_info->evtchn_upcall_pending has been cleared, and deassert + * the callback IRQ if so. Ideally we could hook into the PIC/IOAPIC + * EOI and only resample then, exactly how the VFIO eventfd pairs + * are designed to work for level triggered interrupts. + */ + if (x86_cpu->env.xen_callback_asserted) { + kvm_xen_maybe_deassert_callback(cpu); + } + /* We need to protect the apic state against concurrent accesses from * different threads in case the userspace irqchip is used. */ if (!kvm_irqchip_in_kernel()) { diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 821629f07765..b52617df5490 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -320,6 +320,39 @@ void *kvm_xen_get_vcpu_info_hva(uint32_t vcpu_id) return X86_CPU(cs)->env.xen_vcpu_info_hva; } =20 +void kvm_xen_maybe_deassert_callback(CPUState *cs) +{ + CPUX86State *env =3D &X86_CPU(cs)->env; + struct vcpu_info *vi =3D env->xen_vcpu_info_hva; + if (!vi) { + return; + } + + /* If the evtchn_upcall_pending flag is cleared, turn the GSI off. */ + if (!vi->evtchn_upcall_pending) { + qemu_mutex_lock_iothread(); + /* + * Check again now we have the lock, because it may have been + * asserted in the interim. And we don't want to take the lock + * every time because this is a fast path. + */ + if (!vi->evtchn_upcall_pending) { + X86_CPU(cs)->env.xen_callback_asserted =3D false; + xen_evtchn_set_callback_level(0); + } + qemu_mutex_unlock_iothread(); + } +} + +void kvm_xen_set_callback_asserted(void) +{ + CPUState *cs =3D qemu_get_cpu(0); + + if (cs) { + X86_CPU(cs)->env.xen_callback_asserted =3D true; + } +} + void kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu_id, int type) { CPUState *cs =3D qemu_get_cpu(vcpu_id); @@ -352,6 +385,13 @@ void kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu= _id, int type) */ qemu_cpu_kick(cs); break; + + case HVM_PARAM_CALLBACK_TYPE_GSI: + case HVM_PARAM_CALLBACK_TYPE_PCI_INTX: + if (vcpu_id =3D=3D 0) { + xen_evtchn_set_callback_level(1); + } + break; } } =20 diff --git a/target/i386/kvm/xen-emu.h b/target/i386/kvm/xen-emu.h index 452605699abb..fe85e0b19580 100644 --- a/target/i386/kvm/xen-emu.h +++ b/target/i386/kvm/xen-emu.h @@ -28,5 +28,6 @@ int kvm_xen_init_vcpu(CPUState *cs); int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit); int kvm_put_xen_state(CPUState *cs); int kvm_get_xen_state(CPUState *cs); +void kvm_xen_maybe_deassert_callback(CPUState *cs); =20 #endif /* QEMU_I386_KVM_XEN_EMU_H */ --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761628; cv=none; d=zohomail.com; s=zohoarc; b=ANA6rqWo03O2CgFZyZsrPgCR5A69OjuOs+bNpVXK9sPfzesfbBtD6CkdcuZJCKfTGnDKcDFjyT6g7EbsN1ElhRbh4d9O+9IaoHeNFHe56VyisYCnTa+Z1TOubJIvYYsSGI/I+vI5/i8RohdhmVn88/yg0XrSfb30vejObmEPrOY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761628; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=IdUIlpIs8IPN6BMwzU1eu+jWD9U/sh3sma8wPlM1EBA=; b=mopTMCw8gZh3gueIAmmXS+EfGgnIWYvBeI7HXFg1nv0nU+ybbvbK+g6BzaAa327WKlU8KsiLWT5qXlpWGr0r7QM4JkziZaDYXxmpWuzIkWg/tnlJZdZZOgbN++aimVNx3OFx1NqgjGiCIxnq+u1vNUL2R1OMfabv89Lu1TL9AxU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761628642195.8715570360314; Thu, 2 Mar 2023 04:53:48 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8e-0003qC-UU; Thu, 02 Mar 2023 07:34:24 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6y-0002g1-BJ for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:43 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6v-0003Kz-3i for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:38 -0500 Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-86-vScGSOkoMT2816wzmv2T7Q-1; Thu, 02 Mar 2023 07:32:35 -0500 Received: by mail-wm1-f71.google.com with SMTP id n27-20020a05600c3b9b00b003e9ca0f4677so1010575wms.8 for ; Thu, 02 Mar 2023 04:32:35 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id a10-20020adfe5ca000000b002c3dc4131f5sm14842379wrn.18.2023.03.02.04.32.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760356; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IdUIlpIs8IPN6BMwzU1eu+jWD9U/sh3sma8wPlM1EBA=; b=g9I56g/qDbcyRi96bKP3A8bTLtjpcAYLkGr3ihGSFh0DPW7pm088WnCDKWNGCFGf5xzyfa 3TOUG9FBtgOjgDAh9BctOU1WoC3kjb0c/gQGarr0v42R2ooV80YlKt+X/Nci08dws5r3d6 LyCVO1QB7MbKMWRapo7mgo7xX+euirQ= X-MC-Unique: vScGSOkoMT2816wzmv2T7Q-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IdUIlpIs8IPN6BMwzU1eu+jWD9U/sh3sma8wPlM1EBA=; b=kfGYQsCd43nCEqOlHMeiWLeJMw9873mtv4L9yv9AZKzc/QzswTRwXN5v8bKxiuS4Ph g7YgNaShsr56EuEx/s9fLwwWiuWc8fCIAmITEeSdd9o6sIAbLy3+xjrispV/eEhxNOf1 9GPfO3M2l22j2YWVVS0POLpEBC64Osb0bKLbBPLBk4Bv00JTKzDhvbfyniTTQy1mhmpi sJJiNGlQrF8WmtcVaVvpmi3ZbgAHS3McNIJr2tYkAD7tynRqm5N8KdQur5tNj8vndqhj y3ZHt4hKW/L+NAsdl3ahoDcv8bGqY0m+M3KaxFhqBV+AZdpK4VrudexT/IP61IOIhHAG uHLA== X-Gm-Message-State: AO0yUKXrqmL/0mD3heyaIPtmOsUCVfuAluEC+9fH2J3VEOgpQqMSFdEb 345jC7h5VFLAdfwlKUsKVx4C565dgSNpT7TAtG/cm8tSo6bvDGUe723V/uJwmRXswZK88zkcRxK cALkshYIMYc1j7ZJGI8mM/e0v5OLWn2lPyqlCTY0t9G0c6aFdQV4nTVM++J71C1yXH45c8ZbwkP Q= X-Received: by 2002:a5d:5651:0:b0:2c7:604:52a1 with SMTP id j17-20020a5d5651000000b002c7060452a1mr7338558wrw.29.1677760353816; Thu, 02 Mar 2023 04:32:33 -0800 (PST) X-Google-Smtp-Source: AK7set9CxpDH+3WIb6HbRWDOsKWHc19TYx1GmKkJDrJ9i5NgCzKsXdz0Au16jGdVgUwmnoezONT5Qg== X-Received: by 2002:a5d:5651:0:b0:2c7:604:52a1 with SMTP id j17-20020a5d5651000000b002c7060452a1mr7338543wrw.29.1677760353539; Thu, 02 Mar 2023 04:32:33 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 41/62] hw/xen: Support HVM_PARAM_CALLBACK_TYPE_PCI_INTX callback Date: Thu, 2 Mar 2023 13:30:08 +0100 Message-Id: <20230302123029.153265-42-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761629141100005 From: David Woodhouse The guest is permitted to specify an arbitrary domain/bus/device/function and INTX pin from which the callback IRQ shall appear to have come. In QEMU we can only easily do this for devices that actually exist, and even that requires us "knowing" that it's a PCMachine in order to find the PCI root bus =E2=80=94 although that's OK really because it's always tr= ue. We also don't get to get notified of INTX routing changes, because we can't do that as a passive observer; if we try to register a notifier it will overwrite any existing notifier callback on the device. But in practice, guests using PCI_INTX will only ever use pin A on the Xen platform device, and won't swizzle the INTX routing after they set it up. So this is just fine. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 80 ++++++++++++++++++++++++++++++++------- target/i386/kvm/xen-emu.c | 34 +++++++++++++++++ 2 files changed, 100 insertions(+), 14 deletions(-) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index 6b0bdba65df3..f39b751ff999 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -28,6 +28,8 @@ #include "hw/sysbus.h" #include "hw/xen/xen.h" #include "hw/i386/x86.h" +#include "hw/i386/pc.h" +#include "hw/pci/pci.h" #include "hw/irq.h" =20 #include "xen_evtchn.h" @@ -101,6 +103,7 @@ struct XenEvtchnState { =20 uint64_t callback_param; bool evtchn_in_kernel; + uint32_t callback_gsi; =20 QEMUBH *gsi_bh; =20 @@ -217,11 +220,41 @@ static void xen_evtchn_register_types(void) =20 type_init(xen_evtchn_register_types) =20 +static int set_callback_pci_intx(XenEvtchnState *s, uint64_t param) +{ + PCMachineState *pcms =3D PC_MACHINE(qdev_get_machine()); + uint8_t pin =3D param & 3; + uint8_t devfn =3D (param >> 8) & 0xff; + uint16_t bus =3D (param >> 16) & 0xffff; + uint16_t domain =3D (param >> 32) & 0xffff; + PCIDevice *pdev; + PCIINTxRoute r; + + if (domain || !pcms) { + return 0; + } + + pdev =3D pci_find_device(pcms->bus, bus, devfn); + if (!pdev) { + return 0; + } + + r =3D pci_device_route_intx_to_irq(pdev, pin); + if (r.mode !=3D PCI_INTX_ENABLED) { + return 0; + } + + /* + * Hm, can we be notified of INTX routing changes? Not without + * *owning* the device and being allowed to overwrite its own + * ->intx_routing_notifier, AFAICT. So let's not. + */ + return r.irq; +} + void xen_evtchn_set_callback_level(int level) { XenEvtchnState *s =3D xen_evtchn_singleton; - uint32_t param; - if (!s) { return; } @@ -260,18 +293,12 @@ void xen_evtchn_set_callback_level(int level) return; } =20 - param =3D (uint32_t)s->callback_param; - - switch (s->callback_param >> CALLBACK_VIA_TYPE_SHIFT) { - case HVM_PARAM_CALLBACK_TYPE_GSI: - if (param < IOAPIC_NUM_PINS) { - qemu_set_irq(s->gsis[param], level); - if (level) { - /* Ensure the vCPU polls for deassertion */ - kvm_xen_set_callback_asserted(); - } + if (s->callback_gsi && s->callback_gsi < IOAPIC_NUM_PINS) { + qemu_set_irq(s->gsis[s->callback_gsi], level); + if (level) { + /* Ensure the vCPU polls for deassertion */ + kvm_xen_set_callback_asserted(); } - break; } } =20 @@ -283,15 +310,22 @@ int xen_evtchn_set_callback_param(uint64_t param) .u.vector =3D 0, }; bool in_kernel =3D false; + uint32_t gsi =3D 0; + int type =3D param >> CALLBACK_VIA_TYPE_SHIFT; int ret; =20 if (!s) { return -ENOTSUP; } =20 + /* + * We need the BQL because set_callback_pci_intx() may call into PCI c= ode, + * and because we may need to manipulate the old and new GSI levels. + */ + assert(qemu_mutex_iothread_locked()); qemu_mutex_lock(&s->port_lock); =20 - switch (param >> CALLBACK_VIA_TYPE_SHIFT) { + switch (type) { case HVM_PARAM_CALLBACK_TYPE_VECTOR: { xa.u.vector =3D (uint8_t)param, =20 @@ -299,10 +333,17 @@ int xen_evtchn_set_callback_param(uint64_t param) if (!ret && kvm_xen_has_cap(EVTCHN_SEND)) { in_kernel =3D true; } + gsi =3D 0; break; } =20 + case HVM_PARAM_CALLBACK_TYPE_PCI_INTX: + gsi =3D set_callback_pci_intx(s, param); + ret =3D gsi ? 0 : -EINVAL; + break; + case HVM_PARAM_CALLBACK_TYPE_GSI: + gsi =3D (uint32_t)param; ret =3D 0; break; =20 @@ -320,6 +361,17 @@ int xen_evtchn_set_callback_param(uint64_t param) } s->callback_param =3D param; s->evtchn_in_kernel =3D in_kernel; + + if (gsi !=3D s->callback_gsi) { + struct vcpu_info *vi =3D kvm_xen_get_vcpu_info_hva(0); + + xen_evtchn_set_callback_level(0); + s->callback_gsi =3D gsi; + + if (gsi && vi && vi->evtchn_upcall_pending) { + kvm_xen_inject_vcpu_callback_vector(0, type); + } + } } =20 qemu_mutex_unlock(&s->port_lock); diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index b52617df5490..9e22c9fa025f 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -131,6 +131,38 @@ int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) return ret; } =20 + /* If called a second time, don't repeat the rest of the setup. */ + if (s->xen_caps) { + return 0; + } + + /* + * Event channel delivery via GSI/PCI_INTX needs to poll the vcpu_info + * of vCPU0 to deassert the IRQ when ->evtchn_upcall_pending is cleare= d. + * + * In the kernel, there's a notifier hook on the PIC/IOAPIC which allo= ws + * such things to be polled at precisely the right time. We *could* do + * it nicely in the kernel: check vcpu_info[0]->evtchn_upcall_pending = at + * the moment the IRQ is acked, and see if it should be reasserted. + * + * But the in-kernel irqchip is deprecated, so we're unlikely to add + * that support in the kernel. Insist on using the split irqchip mode + * instead. + * + * This leaves us polling for the level going low in QEMU, which lacks + * the appropriate hooks in its PIC/IOAPIC code. Even VFIO is sending a + * spurious 'ack' to an INTX IRQ every time there's any MMIO access to + * the device (for which it has to unmap the device and trap access, f= or + * some period after an IRQ!!). In the Xen case, we do it on exit from + * KVM_RUN, if the flag is set to say that the GSI is currently assert= ed. + * Which is kind of icky, but less so than the VFIO one. I may fix them + * both later... + */ + if (!kvm_kernel_irqchip_split()) { + error_report("kvm: Xen support requires kernel-irqchip=3Dsplit"); + return -EINVAL; + } + s->xen_caps =3D xen_caps; return 0; } @@ -684,7 +716,9 @@ static bool handle_set_param(struct kvm_xen_exit *exit,= X86CPU *cpu, =20 switch (hp.index) { case HVM_PARAM_CALLBACK_IRQ: + qemu_mutex_lock_iothread(); err =3D xen_evtchn_set_callback_param(hp.value); + qemu_mutex_unlock_iothread(); xen_set_long_mode(exit->u.hcall.longmode); break; default: --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760647; cv=none; d=zohomail.com; s=zohoarc; b=aiJj7ljhnoOLJ7zhisWrZFAWiSy8EXFRmqSaxc10QwO8ei+r9tWUT2UowBpZgjjg/+8QzdDJrey3QfxWlXI/S3hj4xiT1MX2VyaTIXxczJtXaVXIhxpdK3eSQlIRCgaXRUNiiSzxAzzqunZE6+8G3/QMqBwfYvTRTRwhJIY/LcA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760647; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=57EiPY489a/W7S1NewslxP2EKb/16URbgqcakb48AwA=; b=e34Mi5nRXS7yIke0sXR6tCBm/QOKYxxU961TA2faHIXWWBredXaIEPmr0NN+N9Rp5tamS3rQj2cWqDigmVXt0tZgY/F/11T+9tXSmCURgL87ymKOXh/nRBj+flW7NqqnwPk3I3gx1CcmoKfTIYN0fL5LFlvs+q+/+62voE2ut00= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760647517320.0686195623555; Thu, 2 Mar 2023 04:37:27 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi9x-0005mi-Rm; Thu, 02 Mar 2023 07:35:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6z-0002g3-OT for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:43 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi6y-0003LH-3p for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:41 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-658-Bq1KX90IP3amjiNtJAmw1g-1; Thu, 02 Mar 2023 07:32:38 -0500 Received: by mail-wm1-f69.google.com with SMTP id e17-20020a05600c219100b003e21fa60ec1so1019847wme.2 for ; Thu, 02 Mar 2023 04:32:37 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id b6-20020a5d4b86000000b002c5691f13eesm14996988wrt.50.2023.03.02.04.32.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760359; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=57EiPY489a/W7S1NewslxP2EKb/16URbgqcakb48AwA=; b=Q3EWVB5U3s6pNvlJznCTcwGOu8oB2kAHoJwi6Owv3PV2Bw6Fn5axwGthLP91kaPsWifp5T vhTH8rj0iCc7Bgxl9aA8Ne/Wtrs2QtAwWPAWF5pGgUf4umS6uHhdCAHNBtLIsldSsnPurG LpB+4RUJV3DxAjJlxjQOfvAMe6qT04o= X-MC-Unique: Bq1KX90IP3amjiNtJAmw1g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=57EiPY489a/W7S1NewslxP2EKb/16URbgqcakb48AwA=; b=Snt0FRU97Imde8hVpLljWieHQdbkImLlkRDf6wCoXpbsZBZx1wcxuHNkJjH+zcCOpk o5fvaMr+3P39jeZ2C7U8HRTBeEWQC8h4Ug2aex/EnKq5aNeC1rjHHgY2g39C3s/nvpr7 PDJQKPelgwHIqVtI4H4bYMiXO/7++hGveBRlJsFMx41gA5nUqSByitMcinuAZ+QoRgxO 0Sq1RG0QlYiGSA2TA1T2b4L0IN7MrOxvoxe+Ec7fnyHGFzegmnYzXNamvApcj+E5fyLX wnoNSLqjmq3X/3PD/DunlGu9bVYKnZv6xNgIq9+ZuGUHZumBZbPa0toVI5LuMYYyS5/I DK1A== X-Gm-Message-State: AO0yUKVGLyXqlBd1oaMe08poMhwdRqhU4XSajy+026+U897QkjOurmwB Qf55ss5y+vqba5XC4HekRn2Eak8n5Sloh4EVCMI5WfYAJmPeBbfIXAc0jtT2X7TaOd1fiKjb34L 1/zeDJWpO9wIBHwttvP2/iGdTY75VHPmfYhAQ/g4ZEvZgUd6KrfUzENXACBzSlZF5CZLUgwpn7D k= X-Received: by 2002:adf:d0cb:0:b0:2c5:76bd:c0f3 with SMTP id z11-20020adfd0cb000000b002c576bdc0f3mr7551661wrh.6.1677760356491; Thu, 02 Mar 2023 04:32:36 -0800 (PST) X-Google-Smtp-Source: AK7set8Qqh8DuUylGvaMSEhRmjQ6NXyusIY5snskLG4JsbQlJW0Iv/hfUzS6S6JfBC5yWfTSewMT/A== X-Received: by 2002:adf:d0cb:0:b0:2c5:76bd:c0f3 with SMTP id z11-20020adfd0cb000000b002c576bdc0f3mr7551648wrh.6.1677760356195; Thu, 02 Mar 2023 04:32:36 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 42/62] kvm/i386: Add xen-gnttab-max-frames property Date: Thu, 2 Mar 2023 13:30:09 +0100 Message-Id: <20230302123029.153265-43-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760649498100003 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- accel/kvm/kvm-all.c | 1 + include/sysemu/kvm_int.h | 1 + include/sysemu/kvm_xen.h | 1 + target/i386/kvm/kvm.c | 34 ++++++++++++++++++++++++++++++++++ target/i386/kvm/xen-emu.c | 6 ++++++ 5 files changed, 43 insertions(+) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 511d3eb9a0da..3d8e400bbf86 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -3704,6 +3704,7 @@ static void kvm_accel_instance_init(Object *obj) s->notify_vmexit =3D NOTIFY_VMEXIT_OPTION_RUN; s->notify_window =3D 0; s->xen_version =3D 0; + s->xen_gnttab_max_frames =3D 64; } =20 /** diff --git a/include/sysemu/kvm_int.h b/include/sysemu/kvm_int.h index 7f945bc7633e..39ce4d36f684 100644 --- a/include/sysemu/kvm_int.h +++ b/include/sysemu/kvm_int.h @@ -120,6 +120,7 @@ struct KVMState uint32_t notify_window; uint32_t xen_version; uint32_t xen_caps; + uint16_t xen_gnttab_max_frames; }; =20 void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml, diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h index 2b200302810b..49afa0eb9e43 100644 --- a/include/sysemu/kvm_xen.h +++ b/include/sysemu/kvm_xen.h @@ -25,6 +25,7 @@ void *kvm_xen_get_vcpu_info_hva(uint32_t vcpu_id); void kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu_id, int type); void kvm_xen_set_callback_asserted(void); int kvm_xen_set_vcpu_virq(uint32_t vcpu_id, uint16_t virq, uint16_t port); +uint16_t kvm_xen_get_gnttab_max_frames(void); =20 #define kvm_xen_has_cap(cap) (!!(kvm_xen_get_caps() & \ KVM_XEN_HVM_CONFIG_ ## cap)) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 3c3795506dbe..a73c49aabba5 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -5880,6 +5880,33 @@ static void kvm_arch_set_xen_version(Object *obj, Vi= sitor *v, } } =20 +static void kvm_arch_get_xen_gnttab_max_frames(Object *obj, Visitor *v, + const char *name, void *opa= que, + Error **errp) +{ + KVMState *s =3D KVM_STATE(obj); + uint16_t value =3D s->xen_gnttab_max_frames; + + visit_type_uint16(v, name, &value, errp); +} + +static void kvm_arch_set_xen_gnttab_max_frames(Object *obj, Visitor *v, + const char *name, void *opa= que, + Error **errp) +{ + KVMState *s =3D KVM_STATE(obj); + Error *error =3D NULL; + uint16_t value; + + visit_type_uint16(v, name, &value, &error); + if (error) { + error_propagate(errp, error); + return; + } + + s->xen_gnttab_max_frames =3D value; +} + void kvm_arch_accel_class_init(ObjectClass *oc) { object_class_property_add_enum(oc, "notify-vmexit", "NotifyVMexitOptio= n", @@ -5905,6 +5932,13 @@ void kvm_arch_accel_class_init(ObjectClass *oc) "Xen version to be emulated " "(in XENVER_version form " "e.g. 0x4000a for 4.10)"); + + object_class_property_add(oc, "xen-gnttab-max-frames", "uint16", + kvm_arch_get_xen_gnttab_max_frames, + kvm_arch_set_xen_gnttab_max_frames, + NULL, NULL); + object_class_property_set_description(oc, "xen-gnttab-max-frames", + "Maximum number of grant table f= rames"); } =20 void kvm_set_max_apic_id(uint32_t max_apic_id) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 9e22c9fa025f..46be63172686 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -1238,6 +1238,12 @@ int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_= exit *exit) return 0; } =20 +uint16_t kvm_xen_get_gnttab_max_frames(void) +{ + KVMState *s =3D KVM_STATE(current_accel()); + return s->xen_gnttab_max_frames; +} + int kvm_put_xen_state(CPUState *cs) { X86CPU *cpu =3D X86_CPU(cs); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761413; cv=none; d=zohomail.com; s=zohoarc; b=SpEttvk4+uRVahBU6XGsQoWMDgNqHxzH5RPzBipFbvmNKrHGaB/ipEt7BAhsxIQyDvX0rwJubznpl/QQ0t4SoSv6xsjBIDVxq3cQi8oXxwDgy7/hr0uVsgcpUp97t90l2YV2qnyzYKrvpHQc09qU3v+qkWI/XyBk6fpXUQ17vmE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761413; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=oeOvon9/KtSbK3fyhkr3bR6YqiZBhFCHe2DV2w+o6iI=; b=Cb+eWl+OUzWOK0xKT/9gT7V9xDw/sGQFvdiohHAiuLF4/5SWJLtW8OrmMwU6bvhWT6/9q6wc09SbdaAPOoF6LwceON9L4C4eA2CzG3J7afaoCcLg4Gb0t7bfbTGmGzDATHrn5wAZvXJwX6WU2d/+8qzybtSNnxSetf5BiEDwqz0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761413987468.87585160039146; Thu, 2 Mar 2023 04:50:13 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi9J-0004qj-UU; Thu, 02 Mar 2023 07:35:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi73-0002p4-Px for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:49 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi71-0003M2-9N for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:45 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-359-9nZQKXuiPmqcoXRDe1dzIw-1; Thu, 02 Mar 2023 07:32:41 -0500 Received: by mail-wm1-f72.google.com with SMTP id p22-20020a7bcc96000000b003e2036a1516so1193389wma.7 for ; Thu, 02 Mar 2023 04:32:40 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id k14-20020a05600c1c8e00b003e215a796fasm3217690wms.34.2023.03.02.04.32.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760362; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oeOvon9/KtSbK3fyhkr3bR6YqiZBhFCHe2DV2w+o6iI=; b=a9aXKBVIP0Q6FE6foTdt6TKC2ReK6yjAVu9ETGO1sG9UpPiZQHcTWRUipIt5ZEWlqHbr1H r5CjrGna/GnKuI73aSegy5KCT5f0OqbXTX6+Ito8bV8VjoFVSiyEuLhwqRKvzsEK4VWK6H o00gZbI/StAFsB2BMaEacMaM4pyz7Q0= X-MC-Unique: 9nZQKXuiPmqcoXRDe1dzIw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oeOvon9/KtSbK3fyhkr3bR6YqiZBhFCHe2DV2w+o6iI=; b=zGqD+zlsUx3f39w+rK/kxZdiBeVBUQ/TsqQxqUNoGr2gMnXsFiAnirNRLFn5Siog/d eq7zsX0+IeL5Hft8XNVuQXIAtqYYbGKFn89E4anCyao20o0Jq8gtl8NeJ6ns7OtvGoLY DY6rdR8/WFI67Ju7VSbaRdR8ce/8U1ndHImJaxNakySlaj0WIQeo4NDWvY+nicTjK+Q5 5QGyucS/yR6WgIEIOdpE7Pr9rcibVsdJ7QTmVI2x2SoMjfoCh+hZzkvoV70UMzLwV/8j RK5zZN1Xl1OERlcsftQVe/hNcoEyexfUb5OSl/XJjxd1FJpfb/KaNxlBL4Ddpx4RPkjN D0pA== X-Gm-Message-State: AO0yUKWZlgvYoqtPl3+myEXE2wft2u+ZZGT7HOR5+usddJ9K4otz2Flb PezHrTp01lBhQzWRkzEEbTxgPGzq+xEyFIkniOUAFIcg5QoI1jem10sM/pxLtbGFnUME+c2XYyH 7E2pM+szQg4jL7KFkqZWA2zna4vqV/3CjKX/vhkEP53VYVhbtnzNifrColhqF31S++zBGsJXf9+ w= X-Received: by 2002:a05:600c:1c1f:b0:3eb:246d:7efd with SMTP id j31-20020a05600c1c1f00b003eb246d7efdmr1332663wms.2.1677760359191; Thu, 02 Mar 2023 04:32:39 -0800 (PST) X-Google-Smtp-Source: AK7set+jEd109fjqZBg2Vq2oY6jAPzIZmilIfINvw+fQZsYDkkgXIFCKJ0S2Q1o8gOCdzXtd8ZQvWA== X-Received: by 2002:a05:600c:1c1f:b0:3eb:246d:7efd with SMTP id j31-20020a05600c1c1f00b003eb246d7efdmr1332650wms.2.1677760358959; Thu, 02 Mar 2023 04:32:38 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 43/62] hw/xen: Add xen_gnttab device for grant table emulation Date: Thu, 2 Mar 2023 13:30:10 +0100 Message-Id: <20230302123029.153265-44-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761414527100001 From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/meson.build | 1 + hw/i386/kvm/xen_gnttab.c | 111 ++++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_gnttab.h | 18 +++++++ hw/i386/pc.c | 2 + target/i386/kvm/xen-emu.c | 3 ++ 5 files changed, 135 insertions(+) create mode 100644 hw/i386/kvm/xen_gnttab.c create mode 100644 hw/i386/kvm/xen_gnttab.h diff --git a/hw/i386/kvm/meson.build b/hw/i386/kvm/meson.build index 325c9014965b..067ff525eeb6 100644 --- a/hw/i386/kvm/meson.build +++ b/hw/i386/kvm/meson.build @@ -7,6 +7,7 @@ i386_kvm_ss.add(when: 'CONFIG_IOAPIC', if_true: files('ioap= ic.c')) i386_kvm_ss.add(when: 'CONFIG_XEN_EMU', if_true: files( 'xen_overlay.c', 'xen_evtchn.c', + 'xen_gnttab.c', )) =20 i386_ss.add_all(when: 'CONFIG_KVM', if_true: i386_kvm_ss) diff --git a/hw/i386/kvm/xen_gnttab.c b/hw/i386/kvm/xen_gnttab.c new file mode 100644 index 000000000000..ef8857e50c7b --- /dev/null +++ b/hw/i386/kvm/xen_gnttab.c @@ -0,0 +1,111 @@ +/* + * QEMU Xen emulation: Grant table support + * + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: David Woodhouse + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/host-utils.h" +#include "qemu/module.h" +#include "qemu/lockable.h" +#include "qemu/main-loop.h" +#include "qapi/error.h" +#include "qom/object.h" +#include "exec/target_page.h" +#include "exec/address-spaces.h" +#include "migration/vmstate.h" + +#include "hw/sysbus.h" +#include "hw/xen/xen.h" +#include "xen_overlay.h" +#include "xen_gnttab.h" + +#include "sysemu/kvm.h" +#include "sysemu/kvm_xen.h" + +#include "hw/xen/interface/memory.h" +#include "hw/xen/interface/grant_table.h" + +#define TYPE_XEN_GNTTAB "xen-gnttab" +OBJECT_DECLARE_SIMPLE_TYPE(XenGnttabState, XEN_GNTTAB) + +#define XEN_PAGE_SHIFT 12 +#define XEN_PAGE_SIZE (1ULL << XEN_PAGE_SHIFT) + +struct XenGnttabState { + /*< private >*/ + SysBusDevice busdev; + /*< public >*/ + + uint32_t nr_frames; + uint32_t max_frames; +}; + +struct XenGnttabState *xen_gnttab_singleton; + +static void xen_gnttab_realize(DeviceState *dev, Error **errp) +{ + XenGnttabState *s =3D XEN_GNTTAB(dev); + + if (xen_mode !=3D XEN_EMULATE) { + error_setg(errp, "Xen grant table support is for Xen emulation"); + return; + } + s->nr_frames =3D 0; + s->max_frames =3D kvm_xen_get_gnttab_max_frames(); +} + +static bool xen_gnttab_is_needed(void *opaque) +{ + return xen_mode =3D=3D XEN_EMULATE; +} + +static const VMStateDescription xen_gnttab_vmstate =3D { + .name =3D "xen_gnttab", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D xen_gnttab_is_needed, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(nr_frames, XenGnttabState), + VMSTATE_END_OF_LIST() + } +}; + +static void xen_gnttab_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->realize =3D xen_gnttab_realize; + dc->vmsd =3D &xen_gnttab_vmstate; +} + +static const TypeInfo xen_gnttab_info =3D { + .name =3D TYPE_XEN_GNTTAB, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(XenGnttabState), + .class_init =3D xen_gnttab_class_init, +}; + +void xen_gnttab_create(void) +{ + xen_gnttab_singleton =3D XEN_GNTTAB(sysbus_create_simple(TYPE_XEN_GNTT= AB, + -1, NULL)); +} + +static void xen_gnttab_register_types(void) +{ + type_register_static(&xen_gnttab_info); +} + +type_init(xen_gnttab_register_types) + +int xen_gnttab_map_page(uint64_t idx, uint64_t gfn) +{ + return -ENOSYS; +} + diff --git a/hw/i386/kvm/xen_gnttab.h b/hw/i386/kvm/xen_gnttab.h new file mode 100644 index 000000000000..a7caa94c838c --- /dev/null +++ b/hw/i386/kvm/xen_gnttab.h @@ -0,0 +1,18 @@ +/* + * QEMU Xen emulation: Grant table support + * + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: David Woodhouse + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#ifndef QEMU_XEN_GNTTAB_H +#define QEMU_XEN_GNTTAB_H + +void xen_gnttab_create(void); +int xen_gnttab_map_page(uint64_t idx, uint64_t gfn); + +#endif /* QEMU_XEN_GNTTAB_H */ diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 71d3b8bec260..1cf112e54227 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -92,6 +92,7 @@ #include "hw/virtio/virtio-mem-pci.h" #include "hw/i386/kvm/xen_overlay.h" #include "hw/i386/kvm/xen_evtchn.h" +#include "hw/i386/kvm/xen_gnttab.h" #include "hw/mem/memory-device.h" #include "sysemu/replay.h" #include "target/i386/cpu.h" @@ -1860,6 +1861,7 @@ int pc_machine_kvm_type(MachineState *machine, const = char *kvm_type) if (xen_mode =3D=3D XEN_EMULATE) { xen_overlay_create(); xen_evtchn_create(); + xen_gnttab_create(); } #endif return 0; diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 46be63172686..6f9b7a5cb96e 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -25,6 +25,7 @@ #include "hw/i386/apic-msidef.h" #include "hw/i386/kvm/xen_overlay.h" #include "hw/i386/kvm/xen_evtchn.h" +#include "hw/i386/kvm/xen_gnttab.h" =20 #include "hw/xen/interface/version.h" #include "hw/xen/interface/sched.h" @@ -563,6 +564,8 @@ static int add_to_physmap_one(uint32_t space, uint64_t = idx, uint64_t gfn) return xen_set_shared_info(gfn); =20 case XENMAPSPACE_grant_table: + return xen_gnttab_map_page(idx, gfn); + case XENMAPSPACE_gmfn: case XENMAPSPACE_gmfn_range: return -ENOTSUP; --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761507; cv=none; d=zohomail.com; s=zohoarc; b=d0xBthiYTAYc9MSAXCS1J4LCcTp+0uE724mE/ocDHao+RZBDbRHUpIB2h41PNswP+RkFSwRF8k6TjLow7XVax22rJqCrObF2RbRtxPrXRDH/6Ab4YlH+6q0O+r1py1F/SJ3bmW9u4r3qLJyRKUWUh7ChAj2WvWN083/dKhr8ep0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761507; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=dB6WbxKXppn/pBKWsu4ZTdMZRThfOq9ma6VEMSb9U9w=; b=jNqPvtY0hBtuBaX34Lb0yfxvacx/XizFgp8f+QthG7qIg+PfXUpcrs6G/H45JI/jjGNQ8sGSvZw+omj9D74k9IIws3GAks389r4rzbloC7o6IxrHaEzcA+67tDnulT5w/PJKhmnQEaZWXmFBXPNmB8EwXvussecG4+RWZsuKiKA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761507130238.73016209879916; Thu, 2 Mar 2023 04:51:47 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiAG-0006EO-Fc; Thu, 02 Mar 2023 07:36:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi76-0002s5-21 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:50 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi73-0003Q2-CS for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:46 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-340-W8SGBWovM_aYp-f-HOYvWA-1; Thu, 02 Mar 2023 07:32:43 -0500 Received: by mail-wr1-f71.google.com with SMTP id t19-20020a0560001a5300b002ce013276b8so176316wry.1 for ; Thu, 02 Mar 2023 04:32:43 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id n7-20020a5d4c47000000b002c5534db60bsm15114788wrt.71.2023.03.02.04.32.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760364; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dB6WbxKXppn/pBKWsu4ZTdMZRThfOq9ma6VEMSb9U9w=; b=GYfek5T4AaNGZI9mj+dnxksU47t+hhHFORCmTpgat6GrL2UiHR1HaYuRGEHoYP4Y7Jq7Rd rF6ecJSiHv35rr21K8V4hi+zyr5rGAF5piHNfZcW3tz4rzgvwqznGlTaO2Bfq/O2FkOXXn A9wh1T93tvwVKYuXB8M6b44x9iH/twI= X-MC-Unique: W8SGBWovM_aYp-f-HOYvWA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dB6WbxKXppn/pBKWsu4ZTdMZRThfOq9ma6VEMSb9U9w=; b=j1/NZdEgKLbmetLKsiCwXVnvjYjv4OHlos51LAwDYnW2huw0MboKes5P7hpx+IDZW4 9m2XQ1PB7C1RevtLKlrgNkb5EsAM6QrXrfbzt0a+auJJEoTOmP8X344qfi+TKe0XwUYo y0Cqj/tyJF1fmuBM/tDcfWNeAAhs7gAqXJWmEJ+MmEyRCrPIOVFCw6w21g3HA84fdX2S VVT6oAuFvO1NRud4UpNFuhOk60o1PtKRGQuwf//lTmxH5BauhDVlMLPl0iGspgo5L5c5 Y/kmGytGyXl5rWG71pjUW5T6ruYFGitEoEDk+D7uy1OdMZddWOYaftD36l1sHznEXzDG e92A== X-Gm-Message-State: AO0yUKVdXhorW18WrpfOy/Mh5va+4oMzN5emlWP0/FUcHAWP+fhI+7/7 trSlyGwzGqP9kbEGu8ozyFq/xXI5Px6TLj9kNc04gUek6vygLUL8mIDWxdTPTcGCf1px+Cw82lM 7O7f1Zam/3VuY1/Hjfxpoookr2qWP8S1ZOdtJ3jIy0kY3h+SJGRl5PlFtn6ge+hcg1P0Ut3+++R c= X-Received: by 2002:a5d:570e:0:b0:2cb:b1dd:9adb with SMTP id a14-20020a5d570e000000b002cbb1dd9adbmr7791500wrv.17.1677760361978; Thu, 02 Mar 2023 04:32:41 -0800 (PST) X-Google-Smtp-Source: AK7set9RgEebUENZxQ+06g7zWv80Z5ZBGn5x6KEWUvKVgj4X7OyNdRAXBKxLvYbHUPQQFz04kPD3Vw== X-Received: by 2002:a5d:570e:0:b0:2cb:b1dd:9adb with SMTP id a14-20020a5d570e000000b002cbb1dd9adbmr7791484wrv.17.1677760361667; Thu, 02 Mar 2023 04:32:41 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 44/62] hw/xen: Support mapping grant frames Date: Thu, 2 Mar 2023 13:30:11 +0100 Message-Id: <20230302123029.153265-45-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761507442100002 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_gnttab.c | 73 ++++++++++++++++++++++++++++++++++++++- hw/i386/kvm/xen_overlay.c | 2 +- hw/i386/kvm/xen_overlay.h | 2 ++ 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/hw/i386/kvm/xen_gnttab.c b/hw/i386/kvm/xen_gnttab.c index ef8857e50c7b..72e87aea6ad6 100644 --- a/hw/i386/kvm/xen_gnttab.c +++ b/hw/i386/kvm/xen_gnttab.c @@ -37,13 +37,26 @@ OBJECT_DECLARE_SIMPLE_TYPE(XenGnttabState, XEN_GNTTAB) #define XEN_PAGE_SHIFT 12 #define XEN_PAGE_SIZE (1ULL << XEN_PAGE_SHIFT) =20 +#define ENTRIES_PER_FRAME_V1 (XEN_PAGE_SIZE / sizeof(grant_entry_v1_t)) + struct XenGnttabState { /*< private >*/ SysBusDevice busdev; /*< public >*/ =20 + QemuMutex gnt_lock; + uint32_t nr_frames; uint32_t max_frames; + + union { + grant_entry_v1_t *v1; + /* Theoretically, v2 support could be added here. */ + } entries; + + MemoryRegion gnt_frames; + MemoryRegion *gnt_aliases; + uint64_t *gnt_frame_gpas; }; =20 struct XenGnttabState *xen_gnttab_singleton; @@ -51,6 +64,7 @@ struct XenGnttabState *xen_gnttab_singleton; static void xen_gnttab_realize(DeviceState *dev, Error **errp) { XenGnttabState *s =3D XEN_GNTTAB(dev); + int i; =20 if (xen_mode !=3D XEN_EMULATE) { error_setg(errp, "Xen grant table support is for Xen emulation"); @@ -58,6 +72,38 @@ static void xen_gnttab_realize(DeviceState *dev, Error *= *errp) } s->nr_frames =3D 0; s->max_frames =3D kvm_xen_get_gnttab_max_frames(); + memory_region_init_ram(&s->gnt_frames, OBJECT(dev), "xen:grant_table", + XEN_PAGE_SIZE * s->max_frames, &error_abort); + memory_region_set_enabled(&s->gnt_frames, true); + s->entries.v1 =3D memory_region_get_ram_ptr(&s->gnt_frames); + memset(s->entries.v1, 0, XEN_PAGE_SIZE * s->max_frames); + + /* Create individual page-sizes aliases for overlays */ + s->gnt_aliases =3D (void *)g_new0(MemoryRegion, s->max_frames); + s->gnt_frame_gpas =3D (void *)g_new(uint64_t, s->max_frames); + for (i =3D 0; i < s->max_frames; i++) { + memory_region_init_alias(&s->gnt_aliases[i], OBJECT(dev), + NULL, &s->gnt_frames, + i * XEN_PAGE_SIZE, XEN_PAGE_SIZE); + s->gnt_frame_gpas[i] =3D INVALID_GPA; + } + + qemu_mutex_init(&s->gnt_lock); + + xen_gnttab_singleton =3D s; +} + +static int xen_gnttab_post_load(void *opaque, int version_id) +{ + XenGnttabState *s =3D XEN_GNTTAB(opaque); + uint32_t i; + + for (i =3D 0; i < s->nr_frames; i++) { + if (s->gnt_frame_gpas[i] !=3D INVALID_GPA) { + xen_overlay_do_map_page(&s->gnt_aliases[i], s->gnt_frame_gpas[= i]); + } + } + return 0; } =20 static bool xen_gnttab_is_needed(void *opaque) @@ -70,8 +116,11 @@ static const VMStateDescription xen_gnttab_vmstate =3D { .version_id =3D 1, .minimum_version_id =3D 1, .needed =3D xen_gnttab_is_needed, + .post_load =3D xen_gnttab_post_load, .fields =3D (VMStateField[]) { VMSTATE_UINT32(nr_frames, XenGnttabState), + VMSTATE_VARRAY_UINT32(gnt_frame_gpas, XenGnttabState, nr_frames, 0, + vmstate_info_uint64, uint64_t), VMSTATE_END_OF_LIST() } }; @@ -106,6 +155,28 @@ type_init(xen_gnttab_register_types) =20 int xen_gnttab_map_page(uint64_t idx, uint64_t gfn) { - return -ENOSYS; + XenGnttabState *s =3D xen_gnttab_singleton; + uint64_t gpa =3D gfn << XEN_PAGE_SHIFT; + + if (!s) { + return -ENOTSUP; + } + + if (idx >=3D s->max_frames) { + return -EINVAL; + } + + QEMU_IOTHREAD_LOCK_GUARD(); + QEMU_LOCK_GUARD(&s->gnt_lock); + + xen_overlay_do_map_page(&s->gnt_aliases[idx], gpa); + + s->gnt_frame_gpas[idx] =3D gpa; + + if (s->nr_frames <=3D idx) { + s->nr_frames =3D idx + 1; + } + + return 0; } =20 diff --git a/hw/i386/kvm/xen_overlay.c b/hw/i386/kvm/xen_overlay.c index 8685d879594e..39fda1b72c3f 100644 --- a/hw/i386/kvm/xen_overlay.c +++ b/hw/i386/kvm/xen_overlay.c @@ -49,7 +49,7 @@ struct XenOverlayState { =20 struct XenOverlayState *xen_overlay_singleton; =20 -static void xen_overlay_do_map_page(MemoryRegion *page, uint64_t gpa) +void xen_overlay_do_map_page(MemoryRegion *page, uint64_t gpa) { /* * Xen allows guests to map the same page as many times as it likes diff --git a/hw/i386/kvm/xen_overlay.h b/hw/i386/kvm/xen_overlay.h index 5c46a0b03659..75ecb6b3598b 100644 --- a/hw/i386/kvm/xen_overlay.h +++ b/hw/i386/kvm/xen_overlay.h @@ -21,4 +21,6 @@ int xen_sync_long_mode(void); int xen_set_long_mode(bool long_mode); bool xen_is_long_mode(void); =20 +void xen_overlay_do_map_page(MemoryRegion *page, uint64_t gpa); + #endif /* QEMU_XEN_OVERLAY_H */ --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760961; cv=none; d=zohomail.com; s=zohoarc; b=nnOL2GxeztO243EoJc17Qlh8Tj6Gl1ReI0x2lCwhMcd9TtQJmK2atV7/kNBNEF4ojgwXmBhN9LVpACRwSKTbo9aGu+FxR/0nIFFSJ0Vj0oTix1oXCZnrbOSRVj7y4qJ1HK7Wph+XI8voYQ4mHZXLo+hGhvJ2G2cwfkUrbnQpXJo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760961; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=oxpdKGBOxbOxA7U1jOwwZnGH+vMWO4jjVwnofdbvh60=; b=Gd93dke9y7KVDjXhOn8qgXHwh1aCA5zesOBi4vnmAjO9iUjKhhmoxefgewKpgcpvXwyJNRQDI7UvvIZ/bG9XlsasbeQrRLTWeU0xiIw4E/XgucjABJD+QW0c+U7r6FZl6/EV6Llj2ASIqsjsrUAsmVETpFUb+XGnSfcldVzX37U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760961531471.06511817548505; Thu, 2 Mar 2023 04:42:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiAJ-0006T9-6N; Thu, 02 Mar 2023 07:36:07 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi78-0002tW-Dg for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:54 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi76-0003TW-2v for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:49 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-356-kxeANXTDNtWdP_iG6_RGnQ-1; Thu, 02 Mar 2023 07:32:46 -0500 Received: by mail-wm1-f70.google.com with SMTP id m31-20020a05600c3b1f00b003e9de8c95easo5698809wms.2 for ; Thu, 02 Mar 2023 04:32:46 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id iz16-20020a05600c555000b003e21638c0edsm2832974wmb.45.2023.03.02.04.32.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760367; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oxpdKGBOxbOxA7U1jOwwZnGH+vMWO4jjVwnofdbvh60=; b=ffnD8MX50ibxcdVHp2106jXOU6T1QSQdqYpmxYj0U7eWni9z41gyZ3mNMj26GXBHROumU8 QI248Tgr6NzDUxNyy44cG2xTN/3W4lUSayRAoVYEag9Hq1u9wM1LrQcMiHGjLc3p0Z2g/P e1EGWAF+MdfEDP2msdGyfjMO6FFhkRM= X-MC-Unique: kxeANXTDNtWdP_iG6_RGnQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oxpdKGBOxbOxA7U1jOwwZnGH+vMWO4jjVwnofdbvh60=; b=AJq5kaQphchhU7xzMFXtM5lt61kVD3P0SQI/4RFNU3xqYTcr8GKSoFoME8UGVcbKCl bzhdGa1MTYAgBbWNF8TKXV6LkJUuRU3HbvarwSxr5cKWYXpwYfwT8n7NCW+nH9iEljT1 9qnlixZR0c6TfGF/8sx8FG+9Wv8iSd1ieCvSHgOJo77XzEKZXtjNQTGbe2pi+KXTfEj4 uDHFTvwMntI2UD1pDTgARtwCRMeSKJ5m9bnBpIr6t/HY6c8AUDyvAE5nwi9re68Y8DGj H/AeKf2aIO+TltG8UiUIn0XgsV44u/nZQCAa/PV79mgx6KeHiwfs3iAQCRVsaqGPguRJ ZvoQ== X-Gm-Message-State: AO0yUKWHvmiwVlI9gQGy9j0dWHZw3IMhpxurvCxtpxpjVD4Yv2Hu9Pkk Qhz6+B+fsvQaU57gwkTaSNgiXx2aCLszNGKVfbYvY3oEB5z9h9AaUcVuLEz3T6nmbSIzVgAjXY9 5gKTcWnnzTFPeid/qrfuz5cXlh2vxMS1WVf+CmVZtScatb/nNNoEIA8V6MIG3Y3N1veRYm4ewT7 A= X-Received: by 2002:a05:600c:3506:b0:3ea:d620:579b with SMTP id h6-20020a05600c350600b003ead620579bmr7464510wmq.0.1677760364830; Thu, 02 Mar 2023 04:32:44 -0800 (PST) X-Google-Smtp-Source: AK7set//t5YOAKsKw1YRRTeTMGzZ2Z/EdM0Y6c50AlZudFizUo3Trl0ovwr/plZRW8v8knqS83veRA== X-Received: by 2002:a05:600c:3506:b0:3ea:d620:579b with SMTP id h6-20020a05600c350600b003ead620579bmr7464487wmq.0.1677760364461; Thu, 02 Mar 2023 04:32:44 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 45/62] i386/xen: Implement HYPERVISOR_grant_table_op and GNTTABOP_[gs]et_verson Date: Thu, 2 Mar 2023 13:30:12 +0100 Message-Id: <20230302123029.153265-46-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760961976100005 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_gnttab.c | 31 ++++++++++++++++++++ hw/i386/kvm/xen_gnttab.h | 5 ++++ target/i386/kvm/xen-emu.c | 60 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) diff --git a/hw/i386/kvm/xen_gnttab.c b/hw/i386/kvm/xen_gnttab.c index 72e87aea6ad6..b54a94e2bd54 100644 --- a/hw/i386/kvm/xen_gnttab.c +++ b/hw/i386/kvm/xen_gnttab.c @@ -180,3 +180,34 @@ int xen_gnttab_map_page(uint64_t idx, uint64_t gfn) return 0; } =20 +int xen_gnttab_set_version_op(struct gnttab_set_version *set) +{ + int ret; + + switch (set->version) { + case 1: + ret =3D 0; + break; + + case 2: + /* Behave as before set_version was introduced. */ + ret =3D -ENOSYS; + break; + + default: + ret =3D -EINVAL; + } + + set->version =3D 1; + return ret; +} + +int xen_gnttab_get_version_op(struct gnttab_get_version *get) +{ + if (get->dom !=3D DOMID_SELF && get->dom !=3D xen_domid) { + return -ESRCH; + } + + get->version =3D 1; + return 0; +} diff --git a/hw/i386/kvm/xen_gnttab.h b/hw/i386/kvm/xen_gnttab.h index a7caa94c838c..79579677ba96 100644 --- a/hw/i386/kvm/xen_gnttab.h +++ b/hw/i386/kvm/xen_gnttab.h @@ -15,4 +15,9 @@ void xen_gnttab_create(void); int xen_gnttab_map_page(uint64_t idx, uint64_t gfn); =20 +struct gnttab_set_version; +struct gnttab_get_version; +int xen_gnttab_set_version_op(struct gnttab_set_version *set); +int xen_gnttab_get_version_op(struct gnttab_get_version *get); + #endif /* QEMU_XEN_GNTTAB_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 6f9b7a5cb96e..d49b6117f1d2 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -34,6 +34,7 @@ #include "hw/xen/interface/hvm/params.h" #include "hw/xen/interface/vcpu.h" #include "hw/xen/interface/event_channel.h" +#include "hw/xen/interface/grant_table.h" =20 #include "xen-compat.h" =20 @@ -1169,6 +1170,61 @@ static bool kvm_xen_hcall_sched_op(struct kvm_xen_ex= it *exit, X86CPU *cpu, return true; } =20 +static bool kvm_xen_hcall_gnttab_op(struct kvm_xen_exit *exit, X86CPU *cpu, + int cmd, uint64_t arg, int count) +{ + CPUState *cs =3D CPU(cpu); + int err; + + switch (cmd) { + case GNTTABOP_set_version: { + struct gnttab_set_version set; + + qemu_build_assert(sizeof(set) =3D=3D 4); + if (kvm_copy_from_gva(cs, arg, &set, sizeof(set))) { + err =3D -EFAULT; + break; + } + + err =3D xen_gnttab_set_version_op(&set); + if (!err && kvm_copy_to_gva(cs, arg, &set, sizeof(set))) { + err =3D -EFAULT; + } + break; + } + case GNTTABOP_get_version: { + struct gnttab_get_version get; + + qemu_build_assert(sizeof(get) =3D=3D 8); + if (kvm_copy_from_gva(cs, arg, &get, sizeof(get))) { + err =3D -EFAULT; + break; + } + + err =3D xen_gnttab_get_version_op(&get); + if (!err && kvm_copy_to_gva(cs, arg, &get, sizeof(get))) { + err =3D -EFAULT; + } + break; + } + case GNTTABOP_query_size: + case GNTTABOP_setup_table: + case GNTTABOP_copy: + case GNTTABOP_map_grant_ref: + case GNTTABOP_unmap_grant_ref: + case GNTTABOP_swap_grant_ref: + return false; + + default: + /* Xen explicitly returns -ENOSYS to HVM guests for all others */ + err =3D -ENOSYS; + break; + } + + exit->u.hcall.result =3D err; + return true; +} + static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit) { uint16_t code =3D exit->u.hcall.input; @@ -1179,6 +1235,10 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, stru= ct kvm_xen_exit *exit) } =20 switch (code) { + case __HYPERVISOR_grant_table_op: + return kvm_xen_hcall_gnttab_op(exit, cpu, exit->u.hcall.params[0], + exit->u.hcall.params[1], + exit->u.hcall.params[2]); case __HYPERVISOR_sched_op: return kvm_xen_hcall_sched_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760659; cv=none; d=zohomail.com; s=zohoarc; b=To8i6KfvIFJolOxoaedrHszBQTp6ruS9IISICwH0ObFNHFKqujiIeP7n1/X9hb5BY34IstEnspKGNVQrIQvt1x3473jFvoAgl9BtHDQ/cgjdtfdLnApvnaPByQeLdo35Lb8YPlJ/UaxQl1aa+HtbFu6BJ2uGdSCwg0tC8HqeeKc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760659; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=OrSLbO7tKD+zw7vGTWwSeKxeINeDggwd37wt5H4Kdrg=; b=Zds5WWo4geQDy0PXo8mjPL0zYNFDg7zq44ixe9MtB5erFOqE3DpwJyi06PS/wShwMxzheoXMKyjdPXaqrqt0ufVVdEc8duIfWfviF1fdvjzM7G0mBf+sCpZx8qaBl0Oq8Ei9soFhwVQnWLJmsZ66BQuDvncb2Bc5WOaqAwFRDqw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760659010200.80708011527202; Thu, 2 Mar 2023 04:37:39 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8v-0004Hj-TV; Thu, 02 Mar 2023 07:34:46 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7D-0002uJ-Fa for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:57 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi79-0003ax-9k for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:52 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-314-R9dPZM5VNh6639hx4vob0g-1; Thu, 02 Mar 2023 07:32:49 -0500 Received: by mail-wm1-f72.google.com with SMTP id k36-20020a05600c1ca400b003eac86e4387so1190577wms.8 for ; Thu, 02 Mar 2023 04:32:49 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id r15-20020a05600c2f0f00b003eae73f0fc1sm2934103wmn.18.2023.03.02.04.32.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760370; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OrSLbO7tKD+zw7vGTWwSeKxeINeDggwd37wt5H4Kdrg=; b=TjCi7Z5BrMKDLMAr+8Gan65nC2JNgvcL6QL0vODRIA6e9yXxP6reCeHT6HSiCPIFKRbfdT ekCfJA4E8GHZ831LAaBCFfqSBP5qVguFzL/9RVJPMXqauxwpvIvX9+5aVf0dCZ974eJP9s 4Ilpaw9HKBepNrT0ca9Z+dDIyYrIbLo= X-MC-Unique: R9dPZM5VNh6639hx4vob0g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OrSLbO7tKD+zw7vGTWwSeKxeINeDggwd37wt5H4Kdrg=; b=yEt+02hnVBwvsNOSmx+bP8M2a5lMSfDv8wZwpHTftIUNOuzPdJcCDRAzcTJ6VOliAJ aaEzPPJFDo9AzhRUV3XT3M8jAj8HXXnH7g7HvXYTn/8NyIQH2M2YfKX6WE46iFJzHLrr wMHSOlmoU29g7VR0svg46U9kX0SWTOpT0evzP9kqbTNKQQeiPslmXCor2OhSewW/p9ie 4Q7TN0mkf1YnELxrEDZY/RcNzROTztwIFu3trE5Ad/nWqIGrklvLB/CsOaa5SYatd4Ea YbhfRdC/TvjZ+SnGgs1ztyh9t2vqTKs0etXGkgI5dH7wCgZ6rAy5YBM3hvFTHverFNjw ibRQ== X-Gm-Message-State: AO0yUKWrv9FsO6DZi04bmd43A5LIS7+oDD9UMFkfc9coQQ7KCcR+T0RT SvOU7nXCBdGjJrU8WT06ZQh9PO5ptmNKaa/jzxIIVnlY7jZdDw/r4llisNZZeKP/I4qxOBws/0c 7/rifAo3Xl867dE3bqC5f+r35evJYNst7EI9ztAz3Hb0VVjxn2IYve7IQ4CX3lTSRrD4LWM6CJ8 o= X-Received: by 2002:a05:600c:3088:b0:3eb:3c76:c241 with SMTP id g8-20020a05600c308800b003eb3c76c241mr7679430wmn.13.1677760367763; Thu, 02 Mar 2023 04:32:47 -0800 (PST) X-Google-Smtp-Source: AK7set8cpwXqaMKad2LN0GSH6d6gqf+Kz9aDjF5cpD2+KEuvataC04pGdc42kOv7NOTBs6GoVobiMA== X-Received: by 2002:a05:600c:3088:b0:3eb:3c76:c241 with SMTP id g8-20020a05600c308800b003eb3c76c241mr7679412wmn.13.1677760367492; Thu, 02 Mar 2023 04:32:47 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 46/62] hw/xen: Implement GNTTABOP_query_size Date: Thu, 2 Mar 2023 13:30:13 +0100 Message-Id: <20230302123029.153265-47-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760659519100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_gnttab.c | 19 +++++++++++++++++++ hw/i386/kvm/xen_gnttab.h | 2 ++ target/i386/kvm/xen-emu.c | 16 +++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/hw/i386/kvm/xen_gnttab.c b/hw/i386/kvm/xen_gnttab.c index b54a94e2bd54..1e691ded326f 100644 --- a/hw/i386/kvm/xen_gnttab.c +++ b/hw/i386/kvm/xen_gnttab.c @@ -211,3 +211,22 @@ int xen_gnttab_get_version_op(struct gnttab_get_versio= n *get) get->version =3D 1; return 0; } + +int xen_gnttab_query_size_op(struct gnttab_query_size *size) +{ + XenGnttabState *s =3D xen_gnttab_singleton; + + if (!s) { + return -ENOTSUP; + } + + if (size->dom !=3D DOMID_SELF && size->dom !=3D xen_domid) { + size->status =3D GNTST_bad_domain; + return 0; + } + + size->status =3D GNTST_okay; + size->nr_frames =3D s->nr_frames; + size->max_nr_frames =3D s->max_frames; + return 0; +} diff --git a/hw/i386/kvm/xen_gnttab.h b/hw/i386/kvm/xen_gnttab.h index 79579677ba96..3bdbe9619147 100644 --- a/hw/i386/kvm/xen_gnttab.h +++ b/hw/i386/kvm/xen_gnttab.h @@ -17,7 +17,9 @@ int xen_gnttab_map_page(uint64_t idx, uint64_t gfn); =20 struct gnttab_set_version; struct gnttab_get_version; +struct gnttab_query_size; int xen_gnttab_set_version_op(struct gnttab_set_version *set); int xen_gnttab_get_version_op(struct gnttab_get_version *get); +int xen_gnttab_query_size_op(struct gnttab_query_size *size); =20 #endif /* QEMU_XEN_GNTTAB_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index d49b6117f1d2..3b46cab1dae0 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -1207,7 +1207,21 @@ static bool kvm_xen_hcall_gnttab_op(struct kvm_xen_e= xit *exit, X86CPU *cpu, } break; } - case GNTTABOP_query_size: + case GNTTABOP_query_size: { + struct gnttab_query_size size; + + qemu_build_assert(sizeof(size) =3D=3D 16); + if (kvm_copy_from_gva(cs, arg, &size, sizeof(size))) { + err =3D -EFAULT; + break; + } + + err =3D xen_gnttab_query_size_op(&size); + if (!err && kvm_copy_to_gva(cs, arg, &size, sizeof(size))) { + err =3D -EFAULT; + } + break; + } case GNTTABOP_setup_table: case GNTTABOP_copy: case GNTTABOP_map_grant_ref: --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761776; cv=none; d=zohomail.com; s=zohoarc; b=e25GTCktKwqIl5/kJtJMqVI1lr/Dc7NvdCe6DytV74bDtFk5e3PLYGMXBVS5uw92wI34e5QCGziKoK7DLxjCr1Z/CBMkKnV4rcSvCli9iW6hx9qad0mP1EU8J2OH5GV/YWBPcK2XHCCca8M4RnFmYk/LNwy+mZ0EIUTVGWEvPxQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761776; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=s1Kwb/OQQGKmkQyhJ4EJcuGR+ecu59Z8zUinJBSa8Ng=; b=jjcM0NCKaBc2R5zO+v3AQepISAT/hmtEdv+gooy1pApcUurxfT8z5WzAyA+K37cMgc/hTMs3QmWVBGzE8Ifl3MlHQ7rGhLUhu4894oKvDM/co6ZetZDog7N2CKr0wpopAVDSyOKjmYrvfIjs1jGUwg1qdxU7DxtPJpBMPZ1X8rI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761776645686.8742275977054; Thu, 2 Mar 2023 04:56:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiAE-0006Do-6F; Thu, 02 Mar 2023 07:36:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7H-0002ua-Pb for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:12 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7C-0003eG-CM for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:58 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-621-d7WIpaFiMnSAXFPnOTKcww-1; Thu, 02 Mar 2023 07:32:52 -0500 Received: by mail-wm1-f69.google.com with SMTP id z6-20020a7bc7c6000000b003e0107732f4so5700684wmk.1 for ; Thu, 02 Mar 2023 04:32:52 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id n5-20020a5d51c5000000b002c70d97af78sm15427242wrv.85.2023.03.02.04.32.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760373; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=s1Kwb/OQQGKmkQyhJ4EJcuGR+ecu59Z8zUinJBSa8Ng=; b=WQjx8VC/Kr7w6F2zzBNbRNFGm2TNIWhYRiSZBFAhbZ+HE7gJUyyyRlWLjO7UQthY11I/7/ gbJ93Janj20FAded8zAB3b3Lm6iA5M4EFnynOkLQdM+D5ysniofiLoTEmQC/IDxCH2BI0c BAw4jf/TWHKXpLWw6XFsyVWJS7kwkTI= X-MC-Unique: d7WIpaFiMnSAXFPnOTKcww-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=s1Kwb/OQQGKmkQyhJ4EJcuGR+ecu59Z8zUinJBSa8Ng=; b=t2sG3WrYt4ROo402Y+b27Xxlap/j4WrkxNXT+LRHM7X6d8w4cExAdMRuV4CAfTLjqn QAMhtOu3WePM3tR8Dbbo87PfHHX6EjafzOsUAKi80yPdj/c1CFvNm4f4pfTZO3aT1dOR IZ2A7dV3aX8olPDfSHryiJbxrrm4oOArlUgqqiVhzfSa9WyHNgGl6nJitv9QQU0wxC4H wE1sRCYHCxB2A0Yt4cDX6JgT6PqZiF0gX+Ak0E1831LUingiDOAcuVwWjcJIrXpju3K6 sHiUUgPw9lo+k/mmneOKJJNDPAe5aKADGd5jSlt04r/ob6XwyYFvM4CpLlgguvRGALXj a0vA== X-Gm-Message-State: AO0yUKXhsUjKouelXjWfcY12TqYK1kYzcM1wS8m9DSp4404/UJgCDbuI 5yzyOJQuWz2b7lU5gSDHjaF4/nHDHcMXXwpJHFqNS8WPAl1czzRh+72xCkrcjq1kQqmNb2KPt50 eqQ07IOcAmWlLQnBMORhRSU7zD7ZEuk447y4JAUAgDmYEDyCPhaOaL6mZlRYPs6Cxu3GR3+yqSn M= X-Received: by 2002:adf:f404:0:b0:2c5:5687:5ed5 with SMTP id g4-20020adff404000000b002c556875ed5mr6980473wro.18.1677760370705; Thu, 02 Mar 2023 04:32:50 -0800 (PST) X-Google-Smtp-Source: AK7set/lpT4XOw1XakJXHblowf8FeXZWuSjSO/OrTW5vldUMFCSyl/ZjVUTbfi9PWh/ctVt6UjcLpg== X-Received: by 2002:adf:f404:0:b0:2c5:5687:5ed5 with SMTP id g4-20020adff404000000b002c556875ed5mr6980458wro.18.1677760370405; Thu, 02 Mar 2023 04:32:50 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 47/62] i386/xen: handle PV timer hypercalls Date: Thu, 2 Mar 2023 13:30:14 +0100 Message-Id: <20230302123029.153265-48-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761778181100003 Content-Type: text/plain; charset="utf-8" From: Joao Martins Introduce support for one shot and periodic mode of Xen PV timers, whereby timer interrupts come through a special virq event channel with deadlines being set through: 1) set_timer_op hypercall (only oneshot) 2) vcpu_op hypercall for {set,stop}_{singleshot,periodic}_timer hypercalls Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 31 +++++ hw/i386/kvm/xen_evtchn.h | 2 + target/i386/cpu.h | 5 + target/i386/kvm/xen-emu.c | 271 +++++++++++++++++++++++++++++++++++++- target/i386/machine.c | 1 + 5 files changed, 308 insertions(+), 2 deletions(-) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index f39b751ff999..71ed48018942 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -1222,6 +1222,37 @@ int xen_evtchn_send_op(struct evtchn_send *send) return ret; } =20 +int xen_evtchn_set_port(uint16_t port) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + XenEvtchnPort *p; + int ret =3D -EINVAL; + + if (!s) { + return -ENOTSUP; + } + + if (!valid_port(port)) { + return -EINVAL; + } + + qemu_mutex_lock(&s->port_lock); + + p =3D &s->port_table[port]; + + /* QEMU has no business sending to anything but these */ + if (p->type =3D=3D EVTCHNSTAT_virq || + (p->type =3D=3D EVTCHNSTAT_interdomain && + (p->type_val & PORT_INFO_TYPEVAL_REMOTE_QEMU))) { + set_port_pending(s, port); + ret =3D 0; + } + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} + EvtchnInfoList *qmp_xen_event_list(Error **errp) { XenEvtchnState *s =3D xen_evtchn_singleton; diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index b03c3108bcba..24611478b87a 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -20,6 +20,8 @@ int xen_evtchn_set_callback_param(uint64_t param); void xen_evtchn_connect_gsis(qemu_irq *system_gsis); void xen_evtchn_set_callback_level(int level); =20 +int xen_evtchn_set_port(uint16_t port); + struct evtchn_status; struct evtchn_close; struct evtchn_unmask; diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 7227a8ec08d8..d243e290d385 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -26,6 +26,7 @@ #include "exec/cpu-defs.h" #include "qapi/qapi-types-common.h" #include "qemu/cpu-float.h" +#include "qemu/timer.h" =20 #define XEN_NR_VIRQS 24 =20 @@ -1811,6 +1812,10 @@ typedef struct CPUArchState { bool xen_callback_asserted; uint16_t xen_virq[XEN_NR_VIRQS]; uint64_t xen_singleshot_timer_ns; + QEMUTimer *xen_singleshot_timer; + uint64_t xen_periodic_timer_period; + QEMUTimer *xen_periodic_timer; + QemuMutex xen_timers_lock; #endif #if defined(CONFIG_HVF) HVFX86LazyFlags hvf_lflags; diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 3b46cab1dae0..c210ff9d91be 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -38,6 +38,9 @@ =20 #include "xen-compat.h" =20 +static void xen_vcpu_singleshot_timer_event(void *opaque); +static void xen_vcpu_periodic_timer_event(void *opaque); + #ifdef TARGET_X86_64 #define hypercall_compat32(longmode) (!(longmode)) #else @@ -201,6 +204,23 @@ int kvm_xen_init_vcpu(CPUState *cs) env->xen_vcpu_time_info_gpa =3D INVALID_GPA; env->xen_vcpu_runstate_gpa =3D INVALID_GPA; =20 + qemu_mutex_init(&env->xen_timers_lock); + env->xen_singleshot_timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, + xen_vcpu_singleshot_timer_eve= nt, + cpu); + if (!env->xen_singleshot_timer) { + return -ENOMEM; + } + env->xen_singleshot_timer->opaque =3D cs; + + env->xen_periodic_timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, + xen_vcpu_periodic_timer_event, + cpu); + if (!env->xen_periodic_timer) { + return -ENOMEM; + } + env->xen_periodic_timer->opaque =3D cs; + return 0; } =20 @@ -232,7 +252,8 @@ static bool kvm_xen_hcall_xen_version(struct kvm_xen_ex= it *exit, X86CPU *cpu, 1 << XENFEAT_writable_descriptor_tables | 1 << XENFEAT_auto_translated_physmap | 1 << XENFEAT_supervisor_mode_kernel | - 1 << XENFEAT_hvm_callback_vector; + 1 << XENFEAT_hvm_callback_vector | + 1 << XENFEAT_hvm_safe_pvclock; } =20 err =3D kvm_copy_to_gva(CPU(cpu), arg, &fi, sizeof(fi)); @@ -878,13 +899,208 @@ static int vcpuop_register_runstate_info(CPUState *c= s, CPUState *target, return 0; } =20 +static uint64_t kvm_get_current_ns(void) +{ + struct kvm_clock_data data; + int ret; + + ret =3D kvm_vm_ioctl(kvm_state, KVM_GET_CLOCK, &data); + if (ret < 0) { + fprintf(stderr, "KVM_GET_CLOCK failed: %s\n", strerror(ret)); + abort(); + } + + return data.clock; +} + +static void xen_vcpu_singleshot_timer_event(void *opaque) +{ + CPUState *cpu =3D opaque; + CPUX86State *env =3D &X86_CPU(cpu)->env; + uint16_t port =3D env->xen_virq[VIRQ_TIMER]; + + if (likely(port)) { + xen_evtchn_set_port(port); + } + + qemu_mutex_lock(&env->xen_timers_lock); + env->xen_singleshot_timer_ns =3D 0; + qemu_mutex_unlock(&env->xen_timers_lock); +} + +static void xen_vcpu_periodic_timer_event(void *opaque) +{ + CPUState *cpu =3D opaque; + CPUX86State *env =3D &X86_CPU(cpu)->env; + uint16_t port =3D env->xen_virq[VIRQ_TIMER]; + int64_t qemu_now; + + if (likely(port)) { + xen_evtchn_set_port(port); + } + + qemu_mutex_lock(&env->xen_timers_lock); + + qemu_now =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + timer_mod_ns(env->xen_periodic_timer, + qemu_now + env->xen_periodic_timer_period); + + qemu_mutex_unlock(&env->xen_timers_lock); +} + +static int do_set_periodic_timer(CPUState *target, uint64_t period_ns) +{ + CPUX86State *tenv =3D &X86_CPU(target)->env; + int64_t qemu_now; + + timer_del(tenv->xen_periodic_timer); + + qemu_mutex_lock(&tenv->xen_timers_lock); + + qemu_now =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + timer_mod_ns(tenv->xen_periodic_timer, qemu_now + period_ns); + tenv->xen_periodic_timer_period =3D period_ns; + + qemu_mutex_unlock(&tenv->xen_timers_lock); + return 0; +} + +#define MILLISECS(_ms) ((int64_t)((_ms) * 1000000ULL)) +#define MICROSECS(_us) ((int64_t)((_us) * 1000ULL)) +#define STIME_MAX ((time_t)((int64_t)~0ull >> 1)) +/* Chosen so (NOW() + delta) wont overflow without an uptime of 200 years = */ +#define STIME_DELTA_MAX ((int64_t)((uint64_t)~0ull >> 2)) + +static int vcpuop_set_periodic_timer(CPUState *cs, CPUState *target, + uint64_t arg) +{ + struct vcpu_set_periodic_timer spt; + + qemu_build_assert(sizeof(spt) =3D=3D 8); + if (kvm_copy_from_gva(cs, arg, &spt, sizeof(spt))) { + return -EFAULT; + } + + if (spt.period_ns < MILLISECS(1) || spt.period_ns > STIME_DELTA_MAX) { + return -EINVAL; + } + + return do_set_periodic_timer(target, spt.period_ns); +} + +static int vcpuop_stop_periodic_timer(CPUState *target) +{ + CPUX86State *tenv =3D &X86_CPU(target)->env; + + qemu_mutex_lock(&tenv->xen_timers_lock); + + timer_del(tenv->xen_periodic_timer); + tenv->xen_periodic_timer_period =3D 0; + + qemu_mutex_unlock(&tenv->xen_timers_lock); + return 0; +} + +static int do_set_singleshot_timer(CPUState *cs, uint64_t timeout_abs, + bool future, bool linux_wa) +{ + CPUX86State *env =3D &X86_CPU(cs)->env; + int64_t now =3D kvm_get_current_ns(); + int64_t qemu_now =3D qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + int64_t delta =3D timeout_abs - now; + + if (future && timeout_abs < now) { + return -ETIME; + } + + if (linux_wa && unlikely((int64_t)timeout_abs < 0 || + (delta > 0 && (uint32_t)(delta >> 50) !=3D 0)= )) { + /* + * Xen has a 'Linux workaround' in do_set_timer_op() which checks + * for negative absolute timeout values (caused by integer + * overflow), and for values about 13 days in the future (2^50ns) + * which would be caused by jiffies overflow. For those cases, it + * sets the timeout 100ms in the future (not *too* soon, since if + * a guest really did set a long timeout on purpose we don't want + * to keep churning CPU time by waking it up). + */ + delta =3D (100 * SCALE_MS); + timeout_abs =3D now + delta; + } + + qemu_mutex_lock(&env->xen_timers_lock); + + timer_mod_ns(env->xen_singleshot_timer, qemu_now + delta); + env->xen_singleshot_timer_ns =3D now + delta; + + qemu_mutex_unlock(&env->xen_timers_lock); + return 0; +} + +static int vcpuop_set_singleshot_timer(CPUState *cs, uint64_t arg) +{ + struct vcpu_set_singleshot_timer sst =3D { 0 }; + + /* + * The struct is a uint64_t followed by a uint32_t. On 32-bit that + * makes it 12 bytes. On 64-bit it gets padded to 16. The parts + * that get used are identical, and there's four bytes of padding + * unused at the end. For true Xen compatibility we should attempt + * to copy the full 16 bytes from 64-bit guests, and return -EFAULT + * if we can't get the padding too. But that's daft. Just copy what + * we need. + */ + qemu_build_assert(offsetof(struct vcpu_set_singleshot_timer, flags) = =3D=3D 8); + qemu_build_assert(sizeof(sst) >=3D 12); + + if (kvm_copy_from_gva(cs, arg, &sst, 12)) { + return -EFAULT; + } + + return do_set_singleshot_timer(cs, sst.timeout_abs_ns, + !!(sst.flags & VCPU_SSHOTTMR_future), + false); +} + +static int vcpuop_stop_singleshot_timer(CPUState *cs) +{ + CPUX86State *env =3D &X86_CPU(cs)->env; + + qemu_mutex_lock(&env->xen_timers_lock); + + timer_del(env->xen_singleshot_timer); + env->xen_singleshot_timer_ns =3D 0; + + qemu_mutex_unlock(&env->xen_timers_lock); + return 0; +} + +static bool kvm_xen_hcall_set_timer_op(struct kvm_xen_exit *exit, X86CPU *= cpu, + uint64_t timeout) +{ + int err; + + if (unlikely(timeout =3D=3D 0)) { + err =3D vcpuop_stop_singleshot_timer(CPU(cpu)); + } else { + err =3D do_set_singleshot_timer(CPU(cpu), timeout, false, true); + } + exit->u.hcall.result =3D err; + return true; +} + static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exit *exit, X86CPU *cpu, int cmd, int vcpu_id, uint64_t arg) { - CPUState *dest =3D qemu_get_cpu(vcpu_id); CPUState *cs =3D CPU(cpu); + CPUState *dest =3D cs->cpu_index =3D=3D vcpu_id ? cs : qemu_get_cpu(vc= pu_id); int err; =20 + if (!dest) { + err =3D -ENOENT; + goto out; + } + switch (cmd) { case VCPUOP_register_runstate_memory_area: err =3D vcpuop_register_runstate_info(cs, dest, arg); @@ -895,11 +1111,34 @@ static bool kvm_xen_hcall_vcpu_op(struct kvm_xen_exi= t *exit, X86CPU *cpu, case VCPUOP_register_vcpu_info: err =3D vcpuop_register_vcpu_info(cs, dest, arg); break; + case VCPUOP_set_singleshot_timer: { + if (cs->cpu_index =3D=3D vcpu_id) { + err =3D vcpuop_set_singleshot_timer(dest, arg); + } else { + err =3D -EINVAL; + } + break; + } + case VCPUOP_stop_singleshot_timer: + if (cs->cpu_index =3D=3D vcpu_id) { + err =3D vcpuop_stop_singleshot_timer(dest); + } else { + err =3D -EINVAL; + } + break; + case VCPUOP_set_periodic_timer: { + err =3D vcpuop_set_periodic_timer(cs, dest, arg); + break; + } + case VCPUOP_stop_periodic_timer: + err =3D vcpuop_stop_periodic_timer(dest); + break; =20 default: return false; } =20 + out: exit->u.hcall.result =3D err; return true; } @@ -1249,6 +1488,16 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, stru= ct kvm_xen_exit *exit) } =20 switch (code) { + case __HYPERVISOR_set_timer_op: + if (exit->u.hcall.longmode) { + return kvm_xen_hcall_set_timer_op(exit, cpu, + exit->u.hcall.params[0]); + } else { + /* In 32-bit mode, the 64-bit timer value is in two args. */ + uint64_t val =3D ((uint64_t)exit->u.hcall.params[1]) << 32 | + (uint32_t)exit->u.hcall.params[0]; + return kvm_xen_hcall_set_timer_op(exit, cpu, val); + } case __HYPERVISOR_grant_table_op: return kvm_xen_hcall_gnttab_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1], @@ -1358,7 +1607,25 @@ int kvm_put_xen_state(CPUState *cs) } } =20 + if (env->xen_periodic_timer_period) { + ret =3D do_set_periodic_timer(cs, env->xen_periodic_timer_period); + if (ret < 0) { + return ret; + } + } + if (!kvm_xen_has_cap(EVTCHN_SEND)) { + /* + * If the kernel has EVTCHN_SEND support then it handles timers to= o, + * so the timer will be restored by kvm_xen_set_vcpu_timer() below. + */ + if (env->xen_singleshot_timer_ns) { + ret =3D do_set_singleshot_timer(cs, env->xen_singleshot_timer_= ns, + false, false); + if (ret < 0) { + return ret; + } + } return 0; } =20 diff --git a/target/i386/machine.c b/target/i386/machine.c index 603a1077e34a..c7ac8084b22c 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -1277,6 +1277,7 @@ static const VMStateDescription vmstate_xen_vcpu =3D { VMSTATE_UINT8(env.xen_vcpu_callback_vector, X86CPU), VMSTATE_UINT16_ARRAY(env.xen_virq, X86CPU, XEN_NR_VIRQS), VMSTATE_UINT64(env.xen_singleshot_timer_ns, X86CPU), + VMSTATE_UINT64(env.xen_periodic_timer_period, X86CPU), VMSTATE_END_OF_LIST() } }; --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761589; cv=none; d=zohomail.com; s=zohoarc; b=EQJM26ynZq6/8PBwkas8DZF5JAephbhEUG+nlcyg4v0+ljXTRUdeZG0+mjSpFxP+TCkJRpx8aV5KuyvHNvKXKQztrX1W8xf7zuuHHDWsrq9Xbjm0UMm2khud4ycjZqiWKIZV+cGOh8ULwkF2RBu14aGe7u6ZKLlicfTCcUwgGKc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761589; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=hH244Qu41oKuKyDsP+EiNLMkm/2HECHqfgZ/Z+vDc1w=; b=Wnol7iUxCpWizWe3tt6uG3jLn85LIyy3Ad2+cPO8DP4naC57tcYxhSMATpXg0CT5RJQD3FKXDJm8zrhPVcJLcVJ0Ot67za2kAUNIKAXyMBwE1eWu4qK1CiSNFYOyqw96GMmt5V20zWlBhx3s/vlaL/zUk8bKYGL/jDVWI7NpS/g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761589311411.98826334816124; Thu, 2 Mar 2023 04:53:09 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi9G-0004m3-LK; Thu, 02 Mar 2023 07:35:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7I-0002uk-63 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:22 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7F-0003ma-On for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:32:59 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-623-yTUr9x09NFG0u9BURkCu2A-1; Thu, 02 Mar 2023 07:32:55 -0500 Received: by mail-wm1-f69.google.com with SMTP id bi21-20020a05600c3d9500b003e836e354e0so1015697wmb.5 for ; Thu, 02 Mar 2023 04:32:54 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id q5-20020adff505000000b002c70a0e2cd0sm15413957wro.101.2023.03.02.04.32.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760376; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hH244Qu41oKuKyDsP+EiNLMkm/2HECHqfgZ/Z+vDc1w=; b=iTnMo2kOOwXKR8ipFmrx3nmVzNNLLeV8c06ulORZoGPAd7jy4qLlaZlC3dcrxPli20QB/4 z5ViKQrybmYWCidpayjY6w5rvL2DOE7cC6hGVKRn9O0NasXpBaJy7JUx4cXM/Po8MZwoI9 1AlVRBnlyBYZE46Lyt6qd7Rob9hdU+Q= X-MC-Unique: yTUr9x09NFG0u9BURkCu2A-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hH244Qu41oKuKyDsP+EiNLMkm/2HECHqfgZ/Z+vDc1w=; b=rzptlCQMiueG6eLHU5g8KynPkRextXMdLtp7LewsSwF0g2XQf23njoY0venqOC6k5y xOhX7NUoYecVl7XVohk3VFT01AsamqA6RDOG87OMuobKN8FQdgrAFXuctfwa31QLcz9g Vub+4wZajm4oSwZc/Cq77cIVWods1ophefS3DmQeTktKt/4WVheffoa6EpcBMVFGrfRi mtHdFJhHKS/pb4HMT3tmnruLEyX1oS0xgNli+xjQ8LMlbFIemRsoZZ5n8+bWG7pk9ecI e83+C8Ce1Gm2gxMGMEPIlrLEGN6UuuhObGq6u0tsNhlCnka9bCtwwpaypxq7fQCpljxD rXBg== X-Gm-Message-State: AO0yUKVn781c1l2l8RtceTtETrq5UVnuQG0D4GUbaccie/TMCdIHfvDi n51Ii3j3f/82uBM/5wV5PdU6Vd+UDatwviewymTWdy+vciTnHAhlIhd6vCNweB7+jWERAPy5dux 7TReQtslcerQMZlkU1qI4mI7bVlhEa2TgKpRWpxAGbO2puYn53vbkyyl4WJZ9iBd1IUc/1+B08m 0= X-Received: by 2002:a5d:6604:0:b0:2c8:60de:c849 with SMTP id n4-20020a5d6604000000b002c860dec849mr7907524wru.22.1677760373577; Thu, 02 Mar 2023 04:32:53 -0800 (PST) X-Google-Smtp-Source: AK7set+LWfoHRdjP9UfZuaAS7uS1R4DSooWu0nmGGmrOcDkvYJk+RPDE70JggOQtKv0ygwi5ciphbA== X-Received: by 2002:a5d:6604:0:b0:2c8:60de:c849 with SMTP id n4-20020a5d6604000000b002c860dec849mr7907506wru.22.1677760373258; Thu, 02 Mar 2023 04:32:53 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 48/62] i386/xen: Reserve Xen special pages for console, xenstore rings Date: Thu, 2 Mar 2023 13:30:15 +0100 Message-Id: <20230302123029.153265-49-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761590916100007 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Xen has eight frames at 0xfeff8000 for this; we only really need two for now and KVM puts the identity map at 0xfeffc000, so limit ourselves to four. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- include/sysemu/kvm_xen.h | 9 +++++++++ target/i386/kvm/xen-emu.c | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h index 49afa0eb9e43..b2aafaf7abdd 100644 --- a/include/sysemu/kvm_xen.h +++ b/include/sysemu/kvm_xen.h @@ -30,4 +30,13 @@ uint16_t kvm_xen_get_gnttab_max_frames(void); #define kvm_xen_has_cap(cap) (!!(kvm_xen_get_caps() & \ KVM_XEN_HVM_CONFIG_ ## cap)) =20 +#define XEN_SPECIAL_AREA_ADDR 0xfeff8000UL +#define XEN_SPECIAL_AREA_SIZE 0x4000UL + +#define XEN_SPECIALPAGE_CONSOLE 0 +#define XEN_SPECIALPAGE_XENSTORE 1 + +#define XEN_SPECIAL_PFN(x) ((XEN_SPECIAL_AREA_ADDR >> TARGET_PAGE_BITS) + \ + XEN_SPECIALPAGE_##x) + #endif /* QEMU_SYSEMU_KVM_XEN_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index c210ff9d91be..75bcf7b6306f 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -23,6 +23,7 @@ =20 #include "hw/pci/msi.h" #include "hw/i386/apic-msidef.h" +#include "hw/i386/e820_memory_layout.h" #include "hw/i386/kvm/xen_overlay.h" #include "hw/i386/kvm/xen_evtchn.h" #include "hw/i386/kvm/xen_gnttab.h" @@ -169,6 +170,15 @@ int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) } =20 s->xen_caps =3D xen_caps; + + /* Tell fw_cfg to notify the BIOS to reserve the range. */ + ret =3D e820_add_entry(XEN_SPECIAL_AREA_ADDR, XEN_SPECIAL_AREA_SIZE, + E820_RESERVED); + if (ret < 0) { + fprintf(stderr, "e820_add_entry() table is full\n"); + return ret; + } + return 0; } =20 --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761367; cv=none; d=zohomail.com; s=zohoarc; b=gLeUB9Dh/JGLodpwiJc5k2sAphiwZkOlXhGS89ibveWRfZpZFDl4Pi8zH7mzQGXE4NeGCIGSrQJDycqfn62b1SMhrcHlShnIbyonxAxCT1Ajx/1Y10SeI6QTxtI6IzhpBtxg0Bh2uLbA4My9PkBXCX+ijAXOy+K5+pbc+kz6MDo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761367; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=l3qtZtM3F7lM2dr4qwMUHBHKRZr+tdOjqwpMHwp/TkI=; b=FeeNCFZ8B3GZKuQvu3y/ybUKEf1EPWm7Nxd/sHashLSEd2/80gxAanCL835k0hL6ohRqosNQjrIRWZnHm1KWwXU2wJsi7W94K2nnKsOLpOzFJe7yjq5f9jiC0koNUNlObTjWuTYe4Cq0JmLU0s91YNb/aPFbMkGdj9PGr2pefmY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761367790442.7481223481177; Thu, 2 Mar 2023 04:49:27 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiAN-0006mZ-8O; Thu, 02 Mar 2023 07:36:11 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7e-0002vf-67 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:22 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7H-0003sL-Lp for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:01 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-265-P-r5vWigMcWXVnL-iej3vQ-1; Thu, 02 Mar 2023 07:32:57 -0500 Received: by mail-wm1-f69.google.com with SMTP id y16-20020a1c4b10000000b003dd1b5d2a36so578986wma.1 for ; Thu, 02 Mar 2023 04:32:57 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id q6-20020a1ce906000000b003e0015c8618sm2796092wmc.6.2023.03.02.04.32.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760378; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=l3qtZtM3F7lM2dr4qwMUHBHKRZr+tdOjqwpMHwp/TkI=; b=eexI6eVVnSgo82aJrhTxXaVl78c2efjcsDgjj5Uz1pFxGwTCEmcAR80A0zzA/qc0Kvpcvk AMX3Qzt/xkm/XBFLxGcCKDXDSRzAA5ZitAhShmKMZFFzH99yvfSC2DWkW4s4vtVTpArxLX 2wj2vZkB1VjK1IvqJIdKwgOg6DJu11Y= X-MC-Unique: P-r5vWigMcWXVnL-iej3vQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=l3qtZtM3F7lM2dr4qwMUHBHKRZr+tdOjqwpMHwp/TkI=; b=qPwoGteb4WgceIFyqYOw5q2lWRo0o5D1rlbKUjwhjZAJWmcK0fCuD54ymfpkF/5J8J I1RAaxLPE0k6YZ8/e7JcOEuGxcKo4RC+6PhaMrmG8uaNHDQoY8MH2A1nL7l8g85m7YnT voDBDiUNrO6mioY6s1QQ1DDFvI1j4LdWjHl+w2SdMWXgTallRULm3g1cvaPOI1M9iIDS dwVGcsZxXLvev1yVp36c5OL3qYPqTMJM6CrHnUShOGXm3vNKJhbrTXQNcJvyluR2IjT+ uxji/2w4kK2DyV84lJ9QzT1ZmG/KHxbWqLMOugXOiHZ31tSMuy8Iaqj93bS8r7dclipw 37Lg== X-Gm-Message-State: AO0yUKXqXGY++sKySYL2dGhIPPnIzb4JxbMARC03vLN2TjiXHeGR5ajD mEgkxwKuvK21u8+dUjwllqykuvzBUi0Xf7ItqSvopNquJ4Wx2K3cO3dDd+7M8e2aWw12UgwlgOZ bWlMoWArfr5trAGkIto62Kx3JOnpn7cuMouNs8MKMaZO9shYxnSRevQMQBZna2Etlbr5cmnFVrQ g= X-Received: by 2002:a05:600c:3413:b0:3df:eecc:de2b with SMTP id y19-20020a05600c341300b003dfeeccde2bmr7370769wmp.11.1677760376421; Thu, 02 Mar 2023 04:32:56 -0800 (PST) X-Google-Smtp-Source: AK7set81cGnp4ywwWwHbrFC3t+/DGuvD1nbMF7PyZ5AsTO7AGVOQTVJk+uCfHlCYSvwl4fGJHOaYzw== X-Received: by 2002:a05:600c:3413:b0:3df:eecc:de2b with SMTP id y19-20020a05600c341300b003dfeeccde2bmr7370749wmp.11.1677760376000; Thu, 02 Mar 2023 04:32:56 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Joao Martins , David Woodhouse , Paul Durrant Subject: [PULL 49/62] i386/xen: handle HVMOP_get_param Date: Thu, 2 Mar 2023 13:30:16 +0100 Message-Id: <20230302123029.153265-50-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761368233100001 Content-Type: text/plain; charset="utf-8" From: Joao Martins Which is used to fetch xenstore PFN and port to be used by the guest. This is preallocated by the toolstack when guest will just read those and use it straight away. Signed-off-by: Joao Martins Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- target/i386/kvm/xen-emu.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 75bcf7b6306f..d2c88ef0d93f 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -765,6 +765,42 @@ out: return true; } =20 +static bool handle_get_param(struct kvm_xen_exit *exit, X86CPU *cpu, + uint64_t arg) +{ + CPUState *cs =3D CPU(cpu); + struct xen_hvm_param hp; + int err =3D 0; + + /* No need for 32/64 compat handling */ + qemu_build_assert(sizeof(hp) =3D=3D 16); + + if (kvm_copy_from_gva(cs, arg, &hp, sizeof(hp))) { + err =3D -EFAULT; + goto out; + } + + if (hp.domid !=3D DOMID_SELF && hp.domid !=3D xen_domid) { + err =3D -ESRCH; + goto out; + } + + switch (hp.index) { + case HVM_PARAM_STORE_PFN: + hp.value =3D XEN_SPECIAL_PFN(XENSTORE); + break; + default: + return false; + } + + if (kvm_copy_to_gva(cs, arg, &hp, sizeof(hp))) { + err =3D -EFAULT; + } +out: + exit->u.hcall.result =3D err; + return true; +} + static int kvm_xen_hcall_evtchn_upcall_vector(struct kvm_xen_exit *exit, X86CPU *cpu, uint64_t arg) { @@ -809,6 +845,9 @@ static bool kvm_xen_hcall_hvm_op(struct kvm_xen_exit *e= xit, X86CPU *cpu, case HVMOP_set_param: return handle_set_param(exit, cpu, arg); =20 + case HVMOP_get_param: + return handle_get_param(exit, cpu, arg); + default: return false; } --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677762027; cv=none; d=zohomail.com; s=zohoarc; b=f63oI63fRXodwJ3S80junY+6lc13eZYqp+0Qb+q+Gd997axH9Zji6Lgg+Vn2PolznR8QubFOPI/MA4uO0qNl51IMGkLQ4tcj2F0sqt/UZB9vp5XB8kKmEmzZrtVhuyPtgLDvNz4Lkqkhll26DGxvWSIa3IHVfNOdgKn/rh8k2Ns= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677762027; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=y4Tlvg3rK6mT0166OHb9x5zfjgmr59hdpstrV6aiVpQ=; b=YVFgNFETIdU+U4TACHKYGkIUZu/P//MpFs6MiAPFm3Qb3OXLoMTlN1ZREK5GGvsPsYJvvF7y6frbOKFkmYvaopiMyZX1Vq+53/kq7lTADZl3+xnBOMGExDUHGpcMhFrmEmk1yiXhfGCoW/wcq0d0tiXa1y6WwfH2wsDSiYt4uN0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677762027192742.4064737746844; Thu, 2 Mar 2023 05:00:27 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiB0-0007Ej-LY; Thu, 02 Mar 2023 07:36:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7f-0002vn-8p for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:23 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7K-0003tx-GG for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:04 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-106-XgVNUjbMOQW2wPYluLIJ9Q-1; Thu, 02 Mar 2023 07:33:00 -0500 Received: by mail-wm1-f70.google.com with SMTP id z6-20020a7bc7c6000000b003e0107732f4so5700787wmk.1 for ; Thu, 02 Mar 2023 04:33:00 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id iz2-20020a05600c554200b003e11ad0750csm2846377wmb.47.2023.03.02.04.32.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:32:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760382; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=y4Tlvg3rK6mT0166OHb9x5zfjgmr59hdpstrV6aiVpQ=; b=SXidqsSw1KS0X8tUm5kDw1nCDbR8uuMn0FSNfO+gO6OJRayUJ/UKbs4YltUqL3FReZlXeS cSFDoI1TMjjIj9YBpL6KQKUCgrw+CWhTyrDf1ecGp2ZbjQeqwMKLUE0wo+1dZplPn7TnoU AM0T+f2zhxcO4aczV7Kw0aemxpq3GWo= X-MC-Unique: XgVNUjbMOQW2wPYluLIJ9Q-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=y4Tlvg3rK6mT0166OHb9x5zfjgmr59hdpstrV6aiVpQ=; b=BC+3UqYBqAunwGhnTdlJUQcM2cXob1IZd+6QxEmR9WSmNREWNqZ/TqOgo7r2B5JTIP 5QRc1uC7PRKcU8HylhAvqiKvW5j69BEYhPDEDVxFxVI+oRqtsObt/vLZIlh5eeMUSE4Z lZmAGsnpfV8e/RgDxWtR7A48Jp8dVdSWeIgB0q7sVW8EX0e1pWzC8uSuKoebMYFatNyL Iv871KFg7xw0F3kfy2to/+j7oPzYMrBLYhtL4remONwwHXnzWvNPH9pQ3Lar3iMOIvIT rwp1n4QiNGzwRWN1aJ9Bk9BVXBL6DA0RecnNhTfVraOn/iApu6DyMPlrzohkVgDzSnZS jBSg== X-Gm-Message-State: AO0yUKVEidKiYRWsYjqmKyo2JZaanM9pIPJYkMb/JirW04MnVpvplRDm yw4Oz/4lQluVWtMETee9RrYVHXZPTPez19yYZLJs8meOqNmajebFUfU8/rfhLcTmLikNH1lElc1 QZnn+rdqClOK6YGHgaZzqsxRSooD39MKRLWpxdjfPUUXVmgndpIVpFCNcUxKapZhcchG1CgdB7b Q= X-Received: by 2002:adf:edc7:0:b0:2c7:a3c:5bd6 with SMTP id v7-20020adfedc7000000b002c70a3c5bd6mr7637293wro.52.1677760379108; Thu, 02 Mar 2023 04:32:59 -0800 (PST) X-Google-Smtp-Source: AK7set8VWzVy7jXdr6mA+dVlXwq+RbW0Y5mm6mb4l/IyoYCPsZXolk97JwJTbfWEMJ3S+WDTV1GDnw== X-Received: by 2002:adf:edc7:0:b0:2c7:a3c:5bd6 with SMTP id v7-20020adfedc7000000b002c70a3c5bd6mr7637278wro.52.1677760378777; Thu, 02 Mar 2023 04:32:58 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 50/62] hw/xen: Add backend implementation of interdomain event channel support Date: Thu, 2 Mar 2023 13:30:17 +0100 Message-Id: <20230302123029.153265-51-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677762028165100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse The provides the QEMU side of interdomain event channels, allowing events to be sent to/from the guest. The API mirrors libxenevtchn, and in time both this and the real Xen one will be available through ops structures so that the PV backend drivers can use the correct one as appropriate. For now, this implementation can be used directly by our XenStore which will be for emulated mode only. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 340 ++++++++++++++++++++++++++++++++++++++- hw/i386/kvm/xen_evtchn.h | 19 +++ 2 files changed, 352 insertions(+), 7 deletions(-) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index 71ed48018942..601fbeee725a 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -38,6 +38,7 @@ #include "sysemu/kvm.h" #include "sysemu/kvm_xen.h" #include +#include =20 #include "hw/xen/interface/memory.h" #include "hw/xen/interface/hvm/params.h" @@ -88,6 +89,13 @@ struct compat_shared_info { =20 #define COMPAT_EVTCHN_2L_NR_CHANNELS 1024 =20 +/* Local private implementation of struct xenevtchn_handle */ +struct xenevtchn_handle { + evtchn_port_t be_port; + evtchn_port_t guest_port; /* Or zero for unbound */ + int fd; +}; + /* * For unbound/interdomain ports there are only two possible remote * domains; self and QEMU. Use a single high bit in type_val for that, @@ -111,6 +119,8 @@ struct XenEvtchnState { uint32_t nr_ports; XenEvtchnPort port_table[EVTCHN_2L_NR_CHANNELS]; qemu_irq gsis[IOAPIC_NUM_PINS]; + + struct xenevtchn_handle *be_handles[EVTCHN_2L_NR_CHANNELS]; }; =20 struct XenEvtchnState *xen_evtchn_singleton; @@ -118,6 +128,18 @@ struct XenEvtchnState *xen_evtchn_singleton; /* Top bits of callback_param are the type (HVM_PARAM_CALLBACK_TYPE_xxx) */ #define CALLBACK_VIA_TYPE_SHIFT 56 =20 +static void unbind_backend_ports(XenEvtchnState *s); + +static int xen_evtchn_pre_load(void *opaque) +{ + XenEvtchnState *s =3D opaque; + + /* Unbind all the backend-side ports; they need to rebind */ + unbind_backend_ports(s); + + return 0; +} + static int xen_evtchn_post_load(void *opaque, int version_id) { XenEvtchnState *s =3D opaque; @@ -151,6 +173,7 @@ static const VMStateDescription xen_evtchn_vmstate =3D { .version_id =3D 1, .minimum_version_id =3D 1, .needed =3D xen_evtchn_is_needed, + .pre_load =3D xen_evtchn_pre_load, .post_load =3D xen_evtchn_post_load, .fields =3D (VMStateField[]) { VMSTATE_UINT64(callback_param, XenEvtchnState), @@ -423,6 +446,20 @@ static int assign_kernel_port(uint16_t type, evtchn_po= rt_t port, return kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_SET_ATTR, &ha); } =20 +static int assign_kernel_eventfd(uint16_t type, evtchn_port_t port, int fd) +{ + struct kvm_xen_hvm_attr ha; + + ha.type =3D KVM_XEN_ATTR_TYPE_EVTCHN; + ha.u.evtchn.send_port =3D port; + ha.u.evtchn.type =3D type; + ha.u.evtchn.flags =3D 0; + ha.u.evtchn.deliver.eventfd.port =3D 0; + ha.u.evtchn.deliver.eventfd.fd =3D fd; + + return kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_SET_ATTR, &ha); +} + static bool valid_port(evtchn_port_t port) { if (!port) { @@ -441,6 +478,32 @@ static bool valid_vcpu(uint32_t vcpu) return !!qemu_get_cpu(vcpu); } =20 +static void unbind_backend_ports(XenEvtchnState *s) +{ + XenEvtchnPort *p; + int i; + + for (i =3D 1; i < s->nr_ports; i++) { + p =3D &s->port_table[i]; + if (p->type =3D=3D EVTCHNSTAT_interdomain && + (p->type_val & PORT_INFO_TYPEVAL_REMOTE_QEMU)) { + evtchn_port_t be_port =3D p->type_val & PORT_INFO_TYPEVAL_REMO= TE_PORT_MASK; + + if (s->be_handles[be_port]) { + /* This part will be overwritten on the load anyway. */ + p->type =3D EVTCHNSTAT_unbound; + p->type_val =3D PORT_INFO_TYPEVAL_REMOTE_QEMU; + + /* Leave the backend port open and unbound too. */ + if (kvm_xen_has_cap(EVTCHN_SEND)) { + deassign_kernel_port(i); + } + s->be_handles[be_port]->guest_port =3D 0; + } + } + } +} + int xen_evtchn_status_op(struct evtchn_status *status) { XenEvtchnState *s =3D xen_evtchn_singleton; @@ -878,7 +941,14 @@ static int close_port(XenEvtchnState *s, evtchn_port_t= port) =20 case EVTCHNSTAT_interdomain: if (p->type_val & PORT_INFO_TYPEVAL_REMOTE_QEMU) { - /* Not yet implemented. This can't happen! */ + uint16_t be_port =3D p->type_val & ~PORT_INFO_TYPEVAL_REMOTE_Q= EMU; + struct xenevtchn_handle *xc =3D s->be_handles[be_port]; + if (xc) { + if (kvm_xen_has_cap(EVTCHN_SEND)) { + deassign_kernel_port(port); + } + xc->guest_port =3D 0; + } } else { /* Loopback interdomain */ XenEvtchnPort *rp =3D &s->port_table[p->type_val]; @@ -1110,8 +1180,27 @@ int xen_evtchn_bind_interdomain_op(struct evtchn_bin= d_interdomain *interdomain) } =20 if (interdomain->remote_dom =3D=3D DOMID_QEMU) { - /* We haven't hooked up QEMU's PV drivers to this yet */ - ret =3D -ENOSYS; + struct xenevtchn_handle *xc =3D s->be_handles[interdomain->remote_= port]; + XenEvtchnPort *lp =3D &s->port_table[interdomain->local_port]; + + if (!xc) { + ret =3D -ENOENT; + goto out_free_port; + } + + if (xc->guest_port) { + ret =3D -EBUSY; + goto out_free_port; + } + + assert(xc->be_port =3D=3D interdomain->remote_port); + xc->guest_port =3D interdomain->local_port; + if (kvm_xen_has_cap(EVTCHN_SEND)) { + assign_kernel_eventfd(lp->type, xc->guest_port, xc->fd); + } + lp->type =3D EVTCHNSTAT_interdomain; + lp->type_val =3D PORT_INFO_TYPEVAL_REMOTE_QEMU | interdomain->remo= te_port; + ret =3D 0; } else { /* Loopback */ XenEvtchnPort *rp =3D &s->port_table[interdomain->remote_port]; @@ -1129,6 +1218,7 @@ int xen_evtchn_bind_interdomain_op(struct evtchn_bind= _interdomain *interdomain) } } =20 + out_free_port: if (ret) { free_port(s, interdomain->local_port); } @@ -1193,11 +1283,16 @@ int xen_evtchn_send_op(struct evtchn_send *send) if (p->type_val & PORT_INFO_TYPEVAL_REMOTE_QEMU) { /* * This is an event from the guest to qemu itself, which is - * serving as the driver domain. Not yet implemented; it will - * be hooked up to the qemu implementation of xenstore, - * console, PV net/block drivers etc. + * serving as the driver domain. */ - ret =3D -ENOSYS; + uint16_t be_port =3D p->type_val & ~PORT_INFO_TYPEVAL_REMOTE_Q= EMU; + struct xenevtchn_handle *xc =3D s->be_handles[be_port]; + if (xc) { + eventfd_write(xc->fd, 1); + ret =3D 0; + } else { + ret =3D -ENOENT; + } } else { /* Loopback interdomain ports; just a complex IPI */ set_port_pending(s, p->type_val); @@ -1253,6 +1348,237 @@ int xen_evtchn_set_port(uint16_t port) return ret; } =20 +struct xenevtchn_handle *xen_be_evtchn_open(void) +{ + struct xenevtchn_handle *xc =3D g_new0(struct xenevtchn_handle, 1); + + xc->fd =3D eventfd(0, EFD_CLOEXEC); + if (xc->fd < 0) { + free(xc); + return NULL; + } + + return xc; +} + +static int find_be_port(XenEvtchnState *s, struct xenevtchn_handle *xc) +{ + int i; + + for (i =3D 1; i < EVTCHN_2L_NR_CHANNELS; i++) { + if (!s->be_handles[i]) { + s->be_handles[i] =3D xc; + xc->be_port =3D i; + return i; + } + } + return 0; +} + +int xen_be_evtchn_bind_interdomain(struct xenevtchn_handle *xc, uint32_t d= omid, + evtchn_port_t guest_port) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + XenEvtchnPort *gp; + uint16_t be_port =3D 0; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (!xc) { + return -EFAULT; + } + + if (domid !=3D xen_domid) { + return -ESRCH; + } + + if (!valid_port(guest_port)) { + return -EINVAL; + } + + qemu_mutex_lock(&s->port_lock); + + /* The guest has to have an unbound port waiting for us to bind */ + gp =3D &s->port_table[guest_port]; + + switch (gp->type) { + case EVTCHNSTAT_interdomain: + /* Allow rebinding after migration, preserve port # if possible */ + be_port =3D gp->type_val & ~PORT_INFO_TYPEVAL_REMOTE_QEMU; + assert(be_port !=3D 0); + if (!s->be_handles[be_port]) { + s->be_handles[be_port] =3D xc; + xc->guest_port =3D guest_port; + ret =3D xc->be_port =3D be_port; + if (kvm_xen_has_cap(EVTCHN_SEND)) { + assign_kernel_eventfd(gp->type, guest_port, xc->fd); + } + break; + } + /* fall through */ + + case EVTCHNSTAT_unbound: + be_port =3D find_be_port(s, xc); + if (!be_port) { + ret =3D -ENOSPC; + goto out; + } + + gp->type =3D EVTCHNSTAT_interdomain; + gp->type_val =3D be_port | PORT_INFO_TYPEVAL_REMOTE_QEMU; + xc->guest_port =3D guest_port; + if (kvm_xen_has_cap(EVTCHN_SEND)) { + assign_kernel_eventfd(gp->type, guest_port, xc->fd); + } + ret =3D be_port; + break; + + default: + ret =3D -EINVAL; + break; + } + + out: + qemu_mutex_unlock(&s->port_lock); + + return ret; +} + +int xen_be_evtchn_unbind(struct xenevtchn_handle *xc, evtchn_port_t port) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (!xc) { + return -EFAULT; + } + + qemu_mutex_lock(&s->port_lock); + + if (port && port !=3D xc->be_port) { + ret =3D -EINVAL; + goto out; + } + + if (xc->guest_port) { + XenEvtchnPort *gp =3D &s->port_table[xc->guest_port]; + + /* This should never *not* be true */ + if (gp->type =3D=3D EVTCHNSTAT_interdomain) { + gp->type =3D EVTCHNSTAT_unbound; + gp->type_val =3D PORT_INFO_TYPEVAL_REMOTE_QEMU; + } + + if (kvm_xen_has_cap(EVTCHN_SEND)) { + deassign_kernel_port(xc->guest_port); + } + xc->guest_port =3D 0; + } + + s->be_handles[xc->be_port] =3D NULL; + xc->be_port =3D 0; + ret =3D 0; + out: + qemu_mutex_unlock(&s->port_lock); + return ret; +} + +int xen_be_evtchn_close(struct xenevtchn_handle *xc) +{ + if (!xc) { + return -EFAULT; + } + + xen_be_evtchn_unbind(xc, 0); + + close(xc->fd); + free(xc); + return 0; +} + +int xen_be_evtchn_fd(struct xenevtchn_handle *xc) +{ + if (!xc) { + return -1; + } + return xc->fd; +} + +int xen_be_evtchn_notify(struct xenevtchn_handle *xc, evtchn_port_t port) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (!xc) { + return -EFAULT; + } + + qemu_mutex_lock(&s->port_lock); + + if (xc->guest_port) { + set_port_pending(s, xc->guest_port); + ret =3D 0; + } else { + ret =3D -ENOTCONN; + } + + qemu_mutex_unlock(&s->port_lock); + + return ret; +} + +int xen_be_evtchn_pending(struct xenevtchn_handle *xc) +{ + uint64_t val; + + if (!xc) { + return -EFAULT; + } + + if (!xc->be_port) { + return 0; + } + + if (eventfd_read(xc->fd, &val)) { + return -errno; + } + + return val ? xc->be_port : 0; +} + +int xen_be_evtchn_unmask(struct xenevtchn_handle *xc, evtchn_port_t port) +{ + if (!xc) { + return -EFAULT; + } + + if (xc->be_port !=3D port) { + return -EINVAL; + } + + /* + * We don't actually do anything to unmask it; the event was already + * consumed in xen_be_evtchn_pending(). + */ + return 0; +} + +int xen_be_evtchn_get_guest_port(struct xenevtchn_handle *xc) +{ + return xc->guest_port; +} + EvtchnInfoList *qmp_xen_event_list(Error **errp) { XenEvtchnState *s =3D xen_evtchn_singleton; diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 24611478b87a..5a71ffb75311 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -14,6 +14,8 @@ =20 #include "hw/sysbus.h" =20 +typedef uint32_t evtchn_port_t; + void xen_evtchn_create(void); int xen_evtchn_soft_reset(void); int xen_evtchn_set_callback_param(uint64_t param); @@ -22,6 +24,23 @@ void xen_evtchn_set_callback_level(int level); =20 int xen_evtchn_set_port(uint16_t port); =20 +/* + * These functions mirror the libxenevtchn library API, providing the QEMU + * backend side of "interdomain" event channels. + */ +struct xenevtchn_handle; +struct xenevtchn_handle *xen_be_evtchn_open(void); +int xen_be_evtchn_bind_interdomain(struct xenevtchn_handle *xc, uint32_t d= omid, + evtchn_port_t guest_port); +int xen_be_evtchn_unbind(struct xenevtchn_handle *xc, evtchn_port_t port); +int xen_be_evtchn_close(struct xenevtchn_handle *xc); +int xen_be_evtchn_fd(struct xenevtchn_handle *xc); +int xen_be_evtchn_notify(struct xenevtchn_handle *xc, evtchn_port_t port); +int xen_be_evtchn_unmask(struct xenevtchn_handle *xc, evtchn_port_t port); +int xen_be_evtchn_pending(struct xenevtchn_handle *xc); +/* Apart from this which is a local addition */ +int xen_be_evtchn_get_guest_port(struct xenevtchn_handle *xc); + struct evtchn_status; struct evtchn_close; struct evtchn_unmask; --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761177; cv=none; d=zohomail.com; s=zohoarc; b=K72KxR2VzKV0j0e+rEiU7cd6axKvENrYZNo6pj47Z9LIMvdNJN1UHdnoIJ6UYOznzzL7mwElP9X9aX80Aiiahibb5oPcNtK9QgCFBMyoRotphrwFLRHcknhA0hYzJBXTUGt5ciTScmPPkZt3tIGlOavOA4zzUh0mXtC6qz9mRdI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761177; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=GN/OxjDVjnnq3jpXOu8rLzM/zwUty9pjbgmj3uixKJc=; b=dbdfe1gEU5DO831aM8FABtshZp4GpQVNOTy1IdbU0bO/12evYMKi+Qa32TTR5pFlImMFFCCfOdBjaiWXTCmH053E2bDfzLHo/iFYHhy0w++drGQW2glPborfWekwAn/h4gKkCP5SADfUap7XY6ApEG7EpmpKg/yxeSguoK+/zO8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761177969629.8877065658143; Thu, 2 Mar 2023 04:46:17 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiAL-0006fQ-Up; Thu, 02 Mar 2023 07:36:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7g-0002xG-1h for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:24 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7N-0003uJ-0n for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:07 -0500 Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-532-FHchQafjPyaitzvo_rM10Q-1; Thu, 02 Mar 2023 07:33:03 -0500 Received: by mail-wm1-f69.google.com with SMTP id x18-20020a1c7c12000000b003e1e7d3cf9fso1206262wmc.3 for ; Thu, 02 Mar 2023 04:33:03 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id u9-20020a5d5149000000b002c54c92e125sm15328917wrt.46.2023.03.02.04.33.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760384; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GN/OxjDVjnnq3jpXOu8rLzM/zwUty9pjbgmj3uixKJc=; b=b8hayrGWxj2YAgI/4q8oCZgzvH7bNfxqdiqJ9/QyTQY9yBHiYNFiWOQ/qdgS/VD8eJpd00 qcia95fMOc+aecgrBW2eV6sjhJgqn9U9UlegnoGhKrZ3VfxhwS2Cqo0KLiZdCwo5VGGTsE ddBgvJfLADExnm1g/5lKIBDvkLyYmag= X-MC-Unique: FHchQafjPyaitzvo_rM10Q-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=GN/OxjDVjnnq3jpXOu8rLzM/zwUty9pjbgmj3uixKJc=; b=xf8dm5RjC3/soraOsEr0XFoZpvMHXD0o0LfgjhKmmQ54e0uJav2y8FjUldKaYmfO7y S2F7pFMvK+vEWGCZ8o9h5XTunpz7qJc6uyTKfPvJDzpkCq4r27IiyQF4zwBGZREW12mR kfLQ2ipTSAsJQDBPbegGxMjsO6CzX60tVDgqIZAgCMKLMesOAfSnCbUyG7usuPtOFu+L XeC4epSrHLHrL5yBIKituhdLUxLqOwMK+GZuN+eftz1fceiMwirXTnVZ3BEqvtMVpC9C Gy02v52lHecPDFQIZU6fytTfmUfF9ku893YSBAfedoKP+6pihCC9ceCDsuDKfaDt0ruT Xdvg== X-Gm-Message-State: AO0yUKUHeK7KyfohCHkitbx5MLw3WhRiepVdD7ICklvCAlzwlzDiBb+O rbaNjsDMqX/osKBczGu53AHQZV6ZczmVR/G3VE3b1+/Nks6HrAglG0GldTFIUlUIDwV+CUndfxH sfHn39zQgONbUpWL2TPyo1hY7iUWuRMtmHFFBvYJwT1y7x9vIvexJPkHedlbUGA3RUr70EbHVkj 4= X-Received: by 2002:a05:600c:1e12:b0:3eb:2067:1141 with SMTP id ay18-20020a05600c1e1200b003eb20671141mr7339735wmb.38.1677760382002; Thu, 02 Mar 2023 04:33:02 -0800 (PST) X-Google-Smtp-Source: AK7set9vCsev6ngRCbUDIdEo6p8uGmvyLuy9w4FEo4lzn7HpePoZBCloZwnclmfUh4SJuTmVi400jw== X-Received: by 2002:a05:600c:1e12:b0:3eb:2067:1141 with SMTP id ay18-20020a05600c1e1200b003eb20671141mr7339718wmb.38.1677760381677; Thu, 02 Mar 2023 04:33:01 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 51/62] hw/xen: Add xen_xenstore device for xenstore emulation Date: Thu, 2 Mar 2023 13:30:18 +0100 Message-Id: <20230302123029.153265-52-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761179068100007 From: David Woodhouse Just the basic shell, with the event channel hookup. It only dumps the buffer for now; a real ring implmentation will come in a subsequent patch. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/meson.build | 1 + hw/i386/kvm/xen_evtchn.c | 1 + hw/i386/kvm/xen_xenstore.c | 252 +++++++++++++++++++++++++++++++++++++ hw/i386/kvm/xen_xenstore.h | 20 +++ hw/i386/pc.c | 2 + target/i386/kvm/xen-emu.c | 12 ++ 6 files changed, 288 insertions(+) create mode 100644 hw/i386/kvm/xen_xenstore.c create mode 100644 hw/i386/kvm/xen_xenstore.h diff --git a/hw/i386/kvm/meson.build b/hw/i386/kvm/meson.build index 067ff525eeb6..82dd6ae7c6d9 100644 --- a/hw/i386/kvm/meson.build +++ b/hw/i386/kvm/meson.build @@ -8,6 +8,7 @@ i386_kvm_ss.add(when: 'CONFIG_XEN_EMU', if_true: files( 'xen_overlay.c', 'xen_evtchn.c', 'xen_gnttab.c', + 'xen_xenstore.c', )) =20 i386_ss.add_all(when: 'CONFIG_KVM', if_true: i386_kvm_ss) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index 601fbeee725a..6c396270b75d 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -34,6 +34,7 @@ =20 #include "xen_evtchn.h" #include "xen_overlay.h" +#include "xen_xenstore.h" =20 #include "sysemu/kvm.h" #include "sysemu/kvm_xen.h" diff --git a/hw/i386/kvm/xen_xenstore.c b/hw/i386/kvm/xen_xenstore.c new file mode 100644 index 000000000000..e8abddae57bd --- /dev/null +++ b/hw/i386/kvm/xen_xenstore.c @@ -0,0 +1,252 @@ +/* + * QEMU Xen emulation: Shared/overlay pages support + * + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: David Woodhouse + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" + +#include "qemu/host-utils.h" +#include "qemu/module.h" +#include "qemu/main-loop.h" +#include "qemu/cutils.h" +#include "qapi/error.h" +#include "qom/object.h" +#include "migration/vmstate.h" + +#include "hw/sysbus.h" +#include "hw/xen/xen.h" +#include "xen_overlay.h" +#include "xen_evtchn.h" +#include "xen_xenstore.h" + +#include "sysemu/kvm.h" +#include "sysemu/kvm_xen.h" + +#include "hw/xen/interface/io/xs_wire.h" +#include "hw/xen/interface/event_channel.h" + +#define TYPE_XEN_XENSTORE "xen-xenstore" +OBJECT_DECLARE_SIMPLE_TYPE(XenXenstoreState, XEN_XENSTORE) + +#define XEN_PAGE_SHIFT 12 +#define XEN_PAGE_SIZE (1ULL << XEN_PAGE_SHIFT) + +#define ENTRIES_PER_FRAME_V1 (XEN_PAGE_SIZE / sizeof(grant_entry_v1_t)) +#define ENTRIES_PER_FRAME_V2 (XEN_PAGE_SIZE / sizeof(grant_entry_v2_t)) + +#define XENSTORE_HEADER_SIZE ((unsigned int)sizeof(struct xsd_sockmsg)) + +struct XenXenstoreState { + /*< private >*/ + SysBusDevice busdev; + /*< public >*/ + + MemoryRegion xenstore_page; + struct xenstore_domain_interface *xs; + uint8_t req_data[XENSTORE_HEADER_SIZE + XENSTORE_PAYLOAD_MAX]; + uint8_t rsp_data[XENSTORE_HEADER_SIZE + XENSTORE_PAYLOAD_MAX]; + uint32_t req_offset; + uint32_t rsp_offset; + bool rsp_pending; + bool fatal_error; + + evtchn_port_t guest_port; + evtchn_port_t be_port; + struct xenevtchn_handle *eh; +}; + +struct XenXenstoreState *xen_xenstore_singleton; + +static void xen_xenstore_event(void *opaque); + +static void xen_xenstore_realize(DeviceState *dev, Error **errp) +{ + XenXenstoreState *s =3D XEN_XENSTORE(dev); + + if (xen_mode !=3D XEN_EMULATE) { + error_setg(errp, "Xen xenstore support is for Xen emulation"); + return; + } + memory_region_init_ram(&s->xenstore_page, OBJECT(dev), "xen:xenstore_p= age", + XEN_PAGE_SIZE, &error_abort); + memory_region_set_enabled(&s->xenstore_page, true); + s->xs =3D memory_region_get_ram_ptr(&s->xenstore_page); + memset(s->xs, 0, XEN_PAGE_SIZE); + + /* We can't map it this early as KVM isn't ready */ + xen_xenstore_singleton =3D s; + + s->eh =3D xen_be_evtchn_open(); + if (!s->eh) { + error_setg(errp, "Xenstore evtchn port init failed"); + return; + } + aio_set_fd_handler(qemu_get_aio_context(), xen_be_evtchn_fd(s->eh), tr= ue, + xen_xenstore_event, NULL, NULL, NULL, s); +} + +static bool xen_xenstore_is_needed(void *opaque) +{ + return xen_mode =3D=3D XEN_EMULATE; +} + +static int xen_xenstore_pre_save(void *opaque) +{ + XenXenstoreState *s =3D opaque; + + if (s->eh) { + s->guest_port =3D xen_be_evtchn_get_guest_port(s->eh); + } + return 0; +} + +static int xen_xenstore_post_load(void *opaque, int ver) +{ + XenXenstoreState *s =3D opaque; + + /* + * As qemu/dom0, rebind to the guest's port. The Windows drivers may + * unbind the XenStore evtchn and rebind to it, having obtained the + * "remote" port through EVTCHNOP_status. In the case that migration + * occurs while it's unbound, the "remote" port needs to be the same + * as before so that the guest can find it, but should remain unbound. + */ + if (s->guest_port) { + int be_port =3D xen_be_evtchn_bind_interdomain(s->eh, xen_domid, + s->guest_port); + if (be_port < 0) { + return be_port; + } + s->be_port =3D be_port; + } + return 0; +} + +static const VMStateDescription xen_xenstore_vmstate =3D { + .name =3D "xen_xenstore", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D xen_xenstore_is_needed, + .pre_save =3D xen_xenstore_pre_save, + .post_load =3D xen_xenstore_post_load, + .fields =3D (VMStateField[]) { + VMSTATE_UINT8_ARRAY(req_data, XenXenstoreState, + sizeof_field(XenXenstoreState, req_data)), + VMSTATE_UINT8_ARRAY(rsp_data, XenXenstoreState, + sizeof_field(XenXenstoreState, rsp_data)), + VMSTATE_UINT32(req_offset, XenXenstoreState), + VMSTATE_UINT32(rsp_offset, XenXenstoreState), + VMSTATE_BOOL(rsp_pending, XenXenstoreState), + VMSTATE_UINT32(guest_port, XenXenstoreState), + VMSTATE_BOOL(fatal_error, XenXenstoreState), + VMSTATE_END_OF_LIST() + } +}; + +static void xen_xenstore_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->realize =3D xen_xenstore_realize; + dc->vmsd =3D &xen_xenstore_vmstate; +} + +static const TypeInfo xen_xenstore_info =3D { + .name =3D TYPE_XEN_XENSTORE, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(XenXenstoreState), + .class_init =3D xen_xenstore_class_init, +}; + +void xen_xenstore_create(void) +{ + DeviceState *dev =3D sysbus_create_simple(TYPE_XEN_XENSTORE, -1, NULL); + + xen_xenstore_singleton =3D XEN_XENSTORE(dev); + + /* + * Defer the init (xen_xenstore_reset()) until KVM is set up and the + * overlay page can be mapped. + */ +} + +static void xen_xenstore_register_types(void) +{ + type_register_static(&xen_xenstore_info); +} + +type_init(xen_xenstore_register_types) + +uint16_t xen_xenstore_get_port(void) +{ + XenXenstoreState *s =3D xen_xenstore_singleton; + if (!s) { + return 0; + } + return s->guest_port; +} + +static void xen_xenstore_event(void *opaque) +{ + XenXenstoreState *s =3D opaque; + evtchn_port_t port =3D xen_be_evtchn_pending(s->eh); + if (port !=3D s->be_port) { + return; + } + printf("xenstore event\n"); + /* We know this is a no-op. */ + xen_be_evtchn_unmask(s->eh, port); + qemu_hexdump(stdout, "", s->xs, sizeof(*s->xs)); + xen_be_evtchn_notify(s->eh, s->be_port); +} + +static void alloc_guest_port(XenXenstoreState *s) +{ + struct evtchn_alloc_unbound alloc =3D { + .dom =3D DOMID_SELF, + .remote_dom =3D DOMID_QEMU, + }; + + if (!xen_evtchn_alloc_unbound_op(&alloc)) { + s->guest_port =3D alloc.port; + } +} + +int xen_xenstore_reset(void) +{ + XenXenstoreState *s =3D xen_xenstore_singleton; + int err; + + if (!s) { + return -ENOTSUP; + } + + s->req_offset =3D s->rsp_offset =3D 0; + s->rsp_pending =3D false; + + if (!memory_region_is_mapped(&s->xenstore_page)) { + uint64_t gpa =3D XEN_SPECIAL_PFN(XENSTORE) << TARGET_PAGE_BITS; + xen_overlay_do_map_page(&s->xenstore_page, gpa); + } + + alloc_guest_port(s); + + /* + * As qemu/dom0, bind to the guest's port. For incoming migration, this + * will be unbound as the guest's evtchn table is overwritten. We then + * rebind to the correct guest port in xen_xenstore_post_load(). + */ + err =3D xen_be_evtchn_bind_interdomain(s->eh, xen_domid, s->guest_port= ); + if (err < 0) { + return err; + } + s->be_port =3D err; + + return 0; +} diff --git a/hw/i386/kvm/xen_xenstore.h b/hw/i386/kvm/xen_xenstore.h new file mode 100644 index 000000000000..8c3768e075f0 --- /dev/null +++ b/hw/i386/kvm/xen_xenstore.h @@ -0,0 +1,20 @@ +/* + * QEMU Xen emulation: Xenstore emulation + * + * Copyright =C2=A9 2022 Amazon.com, Inc. or its affiliates. All Rights Re= served. + * + * Authors: David Woodhouse + * + * This work is licensed under the terms of the GNU GPL, version 2 or late= r. + * See the COPYING file in the top-level directory. + */ + +#ifndef QEMU_XEN_XENSTORE_H +#define QEMU_XEN_XENSTORE_H + +void xen_xenstore_create(void); +int xen_xenstore_reset(void); + +uint16_t xen_xenstore_get_port(void); + +#endif /* QEMU_XEN_XENSTORE_H */ diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 1cf112e54227..f4a08cc23f1f 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -93,6 +93,7 @@ #include "hw/i386/kvm/xen_overlay.h" #include "hw/i386/kvm/xen_evtchn.h" #include "hw/i386/kvm/xen_gnttab.h" +#include "hw/i386/kvm/xen_xenstore.h" #include "hw/mem/memory-device.h" #include "sysemu/replay.h" #include "target/i386/cpu.h" @@ -1862,6 +1863,7 @@ int pc_machine_kvm_type(MachineState *machine, const = char *kvm_type) xen_overlay_create(); xen_evtchn_create(); xen_gnttab_create(); + xen_xenstore_create(); } #endif return 0; diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index d2c88ef0d93f..50965b56f3c9 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -27,6 +27,7 @@ #include "hw/i386/kvm/xen_overlay.h" #include "hw/i386/kvm/xen_evtchn.h" #include "hw/i386/kvm/xen_gnttab.h" +#include "hw/i386/kvm/xen_xenstore.h" =20 #include "hw/xen/interface/version.h" #include "hw/xen/interface/sched.h" @@ -179,6 +180,9 @@ int kvm_xen_init(KVMState *s, uint32_t hypercall_msr) return ret; } =20 + /* The page couldn't be overlaid until KVM was initialized */ + xen_xenstore_reset(); + return 0; } =20 @@ -789,6 +793,9 @@ static bool handle_get_param(struct kvm_xen_exit *exit,= X86CPU *cpu, case HVM_PARAM_STORE_PFN: hp.value =3D XEN_SPECIAL_PFN(XENSTORE); break; + case HVM_PARAM_STORE_EVTCHN: + hp.value =3D xen_xenstore_get_port(); + break; default: return false; } @@ -1383,6 +1390,11 @@ int kvm_xen_soft_reset(void) return err; } =20 + err =3D xen_xenstore_reset(); + if (err) { + return err; + } + return 0; } =20 --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760568; cv=none; d=zohomail.com; s=zohoarc; b=IJ7fMDg2BbZ7bQVf6FcCtCsoopD3dBL5oEt9qjp9j2axvqOMr5UQHyaJ6YLfL3l4L67ikqxu/m/cTNBFadJTS7VmaLB0mzvPgs/i2mtMCwtR0s9LkknY71gDQ8L4Ywsxo9X4J/u0btyHPguw6fn9wfT1Uhir3oo+CBobKfplzPE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760568; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=h44FI9aQQpNL0twu+7edUetclA3CdoZq7eRvJdbWr5A=; b=dgHPAWjXMo1yHsSXQmDdD63oqBleemzsPBDml4zCLLgn+0Ep8H/1uw8bnvyQWXVI3btpoXiPCpTuupGSd/wpZj6oYg/BbpXaji9mCC0ZV/cflVUA6Kx6cJi10tq+ttlReLsRPInViJ8bvb9tu9+40wWI/XSjhid3xzCqufyb9bo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677760568966507.22453183712; Thu, 2 Mar 2023 04:36:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi9P-0005DL-Q1; Thu, 02 Mar 2023 07:35:23 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7g-0002xd-5g for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:24 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7Q-0003v8-7d for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:09 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-312-gR5eAQb9PP-PSrn3T2leRA-1; Thu, 02 Mar 2023 07:33:06 -0500 Received: by mail-wm1-f70.google.com with SMTP id k36-20020a05600c1ca400b003eac86e4387so1190845wms.8 for ; Thu, 02 Mar 2023 04:33:06 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id h16-20020adff4d0000000b002c70851fdd8sm15276297wrp.75.2023.03.02.04.33.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760387; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h44FI9aQQpNL0twu+7edUetclA3CdoZq7eRvJdbWr5A=; b=AxDfb37PypTqkidRRf0zZuN2XHujp82aVxFEZztR9Ivig0a8/+vbDRq3f1bNde1zvszSEg mpV65Dpey61A28q2Euzh0unoUo8lbmcSrd90mr0U0mVQzeA0O+GiEffsZM/CVSkE4bqzh5 +T3CpEHEtGzXuf6k8450u/aIuDLApks= X-MC-Unique: gR5eAQb9PP-PSrn3T2leRA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=h44FI9aQQpNL0twu+7edUetclA3CdoZq7eRvJdbWr5A=; b=LIx0DyyCydkQ8jARXf7HNS3tl2iga3bHX8EeIMYMvSjKl71msNqroSrC+hxpeBis4f ahIEkCwdRArklTXzZrLEwBl08x2mDNfTeMMcdPDVTz/WU0dreeE2/0iSD5/aME3JJd11 S28zBSlykEkX0TmkecMi1QrXuWlYbWjwqnxqagdWltqlFo9HgLWewyPbyFN0c8UmJ88J Gj2FWYt0qKkeWB421j3uDmY4J+35diV++TDVR43dWgZpWOSdv1kbxn8SNRvhEBrzh3UH GSbhWHUpQQC9eY8ZU8+nDg4/6mQJdaEKWuS+FIusC4di6wYcARwmTDetzMJKCG+xvuFJ +yGg== X-Gm-Message-State: AO0yUKVCvGcQe5s1MTBkvrg4FZdQ5suwD2D8lQJI5ru73klKUNm/uh5S bEfqracdfVYxHD4qPlnqdFOrhGCwHIg0eAihb5K83uoNAGKnuoWE3KiLnC3Gd3or7AaagLdmu/q mEUC/WOPsSvXpMEloc3MFF6SpMliAbrTaUJ/Tnk3XFgj61tQcXfcL4ta5wQCTRa6IJqSGTyg1SN 0= X-Received: by 2002:adf:dd04:0:b0:2c7:bfe:4f60 with SMTP id a4-20020adfdd04000000b002c70bfe4f60mr8029376wrm.15.1677760384942; Thu, 02 Mar 2023 04:33:04 -0800 (PST) X-Google-Smtp-Source: AK7set8dv7Eae2Rk7FcoGLrKoFlS8/ZWU6z5uxHhqwLpEGS4Xzk+MpFasTYZRMrSu/PspYk5/L8JCw== X-Received: by 2002:adf:dd04:0:b0:2c7:bfe:4f60 with SMTP id a4-20020adfdd04000000b002c70bfe4f60mr8029359wrm.15.1677760384602; Thu, 02 Mar 2023 04:33:04 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 52/62] hw/xen: Add basic ring handling to xenstore Date: Thu, 2 Mar 2023 13:30:19 +0100 Message-Id: <20230302123029.153265-53-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760569372100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Extract requests, return ENOSYS to all of them. This is enough to allow older Linux guests to boot, as they need *something* back but it doesn't matter much what. A full implementation of a single-tentant internal XenStore copy-on-write tree with transactions and watches is waiting in the wings to be sent in a subsequent round of patches along with hooking up the actual PV disk back end in qemu, but this is enough to get guests booting for now. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_xenstore.c | 254 ++++++++++++++++++++++++++++++++++++- 1 file changed, 251 insertions(+), 3 deletions(-) diff --git a/hw/i386/kvm/xen_xenstore.c b/hw/i386/kvm/xen_xenstore.c index e8abddae57bd..14193ef3f921 100644 --- a/hw/i386/kvm/xen_xenstore.c +++ b/hw/i386/kvm/xen_xenstore.c @@ -192,18 +192,266 @@ uint16_t xen_xenstore_get_port(void) return s->guest_port; } =20 +static bool req_pending(XenXenstoreState *s) +{ + struct xsd_sockmsg *req =3D (struct xsd_sockmsg *)s->req_data; + + return s->req_offset =3D=3D XENSTORE_HEADER_SIZE + req->len; +} + +static void reset_req(XenXenstoreState *s) +{ + memset(s->req_data, 0, sizeof(s->req_data)); + s->req_offset =3D 0; +} + +static void reset_rsp(XenXenstoreState *s) +{ + s->rsp_pending =3D false; + + memset(s->rsp_data, 0, sizeof(s->rsp_data)); + s->rsp_offset =3D 0; +} + +static void process_req(XenXenstoreState *s) +{ + struct xsd_sockmsg *req =3D (struct xsd_sockmsg *)s->req_data; + struct xsd_sockmsg *rsp =3D (struct xsd_sockmsg *)s->rsp_data; + const char enosys[] =3D "ENOSYS"; + + assert(req_pending(s)); + assert(!s->rsp_pending); + + rsp->type =3D XS_ERROR; + rsp->req_id =3D req->req_id; + rsp->tx_id =3D req->tx_id; + rsp->len =3D sizeof(enosys); + memcpy((void *)&rsp[1], enosys, sizeof(enosys)); + + s->rsp_pending =3D true; + reset_req(s); +} + +static unsigned int copy_from_ring(XenXenstoreState *s, uint8_t *ptr, + unsigned int len) +{ + if (!len) { + return 0; + } + + XENSTORE_RING_IDX prod =3D qatomic_read(&s->xs->req_prod); + XENSTORE_RING_IDX cons =3D qatomic_read(&s->xs->req_cons); + unsigned int copied =3D 0; + + /* Ensure the ring contents don't cross the req_prod access. */ + smp_rmb(); + + while (len) { + unsigned int avail =3D prod - cons; + unsigned int offset =3D MASK_XENSTORE_IDX(cons); + unsigned int copylen =3D avail; + + if (avail > XENSTORE_RING_SIZE) { + error_report("XenStore ring handling error"); + s->fatal_error =3D true; + break; + } else if (avail =3D=3D 0) { + break; + } + + if (copylen > len) { + copylen =3D len; + } + if (copylen > XENSTORE_RING_SIZE - offset) { + copylen =3D XENSTORE_RING_SIZE - offset; + } + + memcpy(ptr, &s->xs->req[offset], copylen); + copied +=3D copylen; + + ptr +=3D copylen; + len -=3D copylen; + + cons +=3D copylen; + } + + /* + * Not sure this ever mattered except on Alpha, but this barrier + * is to ensure that the update to req_cons is globally visible + * only after we have consumed all the data from the ring, and we + * don't end up seeing data written to the ring *after* the other + * end sees the update and writes more to the ring. Xen's own + * xenstored has the same barrier here (although with no comment + * at all, obviously, because it's Xen code). + */ + smp_mb(); + + qatomic_set(&s->xs->req_cons, cons); + + return copied; +} + +static unsigned int copy_to_ring(XenXenstoreState *s, uint8_t *ptr, + unsigned int len) +{ + if (!len) { + return 0; + } + + XENSTORE_RING_IDX cons =3D qatomic_read(&s->xs->rsp_cons); + XENSTORE_RING_IDX prod =3D qatomic_read(&s->xs->rsp_prod); + unsigned int copied =3D 0; + + /* + * This matches the barrier in copy_to_ring() (or the guest's + * equivalent) betweem writing the data to the ring and updating + * rsp_prod. It protects against the pathological case (which + * again I think never happened except on Alpha) where our + * subsequent writes to the ring could *cross* the read of + * rsp_cons and the guest could see the new data when it was + * intending to read the old. + */ + smp_mb(); + + while (len) { + unsigned int avail =3D cons + XENSTORE_RING_SIZE - prod; + unsigned int offset =3D MASK_XENSTORE_IDX(prod); + unsigned int copylen =3D len; + + if (avail > XENSTORE_RING_SIZE) { + error_report("XenStore ring handling error"); + s->fatal_error =3D true; + break; + } else if (avail =3D=3D 0) { + break; + } + + if (copylen > avail) { + copylen =3D avail; + } + if (copylen > XENSTORE_RING_SIZE - offset) { + copylen =3D XENSTORE_RING_SIZE - offset; + } + + + memcpy(&s->xs->rsp[offset], ptr, copylen); + copied +=3D copylen; + + ptr +=3D copylen; + len -=3D copylen; + + prod +=3D copylen; + } + + /* Ensure the ring contents are seen before rsp_prod update. */ + smp_wmb(); + + qatomic_set(&s->xs->rsp_prod, prod); + + return copied; +} + +static unsigned int get_req(XenXenstoreState *s) +{ + unsigned int copied =3D 0; + + if (s->fatal_error) { + return 0; + } + + assert(!req_pending(s)); + + if (s->req_offset < XENSTORE_HEADER_SIZE) { + void *ptr =3D s->req_data + s->req_offset; + unsigned int len =3D XENSTORE_HEADER_SIZE; + unsigned int copylen =3D copy_from_ring(s, ptr, len); + + copied +=3D copylen; + s->req_offset +=3D copylen; + } + + if (s->req_offset >=3D XENSTORE_HEADER_SIZE) { + struct xsd_sockmsg *req =3D (struct xsd_sockmsg *)s->req_data; + + if (req->len > (uint32_t)XENSTORE_PAYLOAD_MAX) { + error_report("Illegal XenStore request"); + s->fatal_error =3D true; + return 0; + } + + void *ptr =3D s->req_data + s->req_offset; + unsigned int len =3D XENSTORE_HEADER_SIZE + req->len - s->req_offs= et; + unsigned int copylen =3D copy_from_ring(s, ptr, len); + + copied +=3D copylen; + s->req_offset +=3D copylen; + } + + return copied; +} + +static unsigned int put_rsp(XenXenstoreState *s) +{ + if (s->fatal_error) { + return 0; + } + + assert(s->rsp_pending); + + struct xsd_sockmsg *rsp =3D (struct xsd_sockmsg *)s->rsp_data; + assert(s->rsp_offset < XENSTORE_HEADER_SIZE + rsp->len); + + void *ptr =3D s->rsp_data + s->rsp_offset; + unsigned int len =3D XENSTORE_HEADER_SIZE + rsp->len - s->rsp_offset; + unsigned int copylen =3D copy_to_ring(s, ptr, len); + + s->rsp_offset +=3D copylen; + + /* Have we produced a complete response? */ + if (s->rsp_offset =3D=3D XENSTORE_HEADER_SIZE + rsp->len) { + reset_rsp(s); + } + + return copylen; +} + static void xen_xenstore_event(void *opaque) { XenXenstoreState *s =3D opaque; evtchn_port_t port =3D xen_be_evtchn_pending(s->eh); + unsigned int copied_to, copied_from; + bool processed, notify =3D false; + if (port !=3D s->be_port) { return; } - printf("xenstore event\n"); + /* We know this is a no-op. */ xen_be_evtchn_unmask(s->eh, port); - qemu_hexdump(stdout, "", s->xs, sizeof(*s->xs)); - xen_be_evtchn_notify(s->eh, s->be_port); + + do { + copied_to =3D copied_from =3D 0; + processed =3D false; + + if (s->rsp_pending) { + copied_to =3D put_rsp(s); + } + + if (!req_pending(s)) { + copied_from =3D get_req(s); + } + + if (req_pending(s) && !s->rsp_pending) { + process_req(s); + processed =3D true; + } + + notify |=3D copied_to || copied_from; + } while (copied_to || copied_from || processed); + + if (notify) { + xen_be_evtchn_notify(s->eh, s->be_port); + } } =20 static void alloc_guest_port(XenXenstoreState *s) --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761755; cv=none; d=zohomail.com; s=zohoarc; b=lVd+UOp+dyjiSvoyflJ2YS3d3qiuPSVr1S3Mee187yeJwpqGJ3xoTATy46TcVQ/oYU1oBZh8NQbRP03PFNgLNSNMP9RIuUqjQ0CGfgodkhg0Y3CavibCul+gmkAWU9ibb83wy99PBLanZt89kHYNjFSRkC1MzRaFOucJltpRBQ4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761755; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=5pv+L4AMt3OcxhqFwjjEU7nQ7tLTf4Y9EqFOws46ojA=; b=hBgYeuWjPS4TEgYrTpno781VmZcJTkDOcKQRCp+5hI2YiibyE+PB12qftEQFhkfCLwWMNT94AmMDA8EiaBle0q3+07NcK7bgsbb+loAhPvYc8shu9CD47vlYKARsH/mRXmO801FjJ77M3v+8OA1AoDNDtZowAi7UhZT9xD/Px28= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761755049770.2310820017034; Thu, 2 Mar 2023 04:55:55 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi8j-00048C-PY; Thu, 02 Mar 2023 07:34:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7g-0002xg-5w for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:24 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7S-0003vW-T8 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:12 -0500 Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-608-uXtVIZtSPoGyjQTWLbpadQ-1; Thu, 02 Mar 2023 07:33:09 -0500 Received: by mail-wr1-f72.google.com with SMTP id t19-20020a0560001a5300b002ce013276b8so176533wry.1 for ; Thu, 02 Mar 2023 04:33:08 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id x14-20020adfec0e000000b002c54536c662sm15234549wrn.34.2023.03.02.04.33.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760390; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5pv+L4AMt3OcxhqFwjjEU7nQ7tLTf4Y9EqFOws46ojA=; b=jWEZwp8NVgbczzaF24UXIKobgG9jZ4xT9OvH1yc4gLYkXqT434LkUq/mqrmXm7P2F1z7ua SIu77SDR14Zw2SWqDd/czygdOXOOVfzVRSnkaoMzyHpYV9pL+F5GYPw3kyNcX2U6EsSkB3 O/jURFmg5bH0xiEGBWGSRoYnncr7qKY= X-MC-Unique: uXtVIZtSPoGyjQTWLbpadQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=5pv+L4AMt3OcxhqFwjjEU7nQ7tLTf4Y9EqFOws46ojA=; b=knHbnoHR1z6VlauElYFj68TaesecTbrkzgqDLscgRrDr1l/oxW3f8KrRu2+6twEVEH XgUZwY/Fnffa3tbMD9FxUyi3YsR/pnTIOjzDV2r+nVv1GHhVQdo35L8ALGjXL8ULuWif 9/zB9wZholFgtoz0y0a/Gvr6PeNufCl2hbV2AjTNba76UXDl6JvtnxnaiyY1fMII3hrg p+WFSQArjWE+OMUn8+WWf+4gS4HUhVx8xImigLOIHCTpbBQ30fwLc7GRA1VyeCWvB0vD 0LNeQaI9URwBWoa7ZVQPN0AWmIy170vsEAs7uzOsVdEMBL03vVUQZJkNTk1iUCw5EcYZ SyUA== X-Gm-Message-State: AO0yUKWnHav0sp7Kpbjoz+VlHQhIN+/ba7EmINsqEtAI44+mxt5K1ibA mb8UG8ExMaqKZ4rF1IJZqSqwx+xVNkm48Ugxc4iV9PnDYS49UO0mtmkkTxWXi7gQqNocV0h9TBu MqvI0RP4PG01I91uWLxrcVe7vqRo1zmWlnuIv+3I+6HxKmw9dMaikbwMfbQ6Lmamk9zft6ypFkb U= X-Received: by 2002:a5d:4a92:0:b0:2c7:1e32:f7ff with SMTP id o18-20020a5d4a92000000b002c71e32f7ffmr7285150wrq.16.1677760387794; Thu, 02 Mar 2023 04:33:07 -0800 (PST) X-Google-Smtp-Source: AK7set+PNvHzp5T/f149IzS/tyoRpsXlHo1zh2bC0pvflmX+m9h7Aj5lMi5i7w0KQEa4YI2+0HORPw== X-Received: by 2002:a5d:4a92:0:b0:2c7:1e32:f7ff with SMTP id o18-20020a5d4a92000000b002c71e32f7ffmr7285138wrq.16.1677760387557; Thu, 02 Mar 2023 04:33:07 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 53/62] hw/xen: Automatically add xen-platform PCI device for emulated Xen guests Date: Thu, 2 Mar 2023 13:30:20 +0100 Message-Id: <20230302123029.153265-54-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761755954100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse It isn't strictly mandatory but Linux guests at least will only map their grant tables over the dummy BAR that it provides, and don't have sufficient wit to map them in any other unused part of their guest address space. So include it by default for minimal surprise factor. As I come to document "how to run a Xen guest in QEMU", this means one fewer thing to tell the user about, according to the mantra of "if it needs documenting, fix it first, then document what remains". Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/pc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f4a08cc23f1f..fd17ce7a9476 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1315,6 +1315,9 @@ void pc_basic_device_init(struct PCMachineState *pcms, #ifdef CONFIG_XEN_EMU if (xen_mode =3D=3D XEN_EMULATE) { xen_evtchn_connect_gsis(gsi); + if (pcms->bus) { + pci_create_simple(pcms->bus, -1, "xen-platform"); + } } #endif =20 --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761588; cv=none; d=zohomail.com; s=zohoarc; b=J7xkwbJphx+KkK7xZ+PZlqy/wZi4doE4sNC/3dHFlRE63m5s07sotc23umcvJlG7y9Awd2qpyTZ/37R43RJ4qyC3bfeNQI0DPC+PplUUhZiIcuBS5ZPP8nhnhKexPcR865viow6N2e9HGfDtg4Wo3JDqYnppHsT2X0FT0IVFSDE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761588; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=97YjIcslPQrTGyRAk5C6su9F+2NWjsG0y279xJqV374=; b=WPWUeUHoqVfpmRtZX3t16vGNJRFa8RPkyi6IyjgGI24g0SprJG/Co+kaxttjl+DFPVziaFAlHgOl+SfYG7VUb4d5aHvSWMYx4D5cXeWnC0oTXWfm0eTyCwOqOMN1wfp+k5AXjFuapprJUUtxCAecgKuiwSuefCsjaPtohbMpKnY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761588869516.8372083741119; Thu, 2 Mar 2023 04:53:08 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiBl-0008N8-IG; Thu, 02 Mar 2023 07:37:39 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7g-0002xi-5a for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:24 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7X-0003w8-EJ for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:16 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-471-bQUnT8d0OI2Qbu4xUP8O-w-1; Thu, 02 Mar 2023 07:33:12 -0500 Received: by mail-wm1-f72.google.com with SMTP id l16-20020a05600c1d1000b003e77552705cso1014883wms.7 for ; Thu, 02 Mar 2023 04:33:12 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id iz16-20020a05600c555000b003e21638c0edsm2834132wmb.45.2023.03.02.04.33.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760393; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=97YjIcslPQrTGyRAk5C6su9F+2NWjsG0y279xJqV374=; b=SdTVb2c9QPFiVwjvseSCrvRPoHPiAKuf0Ab9PdY+hcDXN3vqqA3wrMtqIzgH0cK635v1+0 HefJk86FHJhfJhQ3K3YNuY5Wu9w7nv5O6ibAjSA48Oq7R4WjbXzKKpRCtQUd1cZJvhPUPM JsaFNDH+ctFIxPOscmYfkvHi1o2J8dU= X-MC-Unique: bQUnT8d0OI2Qbu4xUP8O-w-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=97YjIcslPQrTGyRAk5C6su9F+2NWjsG0y279xJqV374=; b=kjKy0NNDxA/zpnflqfI5tjs5PGfwBTPRooLoXwAdFPF8C9FPlWgMzkuBRhJhFXh8OO O+ehoqdQo94rrP1wj+PfQiovpoiLDk1f2lZDo1LgV4z9VhBf1fNDqDgXxFxmHSmRAEoX BjY8KMUF0PQ8rEjqv9Ye22EoJsTyfU8jL3HVDXi1BS8CYVhU0fdl7qfvlC735SfmW7ki ffO8ix6sf/eAdKgVPrFOzCTY1QjLj8dXA0cowHxNB6maiBnK8jTLrd7AFvFwfV+wttsW XCyGHC3eT4MYL5o4xFePSs+pQ9hswd7nOx0UiN/ifwYI+2joXuE8qfnCh20iLBY/HWsf ng2Q== X-Gm-Message-State: AO0yUKXWYoRJjnQdUx2cF6UuFaa9ahjM6hjI0zJPM7LZWNN0OoioUaD+ DYNMyWO+4avoqI4KwRDPZnSi0lsfs6j1q26y7VYFmp6vLpxivB5CencWtcqbTR9OVbeRiIweRHO 86Pdvxyj4WQGfiL8JLNqxcbCW3GpQQ4zZZsiCqZa3runtv/QHOfl+OMeKtse1cYOAexpZyomHOk g= X-Received: by 2002:a05:600c:492f:b0:3e2:589:2502 with SMTP id f47-20020a05600c492f00b003e205892502mr7148106wmp.28.1677760390744; Thu, 02 Mar 2023 04:33:10 -0800 (PST) X-Google-Smtp-Source: AK7set+qMouDJnNI83eYtfOt6BVy/UIX/bObDzSGDASEZARMz/JzOXYP8dBDyTfn0/uQZ0CCvvRz0A== X-Received: by 2002:a05:600c:492f:b0:3e2:589:2502 with SMTP id f47-20020a05600c492f00b003e205892502mr7148091wmp.28.1677760390445; Thu, 02 Mar 2023 04:33:10 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 54/62] i386/xen: Implement HYPERVISOR_physdev_op Date: Thu, 2 Mar 2023 13:30:21 +0100 Message-Id: <20230302123029.153265-55-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761590951100008 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Just hook up the basic hypercalls to stubs in xen_evtchn.c for now. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 25 ++++++++ hw/i386/kvm/xen_evtchn.h | 11 ++++ target/i386/kvm/xen-compat.h | 19 ++++++ target/i386/kvm/xen-emu.c | 118 +++++++++++++++++++++++++++++++++++ 4 files changed, 173 insertions(+) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index 6c396270b75d..b95ee9ba913e 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -1349,6 +1349,31 @@ int xen_evtchn_set_port(uint16_t port) return ret; } =20 +int xen_physdev_map_pirq(struct physdev_map_pirq *map) +{ + return -ENOTSUP; +} + +int xen_physdev_unmap_pirq(struct physdev_unmap_pirq *unmap) +{ + return -ENOTSUP; +} + +int xen_physdev_eoi_pirq(struct physdev_eoi *eoi) +{ + return -ENOTSUP; +} + +int xen_physdev_query_pirq(struct physdev_irq_status_query *query) +{ + return -ENOTSUP; +} + +int xen_physdev_get_free_pirq(struct physdev_get_free_pirq *get) +{ + return -ENOTSUP; +} + struct xenevtchn_handle *xen_be_evtchn_open(void) { struct xenevtchn_handle *xc =3D g_new0(struct xenevtchn_handle, 1); diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 5a71ffb75311..352c87597643 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -62,4 +62,15 @@ int xen_evtchn_bind_interdomain_op(struct evtchn_bind_in= terdomain *interdomain); int xen_evtchn_bind_vcpu_op(struct evtchn_bind_vcpu *vcpu); int xen_evtchn_reset_op(struct evtchn_reset *reset); =20 +struct physdev_map_pirq; +struct physdev_unmap_pirq; +struct physdev_eoi; +struct physdev_irq_status_query; +struct physdev_get_free_pirq; +int xen_physdev_map_pirq(struct physdev_map_pirq *map); +int xen_physdev_unmap_pirq(struct physdev_unmap_pirq *unmap); +int xen_physdev_eoi_pirq(struct physdev_eoi *eoi); +int xen_physdev_query_pirq(struct physdev_irq_status_query *query); +int xen_physdev_get_free_pirq(struct physdev_get_free_pirq *get); + #endif /* QEMU_XEN_EVTCHN_H */ diff --git a/target/i386/kvm/xen-compat.h b/target/i386/kvm/xen-compat.h index 448336de9236..7f30180cc2c5 100644 --- a/target/i386/kvm/xen-compat.h +++ b/target/i386/kvm/xen-compat.h @@ -48,4 +48,23 @@ struct compat_xen_add_to_physmap_batch { COMPAT_HANDLE(int) errs; }; =20 +struct compat_physdev_map_pirq { + domid_t domid; + uint16_t pad; + /* IN */ + int type; + /* IN (ignored for ..._MULTI_MSI) */ + int index; + /* IN or OUT */ + int pirq; + /* IN - high 16 bits hold segment for ..._MSI_SEG and ..._MULTI_MSI */ + int bus; + /* IN */ + int devfn; + /* IN (also OUT for ..._MULTI_MSI) */ + int entry_nr; + /* IN */ + uint64_t table_base; +} __attribute__((packed)); + #endif /* QEMU_I386_XEN_COMPAT_H */ diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 50965b56f3c9..fe15696cc9a9 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -1539,6 +1539,121 @@ static bool kvm_xen_hcall_gnttab_op(struct kvm_xen_= exit *exit, X86CPU *cpu, return true; } =20 +static bool kvm_xen_hcall_physdev_op(struct kvm_xen_exit *exit, X86CPU *cp= u, + int cmd, uint64_t arg) +{ + CPUState *cs =3D CPU(cpu); + int err; + + switch (cmd) { + case PHYSDEVOP_map_pirq: { + struct physdev_map_pirq map; + + if (hypercall_compat32(exit->u.hcall.longmode)) { + struct compat_physdev_map_pirq *map32 =3D (void *)↦ + + if (kvm_copy_from_gva(cs, arg, map32, sizeof(*map32))) { + return -EFAULT; + } + + /* + * The only thing that's different is the alignment of the + * uint64_t table_base at the end, which gets padding to make + * it 64-bit aligned in the 64-bit version. + */ + qemu_build_assert(sizeof(*map32) =3D=3D 36); + qemu_build_assert(offsetof(struct physdev_map_pirq, entry_nr) = =3D=3D + offsetof(struct compat_physdev_map_pirq, ent= ry_nr)); + memmove(&map.table_base, &map32->table_base, sizeof(map.table_= base)); + } else { + if (kvm_copy_from_gva(cs, arg, &map, sizeof(map))) { + err =3D -EFAULT; + break; + } + } + err =3D xen_physdev_map_pirq(&map); + /* + * Since table_base is an IN parameter and won't be changed, just + * copy the size of the compat structure back to the guest. + */ + if (!err && kvm_copy_to_gva(cs, arg, &map, + sizeof(struct compat_physdev_map_pirq)= )) { + err =3D -EFAULT; + } + break; + } + case PHYSDEVOP_unmap_pirq: { + struct physdev_unmap_pirq unmap; + + qemu_build_assert(sizeof(unmap) =3D=3D 8); + if (kvm_copy_from_gva(cs, arg, &unmap, sizeof(unmap))) { + err =3D -EFAULT; + break; + } + + err =3D xen_physdev_unmap_pirq(&unmap); + if (!err && kvm_copy_to_gva(cs, arg, &unmap, sizeof(unmap))) { + err =3D -EFAULT; + } + break; + } + case PHYSDEVOP_eoi: { + struct physdev_eoi eoi; + + qemu_build_assert(sizeof(eoi) =3D=3D 4); + if (kvm_copy_from_gva(cs, arg, &eoi, sizeof(eoi))) { + err =3D -EFAULT; + break; + } + + err =3D xen_physdev_eoi_pirq(&eoi); + if (!err && kvm_copy_to_gva(cs, arg, &eoi, sizeof(eoi))) { + err =3D -EFAULT; + } + break; + } + case PHYSDEVOP_irq_status_query: { + struct physdev_irq_status_query query; + + qemu_build_assert(sizeof(query) =3D=3D 8); + if (kvm_copy_from_gva(cs, arg, &query, sizeof(query))) { + err =3D -EFAULT; + break; + } + + err =3D xen_physdev_query_pirq(&query); + if (!err && kvm_copy_to_gva(cs, arg, &query, sizeof(query))) { + err =3D -EFAULT; + } + break; + } + case PHYSDEVOP_get_free_pirq: { + struct physdev_get_free_pirq get; + + qemu_build_assert(sizeof(get) =3D=3D 8); + if (kvm_copy_from_gva(cs, arg, &get, sizeof(get))) { + err =3D -EFAULT; + break; + } + + err =3D xen_physdev_get_free_pirq(&get); + if (!err && kvm_copy_to_gva(cs, arg, &get, sizeof(get))) { + err =3D -EFAULT; + } + break; + } + case PHYSDEVOP_pirq_eoi_gmfn_v2: /* FreeBSD 13 makes this hypercall */ + err =3D -ENOSYS; + break; + + default: + return false; + } + + exit->u.hcall.result =3D err; + return true; +} + static bool do_kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit) { uint16_t code =3D exit->u.hcall.input; @@ -1580,6 +1695,9 @@ static bool do_kvm_xen_handle_exit(X86CPU *cpu, struc= t kvm_xen_exit *exit) case __HYPERVISOR_memory_op: return kvm_xen_hcall_memory_op(exit, cpu, exit->u.hcall.params[0], exit->u.hcall.params[1]); + case __HYPERVISOR_physdev_op: + return kvm_xen_hcall_physdev_op(exit, cpu, exit->u.hcall.params[0], + exit->u.hcall.params[1]); case __HYPERVISOR_xen_version: return kvm_xen_hcall_xen_version(exit, cpu, exit->u.hcall.params[0= ], exit->u.hcall.params[1]); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761445; cv=none; d=zohomail.com; s=zohoarc; b=H6IQbFBEmpu76kxK0W+yVuavXAPoLsZOtNncnzACvcaiy8Ii+Z2uNf07TzzNtORgFvO7miKJqu/L54MhOKnyglNl7mKtDz2fmljAiBzYAP/SO+NbI11bowY7ZRJTY7x9F6bvKVgcO/kb86NmrdVHLhI8u209cmQzWxDryzsS0WY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761445; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=QCWAJ0T49dWNyWO7+WMr9s1q2xc9QgFL/z/oDKqGCuk=; b=V1J1iOfsTtFkKvHABK7eEO77BlIETVbdGljc5CBypuO81LKedLVs4XojaA7mSm2bt5NxwBpQLCEFg5AFYHDnJbwLLK4A4GoCiMZ4oEEft0ghy//74QhHwJX0TVjeGq6dZLoEAlwPm7nClTAUVBbtBWPvDiwcXW2+D6P7NG43uKQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761445671871.1038320661028; Thu, 2 Mar 2023 04:50:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiB3-0007Q5-6t; Thu, 02 Mar 2023 07:36:53 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7g-0002xk-5Z for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:24 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7Y-0003wO-U5 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:19 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-488-4WQ7GXKKOumOimdyifPr6A-1; Thu, 02 Mar 2023 07:33:15 -0500 Received: by mail-wm1-f70.google.com with SMTP id r7-20020a05600c35c700b003eb3f2c4fb4so1015642wmq.6 for ; Thu, 02 Mar 2023 04:33:15 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id u5-20020a5d6ac5000000b002c5a1bd5280sm15009860wrw.95.2023.03.02.04.33.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760396; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QCWAJ0T49dWNyWO7+WMr9s1q2xc9QgFL/z/oDKqGCuk=; b=SExeJeOXUWsgLtMB2+aTJirneTEt+SGnnebYu0eVHD/d9eHNsHL63LJTz3hnEFeX4ltJVV sjRRL1sCrnTfkMGbwGFrnSYmrCYUb037bP2oZsXns6H51KTyPA1TsEbi5w5CkBrITtbit0 7ggWopS9asVW54XWdDyxViMDMc1dXsI= X-MC-Unique: 4WQ7GXKKOumOimdyifPr6A-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QCWAJ0T49dWNyWO7+WMr9s1q2xc9QgFL/z/oDKqGCuk=; b=ovBPKBPTqqKaLbVmsVWn+dmeTZvg6/simgZQeT8loX6UYS/QodsIVTCZr9/lKZyjwv QI9T9ogOP110qFMOoSOSoiTfaECxHGDcbQs9UjfSlU49g6CX3eHGL8dyhFFFfOkE/138 bCkt/mEqN1KTYMFq7Y2guTCoiARIjToF9vJGrSp/TrdEQNUysoxDeiSuqv4K4Kf310AQ raowz/rrx9J6bVOfMQeCinLxEFC3mKLRoifun6TUgHt5sGOJGLkdjeCviECPFSdEkdKr iRzSBxI5wWGlYdfUL82UM0BmMS/C7xTJbKbvQFbxQfRH6daglfmqB566xoh2UrROaGhR FD0Q== X-Gm-Message-State: AO0yUKUkXTUtw6bcej0ng9kzqQVbzJDK2GsmIMgExf+zIT6BLUw7X5lB BhxHdkCROyB46lanz7iX0aFWdELP5EazbwzYWauAHZJy+Vzl85U/Xlchz75e7pop0jWQSzNMCtS 7opb+jYeI/IH2mleabLqcixpQJAHDa6IAkxOHBGorqbkRaqPIc3BHQBuwakEyWdnnck9H+IQGKD Q= X-Received: by 2002:a5d:4568:0:b0:2c7:7b7:eed2 with SMTP id a8-20020a5d4568000000b002c707b7eed2mr7952724wrc.69.1677760393505; Thu, 02 Mar 2023 04:33:13 -0800 (PST) X-Google-Smtp-Source: AK7set9+do3ws/IFQtRzv5Dc3mL3IKICCZgpYVJ/32JoIZ7ccz0I4OjBI8CLSSlT/wmsw1/SKLQeGw== X-Received: by 2002:a5d:4568:0:b0:2c7:7b7:eed2 with SMTP id a8-20020a5d4568000000b002c707b7eed2mr7952701wrc.69.1677760393106; Thu, 02 Mar 2023 04:33:13 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 55/62] hw/xen: Implement emulated PIRQ hypercall support Date: Thu, 2 Mar 2023 13:30:22 +0100 Message-Id: <20230302123029.153265-56-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761446801100001 From: David Woodhouse This wires up the basic infrastructure but the actual interrupts aren't there yet, so don't advertise it to the guest. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/trace-events | 4 + hw/i386/kvm/trace.h | 1 + hw/i386/kvm/xen_evtchn.c | 306 +++++++++++++++++++++++++++++++++++++- hw/i386/kvm/xen_evtchn.h | 2 + meson.build | 1 + target/i386/kvm/xen-emu.c | 15 ++ 6 files changed, 324 insertions(+), 5 deletions(-) create mode 100644 hw/i386/kvm/trace-events create mode 100644 hw/i386/kvm/trace.h diff --git a/hw/i386/kvm/trace-events b/hw/i386/kvm/trace-events new file mode 100644 index 000000000000..04e60c5bb8ac --- /dev/null +++ b/hw/i386/kvm/trace-events @@ -0,0 +1,4 @@ +kvm_xen_map_pirq(int pirq, int gsi) "pirq %d gsi %d" +kvm_xen_unmap_pirq(int pirq, int gsi) "pirq %d gsi %d" +kvm_xen_get_free_pirq(int pirq, int type) "pirq %d type %d" +kvm_xen_bind_pirq(int pirq, int port) "pirq %d port %d" diff --git a/hw/i386/kvm/trace.h b/hw/i386/kvm/trace.h new file mode 100644 index 000000000000..e55d0812fd16 --- /dev/null +++ b/hw/i386/kvm/trace.h @@ -0,0 +1 @@ +#include "trace/trace-hw_i386_kvm.h" diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index b95ee9ba913e..59eea63272d0 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -24,6 +24,7 @@ #include "exec/target_page.h" #include "exec/address-spaces.h" #include "migration/vmstate.h" +#include "trace.h" =20 #include "hw/sysbus.h" #include "hw/xen/xen.h" @@ -105,6 +106,21 @@ struct xenevtchn_handle { #define PORT_INFO_TYPEVAL_REMOTE_QEMU 0x8000 #define PORT_INFO_TYPEVAL_REMOTE_PORT_MASK 0x7FFF =20 +/* + * These 'emuirq' values are used by Xen in the LM stream... and yes, I am + * insane enough to think about guest-transparent live migration from actu= al + * Xen to QEMU, and ensuring that we can convert/consume the stream. + */ +#define IRQ_UNBOUND -1 +#define IRQ_PT -2 +#define IRQ_MSI_EMU -3 + + +struct pirq_info { + int gsi; + uint16_t port; +}; + struct XenEvtchnState { /*< private >*/ SysBusDevice busdev; @@ -122,8 +138,25 @@ struct XenEvtchnState { qemu_irq gsis[IOAPIC_NUM_PINS]; =20 struct xenevtchn_handle *be_handles[EVTCHN_2L_NR_CHANNELS]; + + uint32_t nr_pirqs; + + /* Bitmap of allocated PIRQs (serialized) */ + uint16_t nr_pirq_inuse_words; + uint64_t *pirq_inuse_bitmap; + + /* GSI =E2=86=92 PIRQ mapping (serialized) */ + uint16_t gsi_pirq[IOAPIC_NUM_PINS]; + + /* Per-PIRQ information (rebuilt on migration) */ + struct pirq_info *pirq; }; =20 +#define pirq_inuse_word(s, pirq) (s->pirq_inuse_bitmap[((pirq) / 64)]) +#define pirq_inuse_bit(pirq) (1ULL << ((pirq) & 63)) + +#define pirq_inuse(s, pirq) (pirq_inuse_word(s, pirq) & pirq_inuse_bit(pir= q)) + struct XenEvtchnState *xen_evtchn_singleton; =20 /* Top bits of callback_param are the type (HVM_PARAM_CALLBACK_TYPE_xxx) */ @@ -138,17 +171,45 @@ static int xen_evtchn_pre_load(void *opaque) /* Unbind all the backend-side ports; they need to rebind */ unbind_backend_ports(s); =20 + /* It'll be leaked otherwise. */ + g_free(s->pirq_inuse_bitmap); + s->pirq_inuse_bitmap =3D NULL; + return 0; } =20 static int xen_evtchn_post_load(void *opaque, int version_id) { XenEvtchnState *s =3D opaque; + uint32_t i; =20 if (s->callback_param) { xen_evtchn_set_callback_param(s->callback_param); } =20 + /* Rebuild s->pirq[].port mapping */ + for (i =3D 0; i < s->nr_ports; i++) { + XenEvtchnPort *p =3D &s->port_table[i]; + + if (p->type =3D=3D EVTCHNSTAT_pirq) { + assert(p->type_val); + assert(p->type_val < s->nr_pirqs); + + /* + * Set the gsi to IRQ_UNBOUND; it may be changed to an actual + * GSI# below, or to IRQ_MSI_EMU when the MSI table snooping + * catches up with it. + */ + s->pirq[p->type_val].gsi =3D IRQ_UNBOUND; + s->pirq[p->type_val].port =3D i; + } + } + /* Rebuild s->pirq[].gsi mapping */ + for (i =3D 0; i < IOAPIC_NUM_PINS; i++) { + if (s->gsi_pirq[i]) { + s->pirq[s->gsi_pirq[i]].gsi =3D i; + } + } return 0; } =20 @@ -181,6 +242,10 @@ static const VMStateDescription xen_evtchn_vmstate =3D= { VMSTATE_UINT32(nr_ports, XenEvtchnState), VMSTATE_STRUCT_VARRAY_UINT32(port_table, XenEvtchnState, nr_ports,= 1, xen_evtchn_port_vmstate, XenEvtchnPor= t), + VMSTATE_UINT16_ARRAY(gsi_pirq, XenEvtchnState, IOAPIC_NUM_PINS), + VMSTATE_VARRAY_UINT16_ALLOC(pirq_inuse_bitmap, XenEvtchnState, + nr_pirq_inuse_words, 0, + vmstate_info_uint64, uint64_t), VMSTATE_END_OF_LIST() } }; @@ -221,6 +286,23 @@ void xen_evtchn_create(void) for (i =3D 0; i < IOAPIC_NUM_PINS; i++) { sysbus_init_irq(SYS_BUS_DEVICE(s), &s->gsis[i]); } + + /* + * We could parameterise the number of PIRQs available if needed, + * but for now limit it to 256. The Xen scheme for encoding PIRQ# + * into an MSI message is not compatible with 32-bit MSI, as it + * puts the high bits of the PIRQ# into the high bits of the MSI + * message address, instead of using the Extended Destination ID + * in address bits 4-11 which perhaps would have been a better + * choice. So to keep life simple, just stick with 256 as the + * default, which conveniently doesn't need to set anything + * outside the low 32 bits of the address. + */ + s->nr_pirqs =3D 256; + + s->nr_pirq_inuse_words =3D DIV_ROUND_UP(s->nr_pirqs, 64); + s->pirq_inuse_bitmap =3D g_new0(uint64_t, s->nr_pirq_inuse_words); + s->pirq =3D g_new0(struct pirq_info, s->nr_pirqs); } =20 void xen_evtchn_connect_gsis(qemu_irq *system_gsis) @@ -929,6 +1011,10 @@ static int close_port(XenEvtchnState *s, evtchn_port_= t port) case EVTCHNSTAT_closed: return -ENOENT; =20 + case EVTCHNSTAT_pirq: + s->pirq[p->type_val].port =3D 0; + break; + case EVTCHNSTAT_virq: kvm_xen_set_vcpu_virq(virq_is_global(p->type_val) ? 0 : p->vcpu, p->type_val, 0); @@ -1123,6 +1209,37 @@ int xen_evtchn_bind_virq_op(struct evtchn_bind_virq = *virq) return ret; } =20 +int xen_evtchn_bind_pirq_op(struct evtchn_bind_pirq *pirq) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int ret; + + if (!s) { + return -ENOTSUP; + } + + if (pirq->pirq >=3D s->nr_pirqs) { + return -EINVAL; + } + + QEMU_LOCK_GUARD(&s->port_lock); + + if (s->pirq[pirq->pirq].port) { + return -EBUSY; + } + + ret =3D allocate_port(s, 0, EVTCHNSTAT_pirq, pirq->pirq, + &pirq->port); + if (ret) { + return ret; + } + + s->pirq[pirq->pirq].port =3D pirq->port; + trace_kvm_xen_bind_pirq(pirq->pirq, pirq->port); + + return ret; +} + int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi) { XenEvtchnState *s =3D xen_evtchn_singleton; @@ -1349,29 +1466,208 @@ int xen_evtchn_set_port(uint16_t port) return ret; } =20 +static int allocate_pirq(XenEvtchnState *s, int type, int gsi) +{ + uint16_t pirq; + + /* + * Preserve the allocation strategy that Xen has. It looks like + * we *never* give out PIRQ 0-15, we give out 16-nr_irqs_gsi only + * to GSIs (counting up from 16), and then we count backwards from + * the top for MSIs or when the GSI space is exhausted. + */ + if (type =3D=3D MAP_PIRQ_TYPE_GSI) { + for (pirq =3D 16 ; pirq < IOAPIC_NUM_PINS; pirq++) { + if (pirq_inuse(s, pirq)) { + continue; + } + + /* Found it */ + goto found; + } + } + for (pirq =3D s->nr_pirqs - 1; pirq >=3D IOAPIC_NUM_PINS; pirq--) { + /* Skip whole words at a time when they're full */ + if (pirq_inuse_word(s, pirq) =3D=3D UINT64_MAX) { + pirq &=3D ~63ULL; + continue; + } + if (pirq_inuse(s, pirq)) { + continue; + } + + goto found; + } + return -ENOSPC; + + found: + pirq_inuse_word(s, pirq) |=3D pirq_inuse_bit(pirq); + if (gsi >=3D 0) { + assert(gsi <=3D IOAPIC_NUM_PINS); + s->gsi_pirq[gsi] =3D pirq; + } + s->pirq[pirq].gsi =3D gsi; + return pirq; +} + int xen_physdev_map_pirq(struct physdev_map_pirq *map) { - return -ENOTSUP; + XenEvtchnState *s =3D xen_evtchn_singleton; + int pirq =3D map->pirq; + int gsi =3D map->index; + + if (!s) { + return -ENOTSUP; + } + + QEMU_LOCK_GUARD(&s->port_lock); + + if (map->domid !=3D DOMID_SELF && map->domid !=3D xen_domid) { + return -EPERM; + } + if (map->type !=3D MAP_PIRQ_TYPE_GSI) { + return -EINVAL; + } + if (gsi < 0 || gsi >=3D IOAPIC_NUM_PINS) { + return -EINVAL; + } + + if (pirq < 0) { + pirq =3D allocate_pirq(s, map->type, gsi); + if (pirq < 0) { + return pirq; + } + map->pirq =3D pirq; + } else if (pirq > s->nr_pirqs) { + return -EINVAL; + } else { + /* + * User specified a valid-looking PIRQ#. Allow it if it is + * allocated and not yet bound, or if it is unallocated + */ + if (pirq_inuse(s, pirq)) { + if (s->pirq[pirq].gsi !=3D IRQ_UNBOUND) { + return -EBUSY; + } + } else { + /* If it was unused, mark it used now. */ + pirq_inuse_word(s, pirq) |=3D pirq_inuse_bit(pirq); + } + /* Set the mapping in both directions. */ + s->pirq[pirq].gsi =3D gsi; + s->gsi_pirq[gsi] =3D pirq; + } + + trace_kvm_xen_map_pirq(pirq, gsi); + return 0; } =20 int xen_physdev_unmap_pirq(struct physdev_unmap_pirq *unmap) { - return -ENOTSUP; + XenEvtchnState *s =3D xen_evtchn_singleton; + int pirq =3D unmap->pirq; + int gsi; + + if (!s) { + return -ENOTSUP; + } + + if (unmap->domid !=3D DOMID_SELF && unmap->domid !=3D xen_domid) { + return -EPERM; + } + if (pirq < 0 || pirq >=3D s->nr_pirqs) { + return -EINVAL; + } + + QEMU_LOCK_GUARD(&s->port_lock); + + if (!pirq_inuse(s, pirq)) { + return -ENOENT; + } + + gsi =3D s->pirq[pirq].gsi; + + /* We can only unmap GSI PIRQs */ + if (gsi < 0) { + return -EINVAL; + } + + s->gsi_pirq[gsi] =3D 0; + s->pirq[pirq].gsi =3D IRQ_UNBOUND; /* Doesn't actually matter because:= */ + pirq_inuse_word(s, pirq) &=3D ~pirq_inuse_bit(pirq); + + trace_kvm_xen_unmap_pirq(pirq, gsi); + return 0; } =20 int xen_physdev_eoi_pirq(struct physdev_eoi *eoi) { - return -ENOTSUP; + XenEvtchnState *s =3D xen_evtchn_singleton; + int pirq =3D eoi->irq; + int gsi; + + if (!s) { + return -ENOTSUP; + } + + QEMU_LOCK_GUARD(&s->port_lock); + + if (!pirq_inuse(s, pirq)) { + return -ENOENT; + } + + gsi =3D s->pirq[pirq].gsi; + if (gsi < 0) { + return -EINVAL; + } + + /* XX: Reassert a level IRQ if needed */ + return 0; } =20 int xen_physdev_query_pirq(struct physdev_irq_status_query *query) { - return -ENOTSUP; + XenEvtchnState *s =3D xen_evtchn_singleton; + int pirq =3D query->irq; + + if (!s) { + return -ENOTSUP; + } + + QEMU_LOCK_GUARD(&s->port_lock); + + if (!pirq_inuse(s, pirq)) { + return -ENOENT; + } + + if (s->pirq[pirq].gsi >=3D 0) { + query->flags =3D XENIRQSTAT_needs_eoi; + } else { + query->flags =3D 0; + } + + return 0; } =20 int xen_physdev_get_free_pirq(struct physdev_get_free_pirq *get) { - return -ENOTSUP; + XenEvtchnState *s =3D xen_evtchn_singleton; + int pirq; + + if (!s) { + return -ENOTSUP; + } + + QEMU_LOCK_GUARD(&s->port_lock); + + pirq =3D allocate_pirq(s, get->type, IRQ_UNBOUND); + if (pirq < 0) { + return pirq; + } + + get->pirq =3D pirq; + trace_kvm_xen_get_free_pirq(pirq, get->type); + return 0; } =20 struct xenevtchn_handle *xen_be_evtchn_open(void) diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 352c87597643..a7383f760ce2 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -45,6 +45,7 @@ struct evtchn_status; struct evtchn_close; struct evtchn_unmask; struct evtchn_bind_virq; +struct evtchn_bind_pirq; struct evtchn_bind_ipi; struct evtchn_send; struct evtchn_alloc_unbound; @@ -55,6 +56,7 @@ int xen_evtchn_status_op(struct evtchn_status *status); int xen_evtchn_close_op(struct evtchn_close *close); int xen_evtchn_unmask_op(struct evtchn_unmask *unmask); int xen_evtchn_bind_virq_op(struct evtchn_bind_virq *virq); +int xen_evtchn_bind_pirq_op(struct evtchn_bind_pirq *pirq); int xen_evtchn_bind_ipi_op(struct evtchn_bind_ipi *ipi); int xen_evtchn_send_op(struct evtchn_send *send); int xen_evtchn_alloc_unbound_op(struct evtchn_alloc_unbound *alloc); diff --git a/meson.build b/meson.build index 71a14e6b3da1..e533d6c95bbb 100644 --- a/meson.build +++ b/meson.build @@ -2982,6 +2982,7 @@ if have_system 'hw/i2c', 'hw/i386', 'hw/i386/xen', + 'hw/i386/kvm', 'hw/ide', 'hw/input', 'hw/intc', diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index fe15696cc9a9..0e81e5b6b199 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -1267,6 +1267,21 @@ static bool kvm_xen_hcall_evtchn_op(struct kvm_xen_e= xit *exit, X86CPU *cpu, } break; } + case EVTCHNOP_bind_pirq: { + struct evtchn_bind_pirq pirq; + + qemu_build_assert(sizeof(pirq) =3D=3D 12); + if (kvm_copy_from_gva(cs, arg, &pirq, sizeof(pirq))) { + err =3D -EFAULT; + break; + } + + err =3D xen_evtchn_bind_pirq_op(&pirq); + if (!err && kvm_copy_to_gva(cs, arg, &pirq, sizeof(pirq))) { + err =3D -EFAULT; + } + break; + } case EVTCHNOP_bind_ipi: { struct evtchn_bind_ipi ipi; =20 --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761438; cv=none; d=zohomail.com; s=zohoarc; b=ZqQH2R/an2Z+PNlmZPqaEUcrn8/9GRoegP5O3tS+xJtVNbA69S0JoyAOPVyqixU3s2ZlG46FD2Hi/6kb6bEX+qGLd4+KS7sLRa3ZCob+1IzMSm9IB7FicYANPB0k/O8QnK2FrIGgWqOgFDs5KN4X7DszzYEH44MEdlEYrzr9xy8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761438; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=LZLlEd2q5zhkTUrx+6jWfzGCwgP+RoKhMJpO5woz8R0=; b=Z47HUcernhjvpEqSCbMZTwo7SmncTPUFgRPk6egPviQRpJu0I9FZuKwvVbnDATRMx5sYBEr8XL29q/C2rQ9fDCZMT4YS5Cc0AhoPRCAt/j7B074ajyVoymtkVchfqFYY8wW7geD9tNc1ERbyCTyP+8pYP+1oh4vkZBv00mANMog= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761438176396.82454046947885; Thu, 2 Mar 2023 04:50:38 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiAe-0006tc-AF; Thu, 02 Mar 2023 07:36:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7g-0002xm-5c for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:24 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7b-0003wn-Mw for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:21 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-327-JYdkAySTPbe8C4xuQW6iug-1; Thu, 02 Mar 2023 07:33:18 -0500 Received: by mail-wr1-f69.google.com with SMTP id x3-20020a5d6503000000b002c8c421fdfaso3189532wru.15 for ; Thu, 02 Mar 2023 04:33:17 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id w23-20020a1cf617000000b003e71a6be279sm2808460wmc.37.2023.03.02.04.33.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760399; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LZLlEd2q5zhkTUrx+6jWfzGCwgP+RoKhMJpO5woz8R0=; b=iw5+1TR0YjNPCyK478aqN9FamFJLYeoUvQm8dILbYIQVBam6NBfRZY2U3h+lBV8LrglONy BKRfz5/Hf3zI7O4Zv/xIuHVU6qATPS2p3YynWriMU/7ONIJKPVcBY03lQnelU11uvn5vRY 2lEZdMnu4ckuK3fWwR6cs7gzs2T8j0o= X-MC-Unique: JYdkAySTPbe8C4xuQW6iug-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LZLlEd2q5zhkTUrx+6jWfzGCwgP+RoKhMJpO5woz8R0=; b=RY/K6oAXGaaVdLQ1ZEfujgVod+ZIkk1Gtbsk/JeGFgOzC2mFahToozTi3crLAbCU7H ws7V6UCLheIQbNoWfbTzGR4kEUDnve39apc9HtnsQXWnHTPvdnqTjwnQJkcpWPIRZlpx HnzhR6wQF4iEtedX5Bxp9AtTbYDJ4T1YW7O5MQuMhgxjfZEy4UB4AxMwEzAN7yD5tIzo KveiIzWFZpO9Xz9F/PzIGfEvL2p/kwfmHVR+LhvtWqgBQq3pxKd/5clFhQxhQrsDB5nF ImjAIbEH/DZ3xK+ACjmcQ1eGmagN+/fwa0LoSeH6umGlAAe9EqCwK446i3EBepAP8mnm iMpA== X-Gm-Message-State: AO0yUKUXcVAnTUhg0YO9M4Nc4P04YpecCW7cExeIp/h++c1f6N0z9DUm KpkKYPLDIX6C4fQabZcPp0cuUHGea2nqYkgKdgnrFMEGZKMTf/yyo1C+5bx8JjlbHoA0KX/mK10 TGe0SnpQUO6wEBpH5odZ3NwygPF6vKNnwWxqd7NsyRduROrMtvAEnQlx/Y1NnLpiN5nyYCsjTVP E= X-Received: by 2002:a05:600c:1715:b0:3ea:bc08:b63e with SMTP id c21-20020a05600c171500b003eabc08b63emr7953384wmn.2.1677760396519; Thu, 02 Mar 2023 04:33:16 -0800 (PST) X-Google-Smtp-Source: AK7set+Z4Yx/ntjZl6wjD8Um2D52+jVyq7tLU7KtxSnBxHL1qnrjIBf2aPl7bsAfi4U9h2IHxeTDrw== X-Received: by 2002:a05:600c:1715:b0:3ea:bc08:b63e with SMTP id c21-20020a05600c171500b003eabc08b63emr7953366wmn.2.1677760396080; Thu, 02 Mar 2023 04:33:16 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 56/62] hw/xen: Support GSI mapping to PIRQ Date: Thu, 2 Mar 2023 13:30:23 +0100 Message-Id: <20230302123029.153265-57-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761438695100001 From: David Woodhouse If I advertise XENFEAT_hvm_pirqs then a guest now boots successfully as long as I tell it 'pci=3Dnomsi'. [root@localhost ~]# cat /proc/interrupts CPU0 0: 52 IO-APIC 2-edge timer 1: 16 xen-pirq 1-ioapic-edge i8042 4: 1534 xen-pirq 4-ioapic-edge ttyS0 8: 1 xen-pirq 8-ioapic-edge rtc0 9: 0 xen-pirq 9-ioapic-level acpi 11: 5648 xen-pirq 11-ioapic-level ahci[0000:00:04.0] 12: 257 xen-pirq 12-ioapic-edge i8042 ... Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/xen_evtchn.c | 58 +++++++++++++++++++++++++++++++++++++++- hw/i386/kvm/xen_evtchn.h | 2 ++ hw/i386/x86.c | 16 +++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index 59eea63272d0..f2c4b4387194 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -148,6 +148,9 @@ struct XenEvtchnState { /* GSI =E2=86=92 PIRQ mapping (serialized) */ uint16_t gsi_pirq[IOAPIC_NUM_PINS]; =20 + /* Per-GSI assertion state (serialized) */ + uint32_t pirq_gsi_set; + /* Per-PIRQ information (rebuilt on migration) */ struct pirq_info *pirq; }; @@ -246,6 +249,7 @@ static const VMStateDescription xen_evtchn_vmstate =3D { VMSTATE_VARRAY_UINT16_ALLOC(pirq_inuse_bitmap, XenEvtchnState, nr_pirq_inuse_words, 0, vmstate_info_uint64, uint64_t), + VMSTATE_UINT32(pirq_gsi_set, XenEvtchnState), VMSTATE_END_OF_LIST() } }; @@ -1510,6 +1514,51 @@ static int allocate_pirq(XenEvtchnState *s, int type= , int gsi) return pirq; } =20 +bool xen_evtchn_set_gsi(int gsi, int level) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + int pirq; + + assert(qemu_mutex_iothread_locked()); + + if (!s || gsi < 0 || gsi > IOAPIC_NUM_PINS) { + return false; + } + + /* + * Check that that it *isn't* the event channel GSI, and thus + * that we are not recursing and it's safe to take s->port_lock. + * + * Locking aside, it's perfectly sane to bail out early for that + * special case, as it would make no sense for the event channel + * GSI to be routed back to event channels, when the delivery + * method is to raise the GSI... that recursion wouldn't *just* + * be a locking issue. + */ + if (gsi && gsi =3D=3D s->callback_gsi) { + return false; + } + + QEMU_LOCK_GUARD(&s->port_lock); + + pirq =3D s->gsi_pirq[gsi]; + if (!pirq) { + return false; + } + + if (level) { + int port =3D s->pirq[pirq].port; + + s->pirq_gsi_set |=3D (1U << gsi); + if (port) { + set_port_pending(s, port); + } + } else { + s->pirq_gsi_set &=3D ~(1U << gsi); + } + return true; +} + int xen_physdev_map_pirq(struct physdev_map_pirq *map) { XenEvtchnState *s =3D xen_evtchn_singleton; @@ -1621,7 +1670,14 @@ int xen_physdev_eoi_pirq(struct physdev_eoi *eoi) return -EINVAL; } =20 - /* XX: Reassert a level IRQ if needed */ + /* Reassert a level IRQ if needed */ + if (s->pirq_gsi_set & (1U << gsi)) { + int port =3D s->pirq[pirq].port; + if (port) { + set_port_pending(s, port); + } + } + return 0; } =20 diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index a7383f760ce2..95400b7fbf7d 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -24,6 +24,8 @@ void xen_evtchn_set_callback_level(int level); =20 int xen_evtchn_set_port(uint16_t port); =20 +bool xen_evtchn_set_gsi(int gsi, int level); + /* * These functions mirror the libxenevtchn library API, providing the QEMU * backend side of "interdomain" event channels. diff --git a/hw/i386/x86.c b/hw/i386/x86.c index c44846f47b5f..a56b10b2fb1c 100644 --- a/hw/i386/x86.c +++ b/hw/i386/x86.c @@ -61,6 +61,11 @@ #include CONFIG_DEVICES #include "kvm/kvm_i386.h" =20 +#ifdef CONFIG_XEN_EMU +#include "hw/xen/xen.h" +#include "hw/i386/kvm/xen_evtchn.h" +#endif + /* Physical Address of PVH entry point read from kernel ELF NOTE */ static size_t pvh_start_addr; =20 @@ -610,6 +615,17 @@ void gsi_handler(void *opaque, int n, int level) } /* fall through */ case ISA_NUM_IRQS ... IOAPIC_NUM_PINS - 1: +#ifdef CONFIG_XEN_EMU + /* + * Xen delivers the GSI to the Legacy PIC (not that Legacy PIC + * routing actually works properly under Xen). And then to + * *either* the PIRQ handling or the I/OAPIC depending on + * whether the former wants it. + */ + if (xen_mode =3D=3D XEN_EMULATE && xen_evtchn_set_gsi(n, level)) { + break; + } +#endif qemu_set_irq(s->ioapic_irq[n], level); break; case IO_APIC_SECONDARY_IRQBASE --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677760678; cv=none; d=zohomail.com; s=zohoarc; b=RoNbOxcloieZUXKrCy4+1bLcjJ22Km9IwFM5E6I500oAIwpt8VkzCoWWmb1TTPmgtvj7PQRA5pLeK2Gur6+pLJtLcv3v1SkCOB7o2tLDTvc2iG0AC6eStEqraCn3tQXaIc1pWl4S+1EPyPNntF1x9Wcx123QidXQWDSFwzf+FQQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677760678; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Joax0EPGUGtD6d/rljSThDclm8LAtlA/aB5HEFCrbbU=; b=KOjXdo5826iRkjkTFEQrtNqm+5IKODZ0rxeRcBMfRKNcgwOtJkUcDZ/H1veb93o3N1vz7VGMZ2nwVc280KASCCji9zg6K1mHezF98yjvMyGBlw3NyFI0fu3iwAS/4Dgd58uIJJyLYLZtSs1pXz0gTgxdUjqLqAi9/wMsjN3ECOk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16777606789551009.4414248096211; Thu, 2 Mar 2023 04:37:58 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiB1-0007Ji-E9; Thu, 02 Mar 2023 07:36:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi87-0003DE-P0 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:51 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7f-0003xc-Hn for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:26 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-567-BLVv4aLIP3eENC3SmH7rug-1; Thu, 02 Mar 2023 07:33:21 -0500 Received: by mail-wm1-f72.google.com with SMTP id c7-20020a7bc847000000b003e00be23a70so1208350wml.2 for ; Thu, 02 Mar 2023 04:33:21 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id r8-20020a05600c458800b003df5be8987esm3018428wmo.20.2023.03.02.04.33.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760402; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Joax0EPGUGtD6d/rljSThDclm8LAtlA/aB5HEFCrbbU=; b=bNVljwVdXB+knYvE5KgofI/QeiTKHQCvvP72ri35IXf7EWpc+h8vmXJublR84U3NslU7/E yaP8IVhQBJshuZdTLSKGQsB9a9ttFiFcgV3CcYWB2tlM1j2zMzonQwx3z+2tYBRc1z1Squ uGkp94k/7uQT3hl+NmMEBs5paRwRdG4= X-MC-Unique: BLVv4aLIP3eENC3SmH7rug-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Joax0EPGUGtD6d/rljSThDclm8LAtlA/aB5HEFCrbbU=; b=7MhKCGS88oHWgxxdcUsD+wfssPLXxE7kHLrz5Prl7rlc1NRLtEdVsqF9as/FHAOKx5 uFDBSdSR6XOHnkVTOXRdBg4VnDAiYJIDCrq8lUEoXgPdjlomIB6D3THO4VuNHBzeRSKn JjzosLOHJRahVYOUsh/jlGe8ynZJKFsrNmNwILgyszZo5NCduF1vKSgXp2gWP8A2jCVy Zuki7MMg/+C3f0m/HL3n0mdyCquBjaVgxTKDws+1AlHYS5JCwW75AKWL8kocDvixdd3o mRNM9uaGsxIR/JKC9gqpPiC0FSZNbJPhRG9MZRBlgmBGJnyncuSu2PTfVTBq8u4EwHHf TeKw== X-Gm-Message-State: AO0yUKUGyhfeiEE+47Epds/MlP0ecP1lFffp3/1nfYGB9YoPV6U1XHa+ MMExWhA7R/PhaRibAy/LmJ6t7s/aCDOS+fqhXyCy3J2vOyftbwTyJgqiY2aZfA+vcskLs9sWZ+o WdWJM2p4eqzmOBHuNlxidhtLWEE6prw1DaA7zkHYvGKRUJHTBQY4O93pDaj4x2ogAQkJDoVDiaD o= X-Received: by 2002:a05:600c:1c25:b0:3ea:f132:63d8 with SMTP id j37-20020a05600c1c2500b003eaf13263d8mr7477465wms.5.1677760399719; Thu, 02 Mar 2023 04:33:19 -0800 (PST) X-Google-Smtp-Source: AK7set9PBZr7N6D/htoBJVlBGZ7zkDT9hx+XMEpmeiu4eAkdXjxD2RRUvPMK0uRea44AlQGDvrLgDw== X-Received: by 2002:a05:600c:1c25:b0:3ea:f132:63d8 with SMTP id j37-20020a05600c1c2500b003eaf13263d8mr7477446wms.5.1677760399210; Thu, 02 Mar 2023 04:33:19 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 57/62] hw/xen: Support MSI mapping to PIRQ Date: Thu, 2 Mar 2023 13:30:24 +0100 Message-Id: <20230302123029.153265-58-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677760680330100003 From: David Woodhouse The way that Xen handles MSI PIRQs is kind of awful. There is a special MSI message which targets a PIRQ. The vector in the low bits of data must be zero. The low 8 bits of the PIRQ# are in the destination ID field, the extended destination ID field is unused, and instead the high bits of the PIRQ# are in the high 32 bits of the address. Using the high bits of the address means that we can't intercept and translate these messages in kvm_send_msi(), because they won't be caught by the APIC =E2=80=94 addresses like 0x1000fee46000 aren't in the APIC's ra= nge. So we catch them in pci_msi_trigger() instead, and deliver the event channel directly. That isn't even the worst part. The worst part is that Xen snoops on writes to devices' MSI vectors while they are *masked*. When a MSI message is written which looks like it targets a PIRQ, it remembers the device and vector for later. When the guest makes a hypercall to bind that PIRQ# (snooped from a marked MSI vector) to an event channel port, Xen *unmasks* that MSI vector on the device. Xen guests using PIRQ delivery of MSI don't ever actually unmask the MSI for themselves. Now that this is working we can finally enable XENFEAT_hvm_pirqs and let the guest use it all. Tested with passthrough igb and emulated e1000e + AHCI. CPU0 CPU1 0: 65 0 IO-APIC 2-edge timer 1: 0 14 xen-pirq 1-ioapic-edge i8042 4: 0 846 xen-pirq 4-ioapic-edge ttyS0 8: 1 0 xen-pirq 8-ioapic-edge rtc0 9: 0 0 xen-pirq 9-ioapic-level acpi 12: 257 0 xen-pirq 12-ioapic-edge i8042 24: 9600 0 xen-percpu -virq timer0 25: 2758 0 xen-percpu -ipi resched0 26: 0 0 xen-percpu -ipi callfunc0 27: 0 0 xen-percpu -virq debug0 28: 1526 0 xen-percpu -ipi callfuncsingle0 29: 0 0 xen-percpu -ipi spinlock0 30: 0 8608 xen-percpu -virq timer1 31: 0 874 xen-percpu -ipi resched1 32: 0 0 xen-percpu -ipi callfunc1 33: 0 0 xen-percpu -virq debug1 34: 0 1617 xen-percpu -ipi callfuncsingle1 35: 0 0 xen-percpu -ipi spinlock1 36: 8 0 xen-dyn -event xenbus 37: 0 6046 xen-pirq -msi ahci[0000:00:03.0] 38: 1 0 xen-pirq -msi-x ens4 39: 0 73 xen-pirq -msi-x ens4-rx-0 40: 14 0 xen-pirq -msi-x ens4-rx-1 41: 0 32 xen-pirq -msi-x ens4-tx-0 42: 47 0 xen-pirq -msi-x ens4-tx-1 Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/kvm/trace-events | 1 + hw/i386/kvm/xen-stubs.c | 16 +++ hw/i386/kvm/xen_evtchn.c | 262 ++++++++++++++++++++++++++++++++++++- hw/i386/kvm/xen_evtchn.h | 8 ++ hw/pci/msi.c | 11 ++ hw/pci/msix.c | 9 ++ hw/pci/pci.c | 17 +++ include/hw/pci/msi.h | 1 + target/i386/kvm/kvm.c | 19 ++- target/i386/kvm/kvm_i386.h | 2 + target/i386/kvm/xen-emu.c | 3 +- 11 files changed, 339 insertions(+), 10 deletions(-) diff --git a/hw/i386/kvm/trace-events b/hw/i386/kvm/trace-events index 04e60c5bb8ac..b83c3eb9656c 100644 --- a/hw/i386/kvm/trace-events +++ b/hw/i386/kvm/trace-events @@ -2,3 +2,4 @@ kvm_xen_map_pirq(int pirq, int gsi) "pirq %d gsi %d" kvm_xen_unmap_pirq(int pirq, int gsi) "pirq %d gsi %d" kvm_xen_get_free_pirq(int pirq, int type) "pirq %d type %d" kvm_xen_bind_pirq(int pirq, int port) "pirq %d port %d" +kvm_xen_unmask_pirq(int pirq, char *dev, int vector) "pirq %d dev %s vecto= r %d" diff --git a/hw/i386/kvm/xen-stubs.c b/hw/i386/kvm/xen-stubs.c index 720590aedddf..ae406e0b02f9 100644 --- a/hw/i386/kvm/xen-stubs.c +++ b/hw/i386/kvm/xen-stubs.c @@ -14,6 +14,22 @@ #include "qapi/error.h" #include "qapi/qapi-commands-misc-target.h" =20 +#include "xen_evtchn.h" + +void xen_evtchn_snoop_msi(PCIDevice *dev, bool is_msix, unsigned int vecto= r, + uint64_t addr, uint32_t data, bool is_masked) +{ +} + +void xen_evtchn_remove_pci_device(PCIDevice *dev) +{ +} + +bool xen_evtchn_deliver_pirq_msi(uint64_t address, uint32_t data) +{ + return false; +} + #ifdef TARGET_I386 EvtchnInfoList *qmp_xen_event_list(Error **errp) { diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index f2c4b4387194..69c0204d4f0c 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -31,6 +31,8 @@ #include "hw/i386/x86.h" #include "hw/i386/pc.h" #include "hw/pci/pci.h" +#include "hw/pci/msi.h" +#include "hw/pci/msix.h" #include "hw/irq.h" =20 #include "xen_evtchn.h" @@ -45,6 +47,9 @@ #include "hw/xen/interface/memory.h" #include "hw/xen/interface/hvm/params.h" =20 +/* XX: For kvm_update_msi_routes_all() */ +#include "target/i386/kvm/kvm_i386.h" + #define TYPE_XEN_EVTCHN "xen-evtchn" OBJECT_DECLARE_SIMPLE_TYPE(XenEvtchnState, XEN_EVTCHN) =20 @@ -119,6 +124,11 @@ struct xenevtchn_handle { struct pirq_info { int gsi; uint16_t port; + PCIDevice *dev; + int vector; + bool is_msix; + bool is_masked; + bool is_translated; }; =20 struct XenEvtchnState { @@ -151,7 +161,7 @@ struct XenEvtchnState { /* Per-GSI assertion state (serialized) */ uint32_t pirq_gsi_set; =20 - /* Per-PIRQ information (rebuilt on migration) */ + /* Per-PIRQ information (rebuilt on migration, protected by BQL) */ struct pirq_info *pirq; }; =20 @@ -1007,16 +1017,23 @@ static bool virq_is_global(uint32_t virq) } } =20 -static int close_port(XenEvtchnState *s, evtchn_port_t port) +static int close_port(XenEvtchnState *s, evtchn_port_t port, + bool *flush_kvm_routes) { XenEvtchnPort *p =3D &s->port_table[port]; =20 + /* Because it *might* be a PIRQ port */ + assert(qemu_mutex_iothread_locked()); + switch (p->type) { case EVTCHNSTAT_closed: return -ENOENT; =20 case EVTCHNSTAT_pirq: s->pirq[p->type_val].port =3D 0; + if (s->pirq[p->type_val].is_translated) { + *flush_kvm_routes =3D true; + } break; =20 case EVTCHNSTAT_virq: @@ -1065,6 +1082,7 @@ static int close_port(XenEvtchnState *s, evtchn_port_= t port) int xen_evtchn_soft_reset(void) { XenEvtchnState *s =3D xen_evtchn_singleton; + bool flush_kvm_routes; int i; =20 if (!s) { @@ -1073,10 +1091,16 @@ int xen_evtchn_soft_reset(void) =20 assert(qemu_mutex_iothread_locked()); =20 - QEMU_LOCK_GUARD(&s->port_lock); + qemu_mutex_lock(&s->port_lock); =20 for (i =3D 0; i < s->nr_ports; i++) { - close_port(s, i); + close_port(s, i, &flush_kvm_routes); + } + + qemu_mutex_unlock(&s->port_lock); + + if (flush_kvm_routes) { + kvm_update_msi_routes_all(NULL, true, 0, 0); } =20 return 0; @@ -1094,6 +1118,7 @@ int xen_evtchn_reset_op(struct evtchn_reset *reset) int xen_evtchn_close_op(struct evtchn_close *close) { XenEvtchnState *s =3D xen_evtchn_singleton; + bool flush_kvm_routes =3D false; int ret; =20 if (!s) { @@ -1104,12 +1129,17 @@ int xen_evtchn_close_op(struct evtchn_close *close) return -EINVAL; } =20 + QEMU_IOTHREAD_LOCK_GUARD(); qemu_mutex_lock(&s->port_lock); =20 - ret =3D close_port(s, close->port); + ret =3D close_port(s, close->port, &flush_kvm_routes); =20 qemu_mutex_unlock(&s->port_lock); =20 + if (flush_kvm_routes) { + kvm_update_msi_routes_all(NULL, true, 0, 0); + } + return ret; } =20 @@ -1226,21 +1256,54 @@ int xen_evtchn_bind_pirq_op(struct evtchn_bind_pirq= *pirq) return -EINVAL; } =20 - QEMU_LOCK_GUARD(&s->port_lock); + QEMU_IOTHREAD_LOCK_GUARD(); =20 if (s->pirq[pirq->pirq].port) { return -EBUSY; } =20 + qemu_mutex_lock(&s->port_lock); + ret =3D allocate_port(s, 0, EVTCHNSTAT_pirq, pirq->pirq, &pirq->port); if (ret) { + qemu_mutex_unlock(&s->port_lock); return ret; } =20 s->pirq[pirq->pirq].port =3D pirq->port; trace_kvm_xen_bind_pirq(pirq->pirq, pirq->port); =20 + qemu_mutex_unlock(&s->port_lock); + + /* + * Need to do the unmask outside port_lock because it may call + * back into the MSI translate function. + */ + if (s->pirq[pirq->pirq].gsi =3D=3D IRQ_MSI_EMU) { + if (s->pirq[pirq->pirq].is_masked) { + PCIDevice *dev =3D s->pirq[pirq->pirq].dev; + int vector =3D s->pirq[pirq->pirq].vector; + char *dev_path =3D qdev_get_dev_path(DEVICE(dev)); + + trace_kvm_xen_unmask_pirq(pirq->pirq, dev_path, vector); + g_free(dev_path); + + if (s->pirq[pirq->pirq].is_msix) { + msix_set_mask(dev, vector, false); + } else { + msi_set_mask(dev, vector, false, NULL); + } + } else if (s->pirq[pirq->pirq].is_translated) { + /* + * If KVM had attempted to translate this one before, make it = try + * again. If we unmasked, then the notifier on the MSI(-X) vec= tor + * will already have had the same effect. + */ + kvm_update_msi_routes_all(NULL, true, 0, 0); + } + } + return ret; } =20 @@ -1559,6 +1622,179 @@ bool xen_evtchn_set_gsi(int gsi, int level) return true; } =20 +static uint32_t msi_pirq_target(uint64_t addr, uint32_t data) +{ + /* The vector (in low 8 bits of data) must be zero */ + if (data & 0xff) { + return 0; + } + + uint32_t pirq =3D (addr & 0xff000) >> 12; + pirq |=3D (addr >> 32) & 0xffffff00; + + return pirq; +} + +static void do_remove_pci_vector(XenEvtchnState *s, PCIDevice *dev, int ve= ctor, + int except_pirq) +{ + uint32_t pirq; + + for (pirq =3D 0; pirq < s->nr_pirqs; pirq++) { + /* + * We could be cleverer here, but it isn't really a fast path, and + * this trivial optimisation is enough to let us skip the big gap + * in the middle a bit quicker (in terms of both loop iterations, + * and cache lines). + */ + if (!(pirq & 63) && !(pirq_inuse_word(s, pirq))) { + pirq +=3D 64; + continue; + } + if (except_pirq && pirq =3D=3D except_pirq) { + continue; + } + if (s->pirq[pirq].dev !=3D dev) { + continue; + } + if (vector !=3D -1 && s->pirq[pirq].vector !=3D vector) { + continue; + } + + /* It could theoretically be bound to a port already, but that is = OK. */ + s->pirq[pirq].dev =3D dev; + s->pirq[pirq].gsi =3D IRQ_UNBOUND; + s->pirq[pirq].is_msix =3D false; + s->pirq[pirq].vector =3D 0; + s->pirq[pirq].is_masked =3D false; + s->pirq[pirq].is_translated =3D false; + } +} + +void xen_evtchn_remove_pci_device(PCIDevice *dev) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + + if (!s) { + return; + } + + QEMU_LOCK_GUARD(&s->port_lock); + do_remove_pci_vector(s, dev, -1, 0); +} + +void xen_evtchn_snoop_msi(PCIDevice *dev, bool is_msix, unsigned int vecto= r, + uint64_t addr, uint32_t data, bool is_masked) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + uint32_t pirq; + + if (!s) { + return; + } + + assert(qemu_mutex_iothread_locked()); + + pirq =3D msi_pirq_target(addr, data); + + /* + * The PIRQ# must be sane, and there must be an allocated PIRQ in + * IRQ_UNBOUND or IRQ_MSI_EMU state to match it. + */ + if (!pirq || pirq >=3D s->nr_pirqs || !pirq_inuse(s, pirq) || + (s->pirq[pirq].gsi !=3D IRQ_UNBOUND && + s->pirq[pirq].gsi !=3D IRQ_MSI_EMU)) { + pirq =3D 0; + } + + if (pirq) { + s->pirq[pirq].dev =3D dev; + s->pirq[pirq].gsi =3D IRQ_MSI_EMU; + s->pirq[pirq].is_msix =3D is_msix; + s->pirq[pirq].vector =3D vector; + s->pirq[pirq].is_masked =3D is_masked; + } + + /* Remove any (other) entries for this {device, vector} */ + do_remove_pci_vector(s, dev, vector, pirq); +} + +int xen_evtchn_translate_pirq_msi(struct kvm_irq_routing_entry *route, + uint64_t address, uint32_t data) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + uint32_t pirq, port; + CPUState *cpu; + + if (!s) { + return 1; /* Not a PIRQ */ + } + + assert(qemu_mutex_iothread_locked()); + + pirq =3D msi_pirq_target(address, data); + if (!pirq || pirq >=3D s->nr_pirqs) { + return 1; /* Not a PIRQ */ + } + + if (!kvm_xen_has_cap(EVTCHN_2LEVEL)) { + return -ENOTSUP; + } + + if (s->pirq[pirq].gsi !=3D IRQ_MSI_EMU) { + return -EINVAL; + } + + /* Remember that KVM tried to translate this. It might need to try aga= in. */ + s->pirq[pirq].is_translated =3D true; + + QEMU_LOCK_GUARD(&s->port_lock); + + port =3D s->pirq[pirq].port; + if (!valid_port(port)) { + return -EINVAL; + } + + cpu =3D qemu_get_cpu(s->port_table[port].vcpu); + if (!cpu) { + return -EINVAL; + } + + route->type =3D KVM_IRQ_ROUTING_XEN_EVTCHN; + route->u.xen_evtchn.port =3D port; + route->u.xen_evtchn.vcpu =3D kvm_arch_vcpu_id(cpu); + route->u.xen_evtchn.priority =3D KVM_IRQ_ROUTING_XEN_EVTCHN_PRIO_2LEVE= L; + + return 0; /* Handled */ +} + +bool xen_evtchn_deliver_pirq_msi(uint64_t address, uint32_t data) +{ + XenEvtchnState *s =3D xen_evtchn_singleton; + uint32_t pirq, port; + + if (!s) { + return false; + } + + assert(qemu_mutex_iothread_locked()); + + pirq =3D msi_pirq_target(address, data); + if (!pirq || pirq >=3D s->nr_pirqs) { + return false; + } + + QEMU_LOCK_GUARD(&s->port_lock); + + port =3D s->pirq[pirq].port; + if (!valid_port(port)) { + return false; + } + + set_port_pending(s, port); + return true; +} + int xen_physdev_map_pirq(struct physdev_map_pirq *map) { XenEvtchnState *s =3D xen_evtchn_singleton; @@ -1569,6 +1805,7 @@ int xen_physdev_map_pirq(struct physdev_map_pirq *map) return -ENOTSUP; } =20 + QEMU_IOTHREAD_LOCK_GUARD(); QEMU_LOCK_GUARD(&s->port_lock); =20 if (map->domid !=3D DOMID_SELF && map->domid !=3D xen_domid) { @@ -1628,9 +1865,11 @@ int xen_physdev_unmap_pirq(struct physdev_unmap_pirq= *unmap) return -EINVAL; } =20 - QEMU_LOCK_GUARD(&s->port_lock); + QEMU_IOTHREAD_LOCK_GUARD(); + qemu_mutex_lock(&s->port_lock); =20 if (!pirq_inuse(s, pirq)) { + qemu_mutex_unlock(&s->port_lock); return -ENOENT; } =20 @@ -1638,6 +1877,7 @@ int xen_physdev_unmap_pirq(struct physdev_unmap_pirq = *unmap) =20 /* We can only unmap GSI PIRQs */ if (gsi < 0) { + qemu_mutex_unlock(&s->port_lock); return -EINVAL; } =20 @@ -1646,6 +1886,12 @@ int xen_physdev_unmap_pirq(struct physdev_unmap_pirq= *unmap) pirq_inuse_word(s, pirq) &=3D ~pirq_inuse_bit(pirq); =20 trace_kvm_xen_unmap_pirq(pirq, gsi); + qemu_mutex_unlock(&s->port_lock); + + if (gsi =3D=3D IRQ_MSI_EMU) { + kvm_update_msi_routes_all(NULL, true, 0, 0); + } + return 0; } =20 @@ -1659,6 +1905,7 @@ int xen_physdev_eoi_pirq(struct physdev_eoi *eoi) return -ENOTSUP; } =20 + QEMU_IOTHREAD_LOCK_GUARD(); QEMU_LOCK_GUARD(&s->port_lock); =20 if (!pirq_inuse(s, pirq)) { @@ -1690,6 +1937,7 @@ int xen_physdev_query_pirq(struct physdev_irq_status_= query *query) return -ENOTSUP; } =20 + QEMU_IOTHREAD_LOCK_GUARD(); QEMU_LOCK_GUARD(&s->port_lock); =20 if (!pirq_inuse(s, pirq)) { diff --git a/hw/i386/kvm/xen_evtchn.h b/hw/i386/kvm/xen_evtchn.h index 95400b7fbf7d..bfb67ac2bcc7 100644 --- a/hw/i386/kvm/xen_evtchn.h +++ b/hw/i386/kvm/xen_evtchn.h @@ -25,6 +25,14 @@ void xen_evtchn_set_callback_level(int level); int xen_evtchn_set_port(uint16_t port); =20 bool xen_evtchn_set_gsi(int gsi, int level); +void xen_evtchn_snoop_msi(PCIDevice *dev, bool is_msix, unsigned int vecto= r, + uint64_t addr, uint32_t data, bool is_masked); +void xen_evtchn_remove_pci_device(PCIDevice *dev); +struct kvm_irq_routing_entry; +int xen_evtchn_translate_pirq_msi(struct kvm_irq_routing_entry *route, + uint64_t address, uint32_t data); +bool xen_evtchn_deliver_pirq_msi(uint64_t address, uint32_t data); + =20 /* * These functions mirror the libxenevtchn library API, providing the QEMU diff --git a/hw/pci/msi.c b/hw/pci/msi.c index 1cadf150bcbe..041b0bdbec44 100644 --- a/hw/pci/msi.c +++ b/hw/pci/msi.c @@ -24,6 +24,8 @@ #include "qemu/range.h" #include "qapi/error.h" =20 +#include "hw/i386/kvm/xen_evtchn.h" + /* PCI_MSI_ADDRESS_LO */ #define PCI_MSI_ADDRESS_LO_MASK (~0x3) =20 @@ -414,6 +416,15 @@ void msi_write_config(PCIDevice *dev, uint32_t addr, u= int32_t val, int len) fprintf(stderr, "\n"); #endif =20 + if (xen_mode =3D=3D XEN_EMULATE) { + for (vector =3D 0; vector < msi_nr_vectors(flags); vector++) { + MSIMessage msg =3D msi_prepare_message(dev, vector); + + xen_evtchn_snoop_msi(dev, false, vector, msg.address, msg.data, + msi_is_masked(dev, vector)); + } + } + if (!(flags & PCI_MSI_FLAGS_ENABLE)) { return; } diff --git a/hw/pci/msix.c b/hw/pci/msix.c index 9e70fcd6fa74..ab8869d9d073 100644 --- a/hw/pci/msix.c +++ b/hw/pci/msix.c @@ -26,6 +26,8 @@ #include "qapi/error.h" #include "trace.h" =20 +#include "hw/i386/kvm/xen_evtchn.h" + /* MSI enable bit and maskall bit are in byte 1 in FLAGS register */ #define MSIX_CONTROL_OFFSET (PCI_MSIX_FLAGS + 1) #define MSIX_ENABLE_MASK (PCI_MSIX_FLAGS_ENABLE >> 8) @@ -124,6 +126,13 @@ static void msix_handle_mask_update(PCIDevice *dev, in= t vector, bool was_masked) { bool is_masked =3D msix_is_masked(dev, vector); =20 + if (xen_mode =3D=3D XEN_EMULATE) { + MSIMessage msg =3D msix_prepare_message(dev, vector); + + xen_evtchn_snoop_msi(dev, true, vector, msg.address, msg.data, + is_masked); + } + if (is_masked =3D=3D was_masked) { return; } diff --git a/hw/pci/pci.c b/hw/pci/pci.c index bad8e63db3e2..10c980b9f5ae 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -49,6 +49,9 @@ #include "qemu/cutils.h" #include "pci-internal.h" =20 +#include "hw/xen/xen.h" +#include "hw/i386/kvm/xen_evtchn.h" + //#define DEBUG_PCI #ifdef DEBUG_PCI # define PCI_DPRINTF(format, ...) printf(format, ## __VA_ARGS__) @@ -319,6 +322,17 @@ static void pci_msi_trigger(PCIDevice *dev, MSIMessage= msg) { MemTxAttrs attrs =3D {}; =20 + /* + * Xen uses the high bits of the address to contain some of the bits + * of the PIRQ#. Therefore we can't just send the write cycle and + * trust that it's caught by the APIC at 0xfee00000 because the + * target of the write might be e.g. 0x0x1000fee46000 for PIRQ#4166. + * So we intercept the delivery here instead of in kvm_send_msi(). + */ + if (xen_mode =3D=3D XEN_EMULATE && + xen_evtchn_deliver_pirq_msi(msg.address, msg.data)) { + return; + } attrs.requester_id =3D pci_requester_id(dev); address_space_stl_le(&dev->bus_master_as, msg.address, msg.data, attrs, NULL); @@ -988,6 +1002,9 @@ static void do_pci_unregister_device(PCIDevice *pci_de= v) pci_get_bus(pci_dev)->devices[pci_dev->devfn] =3D NULL; pci_config_free(pci_dev); =20 + if (xen_mode =3D=3D XEN_EMULATE) { + xen_evtchn_remove_pci_device(pci_dev); + } if (memory_region_is_mapped(&pci_dev->bus_master_enable_region)) { memory_region_del_subregion(&pci_dev->bus_master_container_region, &pci_dev->bus_master_enable_region); diff --git a/include/hw/pci/msi.h b/include/hw/pci/msi.h index ee8ee469a6b5..abcfd1392521 100644 --- a/include/hw/pci/msi.h +++ b/include/hw/pci/msi.h @@ -33,6 +33,7 @@ extern bool msi_nonbroken; void msi_set_message(PCIDevice *dev, MSIMessage msg); MSIMessage msi_get_message(PCIDevice *dev, unsigned int vector); bool msi_enabled(const PCIDevice *dev); +void msi_set_enabled(PCIDevice *dev); int msi_init(struct PCIDevice *dev, uint8_t offset, unsigned int nr_vectors, bool msi64bit, bool msi_per_vector_mask, Error **errp); diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index a73c49aabba5..d390137f02be 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -44,6 +44,7 @@ #include "qemu/error-report.h" #include "qemu/memalign.h" #include "hw/i386/x86.h" +#include "hw/i386/kvm/xen_evtchn.h" #include "hw/i386/pc.h" #include "hw/i386/apic.h" #include "hw/i386/apic_internal.h" @@ -5654,6 +5655,20 @@ int kvm_arch_fixup_msi_route(struct kvm_irq_routing_= entry *route, } } =20 +#ifdef CONFIG_XEN_EMU + if (xen_mode =3D=3D XEN_EMULATE) { + int handled =3D xen_evtchn_translate_pirq_msi(route, address, data= ); + + /* + * If it was a PIRQ and successfully routed (handled =3D=3D 0) or = it was + * an error (handled < 0), return. If it wasn't a PIRQ, keep going. + */ + if (handled <=3D 0) { + return handled; + } + } +#endif + address =3D kvm_swizzle_msi_ext_dest_id(address); route->u.msi.address_hi =3D address >> VTD_MSI_ADDR_HI_SHIFT; route->u.msi.address_lo =3D address & VTD_MSI_ADDR_LO_MASK; @@ -5673,8 +5688,8 @@ struct MSIRouteEntry { static QLIST_HEAD(, MSIRouteEntry) msi_route_list =3D \ QLIST_HEAD_INITIALIZER(msi_route_list); =20 -static void kvm_update_msi_routes_all(void *private, bool global, - uint32_t index, uint32_t mask) +void kvm_update_msi_routes_all(void *private, bool global, + uint32_t index, uint32_t mask) { int cnt =3D 0, vector; MSIRouteEntry *entry; diff --git a/target/i386/kvm/kvm_i386.h b/target/i386/kvm/kvm_i386.h index 6a5c24e3dc40..e24753abfe6a 100644 --- a/target/i386/kvm/kvm_i386.h +++ b/target/i386/kvm/kvm_i386.h @@ -51,6 +51,8 @@ bool kvm_hv_vpindex_settable(void); bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp); =20 uint64_t kvm_swizzle_msi_ext_dest_id(uint64_t address); +void kvm_update_msi_routes_all(void *private, bool global, + uint32_t index, uint32_t mask); =20 bool kvm_enable_sgx_provisioning(KVMState *s); void kvm_request_xsave_components(X86CPU *cpu, uint64_t mask); diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 0e81e5b6b199..96a90821969d 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -267,7 +267,8 @@ static bool kvm_xen_hcall_xen_version(struct kvm_xen_ex= it *exit, X86CPU *cpu, 1 << XENFEAT_auto_translated_physmap | 1 << XENFEAT_supervisor_mode_kernel | 1 << XENFEAT_hvm_callback_vector | - 1 << XENFEAT_hvm_safe_pvclock; + 1 << XENFEAT_hvm_safe_pvclock | + 1 << XENFEAT_hvm_pirqs; } =20 err =3D kvm_copy_to_gva(CPU(cpu), arg, &fi, sizeof(fi)); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761540; cv=none; d=zohomail.com; s=zohoarc; b=IUqqwFGoEkBbM92BdFLt5rugkxWoE1BI+CsR23ZtOlLzdRPAtKDUtLIFFIB089jFGBNju1uZ73wZpg9Xej8hzwprTqzPEzQbtO0k6L4wt8Jo+dXm7EF8m3qgLF6Zh9aCJFDF5bT3DrjplQ5M/eBbk6uAMxrfW9X3WMOqU1hh9ws= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761540; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=YnjkGLR5MCm0CPW75Kgqyct846xLnI4gs1BcmfaanK0=; b=ZEgM8agYpf2+x1WZB/+sKooEMnFPIPwM0nrTcJjlymHd7FpOjSlq7YVnSzNv/U6gNggbTrlX1py6YNptVaYqlc9tAvzwYBldjEjuPnleApyWEN98ofnAz5CmFeZ3dxk042qAWq1mK1o4Dy3PcjuKApPpH6J6tvR5O4lD9SL9k50= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761540299679.3433036002589; Thu, 2 Mar 2023 04:52:20 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiBE-0007U1-NK; Thu, 02 Mar 2023 07:37:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi8H-0003K7-Da for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:34:01 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7i-0003xx-1g for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:27 -0500 Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-599-slyewoTqNgiF99Y5W46t0w-1; Thu, 02 Mar 2023 07:33:24 -0500 Received: by mail-wm1-f72.google.com with SMTP id j32-20020a05600c1c2000b003e9bdf02c9fso1195144wms.6 for ; Thu, 02 Mar 2023 04:33:24 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id q10-20020a7bce8a000000b003ea57808179sm2820341wmj.38.2023.03.02.04.33.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760405; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YnjkGLR5MCm0CPW75Kgqyct846xLnI4gs1BcmfaanK0=; b=MHE9fM/VdxnAKNkoMV1u2nv8GzEj3fNh+HUJ06KV15mIauAUtokq54lykWLbV5QLOLCWKe xfPCaupZmmRM5JfPD/e835oDUxLKwMkIECt+Twn/dD7S1n0moYClu6/pkC/oqT6Cx6Jj+Z n+YjzoyMHwSvkWO9Ot/UMUb8riaAZFg= X-MC-Unique: slyewoTqNgiF99Y5W46t0w-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YnjkGLR5MCm0CPW75Kgqyct846xLnI4gs1BcmfaanK0=; b=JENKl2Asszku56SdEq3IU5k0oMk5iYeQLhCeZvcFQKV9pLVfwA6T0fqQMjfO15M4gs oul8STC4VQhmDxFVwonSZQeqiszik9ODLkZmMtVERL1GZyzvYrzrIzYeWxu7eL4XGTTh 5LcCN7k4S5lB2omaPYerTgVUUdnsQzLmUwN6VfVUuoJEiaSKzFhTuE/nKRE/XL8cHlZF xT2xKSl6sJeKzEgH1tpAtGlW0E2+4i17zUQkcdo0gcLKyVG4mtlkhwvFvi+BPNZvDB4P nU6U2AhagMIbKX6xw6mJ87XmySDMZ0c08NYyXPRt1YAAe7u6rTWwvLDSUyYbpxcWKGQi egqg== X-Gm-Message-State: AO0yUKUFyt6ifSaSkcI+/pkJfLTeevCjOBbtJe/VyGXvuRWfTAW95/WH 83NS5e/nCF/RsiNcvftkTMBtfCWcHypwXaf08dIfrQMjX8au+40674wzL0lJSg59gu3QfVLkSOA f2YOzx3J8jGVJN/jKf+n35jjjXK90/dCnYDpwbZeiY7uIJiblpIqyDsmrI5mrQP29puDQgWFgQO A= X-Received: by 2002:a05:600c:715:b0:3e8:f27b:a92c with SMTP id i21-20020a05600c071500b003e8f27ba92cmr7466974wmn.32.1677760402364; Thu, 02 Mar 2023 04:33:22 -0800 (PST) X-Google-Smtp-Source: AK7set8utcoL0qnO30ANLlX2ChF4z15iGsUY5xA44ZpxPEhk+t+p0f3qx7OkcEiRCSH2EVlTEfUNJA== X-Received: by 2002:a05:600c:715:b0:3e8:f27b:a92c with SMTP id i21-20020a05600c071500b003e8f27ba92cmr7466957wmn.32.1677760401972; Thu, 02 Mar 2023 04:33:21 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 58/62] kvm/i386: Add xen-evtchn-max-pirq property Date: Thu, 2 Mar 2023 13:30:25 +0100 Message-Id: <20230302123029.153265-59-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761541572100001 Content-Type: text/plain; charset="utf-8" From: David Woodhouse The default number of PIRQs is set to 256 to avoid issues with 32-bit MSI devices. Allow it to be increased if the user desires. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- accel/kvm/kvm-all.c | 1 + hw/i386/kvm/xen_evtchn.c | 21 +++++++++++---------- include/sysemu/kvm_int.h | 1 + include/sysemu/kvm_xen.h | 1 + target/i386/kvm/kvm.c | 34 ++++++++++++++++++++++++++++++++++ target/i386/kvm/xen-emu.c | 6 ++++++ 6 files changed, 54 insertions(+), 10 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 3d8e400bbf86..f2a6ea6a68a2 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -3705,6 +3705,7 @@ static void kvm_accel_instance_init(Object *obj) s->notify_window =3D 0; s->xen_version =3D 0; s->xen_gnttab_max_frames =3D 64; + s->xen_evtchn_max_pirq =3D 256; } =20 /** diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c index 69c0204d4f0c..886fbf6b3bed 100644 --- a/hw/i386/kvm/xen_evtchn.c +++ b/hw/i386/kvm/xen_evtchn.c @@ -302,17 +302,18 @@ void xen_evtchn_create(void) } =20 /* - * We could parameterise the number of PIRQs available if needed, - * but for now limit it to 256. The Xen scheme for encoding PIRQ# - * into an MSI message is not compatible with 32-bit MSI, as it - * puts the high bits of the PIRQ# into the high bits of the MSI - * message address, instead of using the Extended Destination ID - * in address bits 4-11 which perhaps would have been a better - * choice. So to keep life simple, just stick with 256 as the - * default, which conveniently doesn't need to set anything - * outside the low 32 bits of the address. + * The Xen scheme for encoding PIRQ# into an MSI message is not + * compatible with 32-bit MSI, as it puts the high bits of the + * PIRQ# into the high bits of the MSI message address, instead of + * using the Extended Destination ID in address bits 4-11 which + * perhaps would have been a better choice. + * + * To keep life simple, kvm_accel_instance_init() initialises the + * default to 256. which conveniently doesn't need to set anything + * outside the low 32 bits of the address. It can be increased by + * setting the xen-evtchn-max-pirq property. */ - s->nr_pirqs =3D 256; + s->nr_pirqs =3D kvm_xen_get_evtchn_max_pirq(); =20 s->nr_pirq_inuse_words =3D DIV_ROUND_UP(s->nr_pirqs, 64); s->pirq_inuse_bitmap =3D g_new0(uint64_t, s->nr_pirq_inuse_words); diff --git a/include/sysemu/kvm_int.h b/include/sysemu/kvm_int.h index 39ce4d36f684..a641c974ea54 100644 --- a/include/sysemu/kvm_int.h +++ b/include/sysemu/kvm_int.h @@ -121,6 +121,7 @@ struct KVMState uint32_t xen_version; uint32_t xen_caps; uint16_t xen_gnttab_max_frames; + uint16_t xen_evtchn_max_pirq; }; =20 void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml, diff --git a/include/sysemu/kvm_xen.h b/include/sysemu/kvm_xen.h index b2aafaf7abdd..595abfbe402f 100644 --- a/include/sysemu/kvm_xen.h +++ b/include/sysemu/kvm_xen.h @@ -26,6 +26,7 @@ void kvm_xen_inject_vcpu_callback_vector(uint32_t vcpu_id= , int type); void kvm_xen_set_callback_asserted(void); int kvm_xen_set_vcpu_virq(uint32_t vcpu_id, uint16_t virq, uint16_t port); uint16_t kvm_xen_get_gnttab_max_frames(void); +uint16_t kvm_xen_get_evtchn_max_pirq(void); =20 #define kvm_xen_has_cap(cap) (!!(kvm_xen_get_caps() & \ KVM_XEN_HVM_CONFIG_ ## cap)) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index d390137f02be..1aef54f87e64 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -5922,6 +5922,33 @@ static void kvm_arch_set_xen_gnttab_max_frames(Objec= t *obj, Visitor *v, s->xen_gnttab_max_frames =3D value; } =20 +static void kvm_arch_get_xen_evtchn_max_pirq(Object *obj, Visitor *v, + const char *name, void *opaqu= e, + Error **errp) +{ + KVMState *s =3D KVM_STATE(obj); + uint16_t value =3D s->xen_evtchn_max_pirq; + + visit_type_uint16(v, name, &value, errp); +} + +static void kvm_arch_set_xen_evtchn_max_pirq(Object *obj, Visitor *v, + const char *name, void *opaqu= e, + Error **errp) +{ + KVMState *s =3D KVM_STATE(obj); + Error *error =3D NULL; + uint16_t value; + + visit_type_uint16(v, name, &value, &error); + if (error) { + error_propagate(errp, error); + return; + } + + s->xen_evtchn_max_pirq =3D value; +} + void kvm_arch_accel_class_init(ObjectClass *oc) { object_class_property_add_enum(oc, "notify-vmexit", "NotifyVMexitOptio= n", @@ -5954,6 +5981,13 @@ void kvm_arch_accel_class_init(ObjectClass *oc) NULL, NULL); object_class_property_set_description(oc, "xen-gnttab-max-frames", "Maximum number of grant table f= rames"); + + object_class_property_add(oc, "xen-evtchn-max-pirq", "uint16", + kvm_arch_get_xen_evtchn_max_pirq, + kvm_arch_set_xen_evtchn_max_pirq, + NULL, NULL); + object_class_property_set_description(oc, "xen-evtchn-max-pirq", + "Maximum number of Xen PIRQs"); } =20 void kvm_set_max_apic_id(uint32_t max_apic_id) diff --git a/target/i386/kvm/xen-emu.c b/target/i386/kvm/xen-emu.c index 96a90821969d..bad3131d08e1 100644 --- a/target/i386/kvm/xen-emu.c +++ b/target/i386/kvm/xen-emu.c @@ -1765,6 +1765,12 @@ uint16_t kvm_xen_get_gnttab_max_frames(void) return s->xen_gnttab_max_frames; } =20 +uint16_t kvm_xen_get_evtchn_max_pirq(void) +{ + KVMState *s =3D KVM_STATE(current_accel()); + return s->xen_evtchn_max_pirq; +} + int kvm_put_xen_state(CPUState *cs) { X86CPU *cpu =3D X86_CPU(cs); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677762016; cv=none; d=zohomail.com; s=zohoarc; b=U33IsQop+r7sU3VMwaAAv1cHMYYVq9OXFF52K4d/ZdGhRPidRTpkqftZQtbxY40B5eK56jIYU3Z3Ksmte6p5fd4220RPRR91Zpa1kAaZnD5gSU8MMBA2Ic10hgWCcek1vmhd72Qgb0LkSmqbrVa4aszMfwLb4I0mqbRLqAlXaUY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677762016; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=LyNcGYRsToJBaZAojwc5TFuaatxE+niPZBYctJyD+ek=; b=At1UwYkNruaPdWSuk2fO1rgxeRfh6hgqo/kpg+98Ut1D4PW1SE6zw9j7LInRRHS14ZxNsZpiM9Mx4UCEgzY9+kWYxtG+vhdeo0X4tQO3pbD1+q88wOxQDPMv/6sD1M4rUlrysz5BYEinOA+5oKVOif9l7LlZiFEJinUlFN+tH1g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677762016860647.2960450285761; Thu, 2 Mar 2023 05:00:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiB0-0007FG-PO; Thu, 02 Mar 2023 07:36:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi8H-0003KR-Fc for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:34:01 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7l-0003yW-1l for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:31 -0500 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-124-bnRmH-BaPkqY7wGtlmpT6Q-1; Thu, 02 Mar 2023 07:33:27 -0500 Received: by mail-wm1-f70.google.com with SMTP id s18-20020a7bc392000000b003deaf780ab6so1019120wmj.4 for ; Thu, 02 Mar 2023 04:33:27 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id bg12-20020a05600c3c8c00b003e8dc7a03basm2949351wmb.41.2023.03.02.04.33.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760408; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LyNcGYRsToJBaZAojwc5TFuaatxE+niPZBYctJyD+ek=; b=Lss9NQD7tziCEwCq9HB6QCEStOECznLeFP5e62T7CQstcUbfo9RWfl5MM1um8fZ1DGT8RP t7NvCcIIoz2Hu7dFtja1tRenmD16MEIqhTOY1nuMuDci5W1HMxH+hxjdKaS3nCsQ1GvbCq LFI74U3wUJD36Em2MdpzdHImjJNkszc= X-MC-Unique: bnRmH-BaPkqY7wGtlmpT6Q-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LyNcGYRsToJBaZAojwc5TFuaatxE+niPZBYctJyD+ek=; b=XUdhqY+O1G9zWh6nMMHi+IMsbdgnsCFhtP/rCRzDQHCgfY5kEgmolSSIMJYcDbee2M yh+Xh9sMLCUJYHU8Dt73G9WJK3UtGvMoe1KIcMAeYgGsX9/8nC+WHBlPVcVz1qx/Zigd 96VqaS7Rc+782mr5AesKI3bUblJ6RUG8RvaGtZmOtbr16MGTHnXFHCUNcFhxtDH/yINc l7/p+Wlrk223TyKdNFx1ZeQBhogncYEeO3AsWX3YZtFsiq2VHYJl6M1yAvzKc3PbF6XE 7AQbraanCNYFkhPVW+CShBM5jw14xVMX0TIdIBbGHa8vnE0Moa5nNYkm2vFrqJUgJ6/j O67g== X-Gm-Message-State: AO0yUKU9g8jA+63A2b6SHx1ffD9jBO6PsnkTT9jaK0IeN1BalBhrMQwo vMRbEvhh/nyj+LLfVsTIB1/o/iul9vM+1+BHKeHGk6dQtgmAX5aKCAcRZ5YnZyeyP0HP5LJJOHI RcJ7pbShTlA4IDJHBFwN9QkkPisdTMfUHQ3NuZHP43tka+aWcyHKNAO52OPkqSeKV2tk6Jw3gws o= X-Received: by 2002:a05:600c:3ac7:b0:3ea:f6c4:5f3f with SMTP id d7-20020a05600c3ac700b003eaf6c45f3fmr7982148wms.13.1677760405221; Thu, 02 Mar 2023 04:33:25 -0800 (PST) X-Google-Smtp-Source: AK7set8avSyF/oe0OjB2nXAEr6RtBPCHrAN2kg8F/UowWKxC+zFHlvmPOdJ9HI8F+iretGe3IWUaUg== X-Received: by 2002:a05:600c:3ac7:b0:3ea:f6c4:5f3f with SMTP id d7-20020a05600c3ac700b003eaf6c45f3fmr7982130wms.13.1677760404848; Thu, 02 Mar 2023 04:33:24 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , David Woodhouse , Paul Durrant Subject: [PULL 59/62] i386/xen: Document Xen HVM emulation Date: Thu, 2 Mar 2023 13:30:26 +0100 Message-Id: <20230302123029.153265-60-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677762018142100005 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- docs/system/i386/xen.rst | 76 +++++++++++++++++++++++++++++++++++++ docs/system/target-i386.rst | 1 + 2 files changed, 77 insertions(+) create mode 100644 docs/system/i386/xen.rst diff --git a/docs/system/i386/xen.rst b/docs/system/i386/xen.rst new file mode 100644 index 000000000000..a00523b492e9 --- /dev/null +++ b/docs/system/i386/xen.rst @@ -0,0 +1,76 @@ +Xen HVM guest support +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + + +Description +----------- + +KVM has support for hosting Xen guests, intercepting Xen hypercalls and ev= ent +channel (Xen PV interrupt) delivery. This allows guests which expect to be +run under Xen to be hosted in QEMU under Linux/KVM instead. + +Setup +----- + +Xen mode is enabled by setting the ``xen-version`` property of the KVM +accelerator, for example for Xen 4.10: + +.. parsed-literal:: + + |qemu_system| --accel kvm,xen-version=3D0x4000a + +Additionally, virtual APIC support can be advertised to the guest through = the +``xen-vapic`` CPU flag: + +.. parsed-literal:: + + |qemu_system| --accel kvm,xen-version=3D0x4000a --cpu host,+xen_vapic + +When Xen support is enabled, QEMU changes hypervisor identification (CPUID +0x40000000..0x4000000A) to Xen. The KVM identification and features are not +advertised to a Xen guest. If Hyper-V is also enabled, the Xen identificat= ion +moves to leaves 0x40000100..0x4000010A. + +The Xen platform device is enabled automatically for a Xen guest. This all= ows +a guest to unplug all emulated devices, in order to use Xen PV block and n= etwork +drivers instead. Note that until the Xen PV device back ends are enabled t= o work +with Xen mode in QEMU, that is unlikely to cause significant joy. Linux gu= ests +can be dissuaded from this by adding 'xen_emul_unplug=3Dnever' on their co= mmand +line, and it can also be noted that AHCI disk controllers are exempt from = being +unplugged, as are passthrough VFIO PCI devices. + +Properties +---------- + +The following properties exist on the KVM accelerator object: + +``xen-version`` + This property contains the Xen version in ``XENVER_version`` form, with = the + major version in the top 16 bits and the minor version in the low 16 bit= s. + Setting this property enables the Xen guest support. + +``xen-evtchn-max-pirq`` + Xen PIRQs represent an emulated physical interrupt, either GSI or MSI, w= hich + can be routed to an event channel instead of to the emulated I/O or local + APIC. By default, QEMU permits only 256 PIRQs because this allows maximum + compatibility with 32-bit MSI where the higher bits of the PIRQ# would n= eed + to be in the upper 64 bits of the MSI message. For guests with large num= bers + of PCI devices (and none which are limited to 32-bit addressing) it may = be + desirable to increase this value. + +``xen-gnttab-max-frames`` + Xen grant tables are the means by which a Xen guest grants access to its + memory for PV back ends (disk, network, etc.). Since QEMU only supports = v1 + grant tables which are 8 bytes in size, each page (each frame) of the gr= ant + table can reference 512 pages of guest memory. The default number of fra= mes + is 64, allowing for 32768 pages of guest memory to be accessed by PV bac= kends + through simultaneous grants. For guests with large numbers of PV devices= and + high throughput, it may be desirable to increase this value. + +OS requirements +--------------- + +The minimal Xen support in the KVM accelerator requires the host to be run= ning +Linux v5.12 or newer. Later versions add optimisations: Linux v5.17 added +acceleration of interrupt delivery via the Xen PIRQ mechanism, and Linux v= 5.19 +accelerated Xen PV timers and inter-processor interrupts (IPIs). diff --git a/docs/system/target-i386.rst b/docs/system/target-i386.rst index e64c0130772d..77c2f3b97999 100644 --- a/docs/system/target-i386.rst +++ b/docs/system/target-i386.rst @@ -27,6 +27,7 @@ Architectural features =20 i386/cpu i386/hyperv + i386/xen i386/kvm-pv i386/sgx i386/amd-memory-encryption --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761230; cv=none; d=zohomail.com; s=zohoarc; b=T1qheXwD5p9ovmLTBfUTKJRRwvrf+AJ1BfA2Yo4CE8Q+aUusFiUa1CUhh8xTnB7tmTQ53g9aW1I/ev0PbF5JQ4OHOft6YvWzL3ZYdqUqzhjduJgB1xGv1UZqCjP2le42oKjQ6ezh3nZwdnZ/MqbJyLYxbQFFLdMSnpFnFDvadwA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761230; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=ePpU+9DWBFidDiH7G3nMZbS+NzKRiMzrSlAzgKM7aJk=; b=BLxudVpKiFTLRMlgDPrK3M3pBHx3mNkYGZUmYyCkn4XgkswtG7NMc8cDMx6HxmY+XCK8V5pjf9xEK2V6vRJlGUQQe1hThq82xUjOHkWOC33SBvbUObSZ6UI7/ZeWa8v3UpDjvcXxbmgZNsA8BKGnBGPzp2yZMPK0j10JAdBnmxA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761230881633.1239989294453; Thu, 2 Mar 2023 04:47:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiAL-0006ck-AT; Thu, 02 Mar 2023 07:36:09 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi8H-0003Ks-Im for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:34:02 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7v-00040M-6c for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:41 -0500 Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-637-6CPzGeweNvWT4ZR7mfRjLA-1; Thu, 02 Mar 2023 07:33:29 -0500 Received: by mail-wr1-f69.google.com with SMTP id bx25-20020a5d5b19000000b002c7ce4ce3c3so3198589wrb.13 for ; Thu, 02 Mar 2023 04:33:29 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id p14-20020a05600c468e00b003eb369abd92sm3374728wmo.2.2023.03.02.04.33.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760418; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ePpU+9DWBFidDiH7G3nMZbS+NzKRiMzrSlAzgKM7aJk=; b=T9wyTmXnPSL6BU7ShETwAnli8hApSM8PJUdvSlK0pIbCKoN5VT2jG7PqFVTipnVk5H3EfL kehTDT9npbyqjPcWzPfF7vzss2LCmx880Lqcfg0GUFyFbwS8yjHpIlx77CMq3j9N2PqM63 3SGXwW854OqQ3SLt7kNf5s6w+FK6R6A= X-MC-Unique: 6CPzGeweNvWT4ZR7mfRjLA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ePpU+9DWBFidDiH7G3nMZbS+NzKRiMzrSlAzgKM7aJk=; b=F31z4h0KxlmMmt9aEDrYrFfXyq7MTS09VA8BKnkqyccZ1cCl8/o2v9v9WhxKjsDCml cIUnkC+OTqMF+OwqM9yyr8H9QeTi0WpZ5eeMHLjhiumSKX9Chp1M9nV0/k86ZD234ZHs uJvTS9ly9bY0qZuuMHC6uqkyKMx0zSUqQ3ZBNjUKY50kuCjSr0QX8x+cAi4vVj+v4SCp rmyMlayuKhgwWTmxOaftOFV47bgOcd2t9LfpCSs+conMJpk7OpZF37i/7DgWyDoO0ytf Uk7lZ7wiJPUbtTrUNLuaG2VQKgbgmPo/88nk8zT8NPog3aoDlGa/GXXpRtk6HIz+Ubi4 C7VA== X-Gm-Message-State: AO0yUKVKhhL+DTtu4ZefaVugghJd9qp1vg3C7N64tiT3RkrnHiuB2i9/ QX5NwHbvI9qKLkmGYNaUpB8lH/p0Lp77gvZWfxudivPvUz9d7m+XacEIMydauTzdJrfRR1i0mqB J7ZZB9BSQsn2eDWSq8RMuE2n92nmQx+4wkGW3vqGXWnyqEW87AyWzyGyoh6jKQ8up6AXPb0tOIA w= X-Received: by 2002:a05:600c:4b30:b0:3df:fbc7:5b10 with SMTP id i48-20020a05600c4b3000b003dffbc75b10mr7505550wmp.0.1677760408235; Thu, 02 Mar 2023 04:33:28 -0800 (PST) X-Google-Smtp-Source: AK7set/Ui5wPSmfzZCPaKE3XjDGsQiBjd/xztOLJXOUP3YZhjXntL3H9f0qSKWN10bv3+KQSTRldEw== X-Received: by 2002:a05:600c:4b30:b0:3df:fbc7:5b10 with SMTP id i48-20020a05600c4b3000b003dffbc75b10mr7505528wmp.0.1677760407856; Thu, 02 Mar 2023 04:33:27 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: David Woodhouse , Paul Durrant Subject: [PULL 60/62] hw/xen: Subsume xen_be_register_common() into xen_be_init() Date: Thu, 2 Mar 2023 13:30:27 +0100 Message-Id: <20230302123029.153265-61-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761232313100007 Content-Type: text/plain; charset="utf-8" From: David Woodhouse Every caller of xen_be_init() checks and exits on error, then calls xen_be_register_common(). Just make xen_be_init() abort for itself and return void, and register the common devices too. Signed-off-by: David Woodhouse Reviewed-by: Paul Durrant --- hw/i386/xen/xen-hvm.c | 8 +---- hw/xen/xen-legacy-backend.c | 56 ++++++++++++----------------- hw/xenpv/xen_machine_pv.c | 6 +--- include/hw/xen/xen-legacy-backend.h | 3 +- 4 files changed, 25 insertions(+), 48 deletions(-) diff --git a/hw/i386/xen/xen-hvm.c b/hw/i386/xen/xen-hvm.c index b9a6f7f5381e..e5a1dd19f45a 100644 --- a/hw/i386/xen/xen-hvm.c +++ b/hw/i386/xen/xen-hvm.c @@ -1502,13 +1502,7 @@ void xen_hvm_init_pc(PCMachineState *pcms, MemoryReg= ion **ram_memory) device_listener_register(&state->device_listener); =20 xen_bus_init(); - - /* Initialize backend core & drivers */ - if (xen_be_init() !=3D 0) { - error_report("xen backend core setup failed"); - goto err; - } - xen_be_register_common(); + xen_be_init(); =20 QLIST_INIT(&xen_physmap); xen_read_physmap(state); diff --git a/hw/xen/xen-legacy-backend.c b/hw/xen/xen-legacy-backend.c index 085fd31ef7ab..afba71f6eb7e 100644 --- a/hw/xen/xen-legacy-backend.c +++ b/hw/xen/xen-legacy-backend.c @@ -676,21 +676,30 @@ void xenstore_update_fe(char *watch, struct XenLegacy= Device *xendev) } /* -------------------------------------------------------------------- */ =20 -int xen_be_init(void) +static void xen_set_dynamic_sysbus(void) +{ + Object *machine =3D qdev_get_machine(); + ObjectClass *oc =3D object_get_class(machine); + MachineClass *mc =3D MACHINE_CLASS(oc); + + machine_class_allow_dynamic_sysbus_dev(mc, TYPE_XENSYSDEV); +} + +void xen_be_init(void) { xengnttab_handle *gnttabdev; =20 xenstore =3D xs_daemon_open(); if (!xenstore) { xen_pv_printf(NULL, 0, "can't connect to xenstored\n"); - return -1; + exit(1); } =20 qemu_set_fd_handler(xs_fileno(xenstore), xenstore_update, NULL, NULL); =20 if (xen_xc =3D=3D NULL || xen_fmem =3D=3D NULL) { - /* Check if xen_init() have been called */ - goto err; + xen_pv_printf(NULL, 0, "Xen operations not set up\n"); + exit(1); } =20 gnttabdev =3D xengnttab_open(NULL, 0); @@ -706,23 +715,16 @@ int xen_be_init(void) xen_sysbus =3D qbus_new(TYPE_XENSYSBUS, xen_sysdev, "xen-sysbus"); qbus_set_bus_hotplug_handler(xen_sysbus); =20 - return 0; + xen_set_dynamic_sysbus(); =20 -err: - qemu_set_fd_handler(xs_fileno(xenstore), NULL, NULL, NULL); - xs_daemon_close(xenstore); - xenstore =3D NULL; - - return -1; -} - -static void xen_set_dynamic_sysbus(void) -{ - Object *machine =3D qdev_get_machine(); - ObjectClass *oc =3D object_get_class(machine); - MachineClass *mc =3D MACHINE_CLASS(oc); - - machine_class_allow_dynamic_sysbus_dev(mc, TYPE_XENSYSDEV); + xen_be_register("console", &xen_console_ops); + xen_be_register("vkbd", &xen_kbdmouse_ops); +#ifdef CONFIG_VIRTFS + xen_be_register("9pfs", &xen_9pfs_ops); +#endif +#ifdef CONFIG_USB_LIBUSB + xen_be_register("qusb", &xen_usb_ops); +#endif } =20 int xen_be_register(const char *type, struct XenDevOps *ops) @@ -744,20 +746,6 @@ int xen_be_register(const char *type, struct XenDevOps= *ops) return xenstore_scan(type, xen_domid, ops); } =20 -void xen_be_register_common(void) -{ - xen_set_dynamic_sysbus(); - - xen_be_register("console", &xen_console_ops); - xen_be_register("vkbd", &xen_kbdmouse_ops); -#ifdef CONFIG_VIRTFS - xen_be_register("9pfs", &xen_9pfs_ops); -#endif -#ifdef CONFIG_USB_LIBUSB - xen_be_register("qusb", &xen_usb_ops); -#endif -} - int xen_be_bind_evtchn(struct XenLegacyDevice *xendev) { if (xendev->local_port !=3D -1) { diff --git a/hw/xenpv/xen_machine_pv.c b/hw/xenpv/xen_machine_pv.c index 20c9611d7181..2e759d0619c6 100644 --- a/hw/xenpv/xen_machine_pv.c +++ b/hw/xenpv/xen_machine_pv.c @@ -36,10 +36,7 @@ static void xen_init_pv(MachineState *machine) int i; =20 /* Initialize backend core & drivers */ - if (xen_be_init() !=3D 0) { - error_report("%s: xen backend core setup failed", __func__); - exit(1); - } + xen_be_init(); =20 switch (xen_mode) { case XEN_ATTACH: @@ -55,7 +52,6 @@ static void xen_init_pv(MachineState *machine) break; } =20 - xen_be_register_common(); xen_be_register("vfb", &xen_framebuffer_ops); xen_be_register("qnic", &xen_netdev_ops); =20 diff --git a/include/hw/xen/xen-legacy-backend.h b/include/hw/xen/xen-legac= y-backend.h index be281e1f38eb..e31cd3a068d3 100644 --- a/include/hw/xen/xen-legacy-backend.h +++ b/include/hw/xen/xen-legacy-backend.h @@ -42,8 +42,7 @@ int xenstore_read_fe_uint64(struct XenLegacyDevice *xende= v, const char *node, void xen_be_check_state(struct XenLegacyDevice *xendev); =20 /* xen backend driver bits */ -int xen_be_init(void); -void xen_be_register_common(void); +void xen_be_init(void); int xen_be_register(const char *type, struct XenDevOps *ops); int xen_be_set_state(struct XenLegacyDevice *xendev, enum xenbus_state sta= te); int xen_be_bind_evtchn(struct XenLegacyDevice *xendev); --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761814; cv=none; d=zohomail.com; s=zohoarc; b=d7G8usDnuQcd9kvOrsKblcRkHE9TeWbE8OFk6bk0Vwm7ghkDQaR2sxRia9pU47pjg0rNqVL0yCaWRT8lPgmxoxsicCUrwmhZRisQEjBZMayQUzSSnERFFAb5QfOWWe4W9UXrbT/ZD08y2AYY3VVTpKncY0xbDiJmn7xDjPeikTI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761814; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=VwEA1SKGSZ+qVi7NXmaUzW9NGYsub5ZiAUDkM1xzZs0=; b=f9A0PbHUn5afrm6IK6Uuce1IoyZy6m+CnUlwfawTE584vlpRTUaAAZaASCPDb8ie7w9oRP+T7nIuiIB0nabw9QzwgyV3yCWDxEPo0yGLqBmpCAN0pRe9jGQ1XpUKJU0n0geRic0FmWnLV8lPUCuSnY2r4hJ5ET9HDk1gzOXlFAM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761814763928.537987713144; Thu, 2 Mar 2023 04:56:54 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXi9o-0005jU-Qh; Thu, 02 Mar 2023 07:35:45 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi8H-0003Kd-Fh for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:34:01 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7q-0003zR-Bq for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:35 -0500 Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-631-EWV3l9UiP7678_B8yiCBrA-1; Thu, 02 Mar 2023 07:33:32 -0500 Received: by mail-wr1-f71.google.com with SMTP id d14-20020adfa34e000000b002bfc062eaa8so3215214wrb.20 for ; Thu, 02 Mar 2023 04:33:32 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id t11-20020a05600c450b00b003dc47d458cdsm3149254wmo.15.2023.03.02.04.33.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760413; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VwEA1SKGSZ+qVi7NXmaUzW9NGYsub5ZiAUDkM1xzZs0=; b=EWNWnLx1eCjOwiagO2n02uIzhQhpAfkGb3y7RWTUOXqu3ukS5p0wp0v5MbIr/i/8qDlg2a FpL1H8oYCr5wCn1IwMYWEatjT0QWYiC74fY9QJJiL/+V++/77OTKtCVxN404G8tycZyb5p nU8CL1qHtoXfXfT91cY8W7l6ajiiMHk= X-MC-Unique: EWV3l9UiP7678_B8yiCBrA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VwEA1SKGSZ+qVi7NXmaUzW9NGYsub5ZiAUDkM1xzZs0=; b=yjWZTp2msyZ/OGx9DxGpouX8EihfwG/m98ahmj669xKz3+CyfIqD9RERM09s3p+2vJ ZGOzZLVApsZK9dPPTtt2Lxlqn6l6nx6O6hkA5Bge7m3GEGdtOr9t1FuapmkZJHCoQuQz aQAxmskvu/FxuQay1YH7xDo9oA3ADsfPZPSOGy9KtXZ0Pp4vRms6lxVpDSPnILWhCZjN WKAzojpZ435jNTJKadr/TeMFjlVq3t75sJFP4SFKNOtzBA3I4IV9/Rvz9c4hBv0ubEsy CeuJFNQ6Ao/Yg51pOUo7U1Q2gI53tXn4sY0EwNWSy0Ftu2OVhclOjW1c4kikTQZuWAKr cA+w== X-Gm-Message-State: AO0yUKXACSY3DDgvkxcZyfxhGQ9ipAIBGDT4JlT2MbFRchlyxWVLvVtg /BhPP3056zC4Yd7+5KBkojUiXOm+0PuGNC/U/ueTDOUXq+t90vkSTFahZOktF10bM+7gEX8TEbF HA7wHyKvZWELQVq83kpezeTCMPPWxlDVgC7vBrUYMOeGnApT2E4NlPpZyDTrw4ljyQuBFjzqD4x 8= X-Received: by 2002:a5d:45c4:0:b0:2c7:6ce2:bb37 with SMTP id b4-20020a5d45c4000000b002c76ce2bb37mr7930811wrs.29.1677760411148; Thu, 02 Mar 2023 04:33:31 -0800 (PST) X-Google-Smtp-Source: AK7set85u+MmkAQLLOl4onPv1bpVBAYQHB1tJE/rWmELFN2cky7vZ9Az6Xk4Txh9GWwLqZONzNd4hQ== X-Received: by 2002:a5d:45c4:0:b0:2c7:6ce2:bb37 with SMTP id b4-20020a5d45c4000000b002c76ce2bb37mr7930792wrs.29.1677760410778; Thu, 02 Mar 2023 04:33:30 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Peter Krempa , Markus Armbruster Subject: [PULL 61/62] qapi: Add 'acpi' field to 'query-machines' output Date: Thu, 2 Mar 2023 13:30:28 +0100 Message-Id: <20230302123029.153265-62-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761816376100003 Content-Type: text/plain; charset="utf-8" From: Peter Krempa Report which machine types support ACPI so that management applications can properly use the 'acpi' property even on platforms such as ARM where support for ACPI depends on the machine type and thus checking presence of '-machine acpi=3D' in 'query-command-line-options' is insufficient. Signed-off-by: Peter Krempa Acked-by: Markus Armbruster Message-Id: <537625d3e25d345052322c42ca19812b98b4f49a.1677571792.git.pkremp= a@redhat.com> Signed-off-by: Paolo Bonzini --- hw/core/machine-qmp-cmds.c | 1 + qapi/machine.json | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c index 2d904747c080..b98ff15089a7 100644 --- a/hw/core/machine-qmp-cmds.c +++ b/hw/core/machine-qmp-cmds.c @@ -102,6 +102,7 @@ MachineInfoList *qmp_query_machines(Error **errp) info->hotpluggable_cpus =3D mc->has_hotpluggable_cpus; info->numa_mem_supported =3D mc->numa_mem_supported; info->deprecated =3D !!mc->deprecation_reason; + info->acpi =3D !!object_class_property_find(OBJECT_CLASS(mc), "acp= i"); if (mc->default_cpu_type) { info->default_cpu_type =3D g_strdup(mc->default_cpu_type); } diff --git a/qapi/machine.json b/qapi/machine.json index b9228a5e4616..604b686e59f2 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -155,6 +155,8 @@ # # @default-ram-id: the default ID of initial RAM memory backend (since 5.2) # +# @acpi: machine type supports ACPI (since 8.0) +# # Since: 1.2 ## { 'struct': 'MachineInfo', @@ -162,7 +164,7 @@ '*is-default': 'bool', 'cpu-max': 'int', 'hotpluggable-cpus': 'bool', 'numa-mem-supported': 'bool', 'deprecated': 'bool', '*default-cpu-type': 'str', - '*default-ram-id': 'str' } } + '*default-ram-id': 'str', 'acpi': 'bool' } } =20 ## # @query-machines: --=20 2.39.1 From nobody Tue Apr 30 16:19:35 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1677761525; cv=none; d=zohomail.com; s=zohoarc; b=B+aSwr2Kfne8k5yE1t6d9XWGKSKlmv04sT+0aFgHNIzFO/DrfdrxYdRMgF6DHklDBfol0brov0n4DnYHOvIjujliXjHuKhhVEX2zuwXnNiRKUDKmm8tDC5hivrlcFZq5cB+ec8DtEZ3qmOlQOm8avAJwIUXC1JSAxuhFInaen9I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1677761525; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=/VzYrCiOSSwuHpZgRg3228aUTO/Ukfcmohe1DeHbe5A=; b=mtRonIOEex790GS7mkh90P/0krpVxrbJB56L1YX25NnpCxh1Zf+/mcQewVPPYVuFHFZt8GXrqiq1itpca3ovfhYvKAd6LimFea7ZVfW9m7XQkl6aR24PD7XeYZ4EbIK+ihVfx5ggGtEKyFoR1XzLI/Y3C5zZto4ZU2ui2yXvucQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1677761525583744.2436340091587; Thu, 2 Mar 2023 04:52:05 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pXiBV-0007kv-T4; Thu, 02 Mar 2023 07:37:22 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi8H-0003Kn-HY for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:34:02 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pXi7t-000402-75 for qemu-devel@nongnu.org; Thu, 02 Mar 2023 07:33:39 -0500 Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-76-ea9TPiPaOLu8YoBMpOen5g-1; Thu, 02 Mar 2023 07:33:35 -0500 Received: by mail-wr1-f70.google.com with SMTP id m7-20020a056000008700b002c7047ea429so3200292wrx.21 for ; Thu, 02 Mar 2023 04:33:35 -0800 (PST) Received: from avogadro.local ([2001:b07:6468:f312:1c09:f536:3de6:228c]) by smtp.gmail.com with ESMTPSA id l8-20020adff488000000b002c557f82e27sm15284106wro.99.2023.03.02.04.33.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:33:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677760416; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/VzYrCiOSSwuHpZgRg3228aUTO/Ukfcmohe1DeHbe5A=; b=QgK5t1Q/kdUp7XLE+UWGvm/5C7CvGuzyU3EQpk1AoX0j+bQP9VZXPNXKJ4bTO1zAspSzaY uZEo+KIBTgA2PLxLncAqEGEz8lqmRL0ZjjYYwM8rSljV8HZF8YCVb0KVhdSGKq//o/34hW D788SpBIOqh4VsvrHBlK/BGXQoDYvdM= X-MC-Unique: ea9TPiPaOLu8YoBMpOen5g-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/VzYrCiOSSwuHpZgRg3228aUTO/Ukfcmohe1DeHbe5A=; b=fF3VgFtA5jt6puXSA+du5Uyuc+T4aYIy4Mzq/AmecvmBv3WC4/E1/uafM7vPxInINQ I6K+9haxxBNmorsm0YZ7AYHqO1dSiNSPzy0bnhiD84T6kMfSUL91KeUfNPRoGwUx+mQv Tgt/sOnJ1YKzmgZmifd/0S+s3Sv7dOmsSmc/Uj5aTqudv7lajTxGfKXOBisxYNP9brJw m0n1taQ84p+RTtxnO9aItOg8UueQaE9GdWUvfFXTQZ6J5mkoUGkxfZbDLTLaOgFp0hcG LmE2/ySKpvo9d6usKUhJMOxjkYDNGDckFKstBRDX3zHCuWgbcd94XDtgwUF3HMyr7e5V hEBQ== X-Gm-Message-State: AO0yUKWp1rHiT4xzQIGuHQZ261G9tAJCqWbWw83CuVZNpph2zHWXWY9O 8nbnJ9j5B5QJlb1I7yGn5dUAwGBhaBtWL2RzKtI6YD/yvobC7TFCUk3+tI9pMMUhUVL1CgjQXmg 5HYfkoAyf4stPa765byeMdH17cFNO+BoaY+cVDeeDtgmG4Gs0Z4nkv6ebYXCFU1ERmWpfRuHWE6 E= X-Received: by 2002:a5d:6a85:0:b0:2c7:deb:c61 with SMTP id s5-20020a5d6a85000000b002c70deb0c61mr7524846wru.39.1677760413989; Thu, 02 Mar 2023 04:33:33 -0800 (PST) X-Google-Smtp-Source: AK7set+QsVU70FuQcYVCnRZr4EDDHLe978aERdz36s1FC3u0qPgIJ5ccd/mqFAae0N4NYcLgR/OlLg== X-Received: by 2002:a5d:6a85:0:b0:2c7:deb:c61 with SMTP id s5-20020a5d6a85000000b002c70deb0c61mr7524836wru.39.1677760413761; Thu, 02 Mar 2023 04:33:33 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Cc: Juan Quintela Subject: [PULL 62/62] Makefile: qemu-bundle is a directory Date: Thu, 2 Mar 2023 13:30:29 +0100 Message-Id: <20230302123029.153265-63-pbonzini@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302123029.153265-1-pbonzini@redhat.com> References: <20230302123029.153265-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=pbonzini@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1677761527530100001 Content-Type: text/plain; charset="utf-8" From: Juan Quintela So make distclean should remove it with -rf, not -f alone. It has been that way since it was included. ommit cf60ccc3306ca4726cbd286a156863863b00ff4f Author: Akihiko Odaki Date: Fri Jun 24 23:50:37 2022 +0900 cutils: Introduce bundle mechanism Fixes: cf60ccc3306ca4726cbd286a156863863b00ff4f Signed-off-by: Juan Quintela Message-Id: <20230301111910.1660-1-quintela@redhat.com> Signed-off-by: Paolo Bonzini --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index ce2f83a684f6..e421f8a1f4f7 100644 --- a/Makefile +++ b/Makefile @@ -220,7 +220,7 @@ qemu-%.tar.bz2: =20 distclean: clean recurse-distclean -$(quiet-@)test -f build.ninja && $(NINJA) $(NINJAFLAGS) -t clean -g || : - rm -f config-host.mak Makefile.prereqs qemu-bundle + rm -f config-host.mak Makefile.prereqs rm -f tests/tcg/*/config-target.mak tests/tcg/config-host.mak rm -f config.status rm -f roms/seabios/config.mak @@ -230,7 +230,7 @@ distclean: clean recurse-distclean rm -f Makefile.ninja Makefile.mtest build.ninja.stamp meson.stamp rm -f config.log rm -f linux-headers/asm - rm -Rf .sdk + rm -Rf .sdk qemu-bundle =20 find-src-path =3D find "$(SRC_PATH)" -path "$(SRC_PATH)/meson" -prune -o \ -type l -prune -o \( -name "*.[chsS]" -o -name "*.[ch].inc" \) --=20 2.39.1