From nobody Sat Feb 7 08:28:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1632988389; cv=none; d=zohomail.com; s=zohoarc; b=QmyfstWaisSTzFABbZzo07S7PHvXdkJe5DmMuVbPbOO4hqG/ZuVsJzadSWBh6bk6ptBXMG5kGQe1vin5hZwaep40axsDy6WTinq1QCkXp3daozup4ql5ElYoWSpEOPIq8gu9kq/VOYmkPCRVUTebJbmltBmmZByUSNis0VQNc8A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1632988389; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=rVtZpNhlXnSzmfbhCEL+IMfyjOh3bF01cvc201QQbmU=; b=GYofENvruAv/3E1dbaSt0zh0CpqQyyxFDg5KWjkkBtO2FJ4pjf+V7SR0hMqDRedHsz3kdQ6CNlVb2eHYi2UUUuVLtdHTLlKm999yFflJn08xvRST/1s+Fv+6HiXJ5UClgTdIyTOqGkeNqfZHKLowSwVxYiSKMr6WPuAh44xqYOY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1632988389302325.6358275432566; Thu, 30 Sep 2021 00:53:09 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.199509.353658 (Exim 4.92) (envelope-from ) id 1mVqsA-0003aI-4H; Thu, 30 Sep 2021 07:52:54 +0000 Received: by outflank-mailman (output) from mailman id 199509.353658; Thu, 30 Sep 2021 07:52:54 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mVqs9-0003a6-VA; Thu, 30 Sep 2021 07:52:53 +0000 Received: by outflank-mailman (input) for mailman id 199509; Thu, 30 Sep 2021 07:52:52 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mVqs8-00017f-5R for xen-devel@lists.xenproject.org; Thu, 30 Sep 2021 07:52:52 +0000 Received: from mail-lf1-x134.google.com (unknown [2a00:1450:4864:20::134]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id fac7a3cc-26c2-4c47-b457-e24184136f4b; Thu, 30 Sep 2021 07:52:31 +0000 (UTC) Received: by mail-lf1-x134.google.com with SMTP id i25so21624009lfg.6 for ; Thu, 30 Sep 2021 00:52:31 -0700 (PDT) Received: from localhost.localdomain (host-176-36-245-220.b024.la.net.ua. [176.36.245.220]) by smtp.gmail.com with ESMTPSA id 13sm251099ljf.51.2021.09.30.00.52.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Sep 2021 00:52:29 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: fac7a3cc-26c2-4c47-b457-e24184136f4b DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rVtZpNhlXnSzmfbhCEL+IMfyjOh3bF01cvc201QQbmU=; b=hE2uDfRL1hRLRQVqes0DgETsiFrCAaEESlXXIrx14t2k2qtoniLHSCW3Vh+IJBx0sV jR0frYyDX02OCrbrTE0+xVaPoiG7IBmARxKBGlO5xYlEvM1AHpt0VP/5OC6FZ+KhNcMi gLauGCou1utr94NVGYrqj+DOhs2vnmXf1MkyUH27TcN8WpAPi2tgfH33I2CQAnD49Isu HsGrimm/gnCM8k41GqEEOr4htxMX71j4IjAfrqNaEroHyZf1hWcqdhMig7NbiSTdwNiI wCs6hRdLHt0TNGcleVYUxDr/4DzDcZ7eMqnNAytWzR8U8xqPWjt4FEM1wIY5Q7LmCJac EYPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rVtZpNhlXnSzmfbhCEL+IMfyjOh3bF01cvc201QQbmU=; b=glbScFWEZDA+TYr+elkg1ROQANJyYANvl8qMqP8kY3kbIpJjiVnkM73aTq34QOGHMJ 4PcyX7YNLn8xRBSlVTQCdReRF9MfiuuJUmlGQgqiTu+s9y8nfPtjhXNZwPP4Fe8a0Pjv RCdje38P/o5nwjNoTfIriQr1wVByAtKNGPo0K7Z6wdaBE8PXA5Cn+4tgcCgdjr9lHnYV aUW8ld7pwyeMJKUT+BjUXdHWpxg4K7O/cHwHhwtiiB+/YXjmB0A7pN+kbIWvwTuWg0xj gYO6y8YQqqoNaRBR6sxoi5I1ctqWlSNf/xjSDW039bImdMcXF5l/yB0XnuCH+Td/vj+f 49KQ== X-Gm-Message-State: AOAM531WkyQTPqB+nP4DVOAQis7qOhK2W1NAi9Q9/nXL1+/+k0XigMAR FUXMunkiHtfzmkdbLbsQR1qOVwkeu38= X-Google-Smtp-Source: ABdhPJy3FaYBUB50uoi6zzCEs665+xGWg3WT1AJusJrIM7oB7ma6dHvZ/NwDWDbmw2T0DPxHmRZ1Kw== X-Received: by 2002:a05:6512:12d6:: with SMTP id p22mr4595737lfg.42.1632988350031; Thu, 30 Sep 2021 00:52:30 -0700 (PDT) From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org Cc: julien@xen.org, sstabellini@kernel.org, oleksandr_tyshchenko@epam.com, volodymyr_babchuk@epam.com, Artem_Mygaiev@epam.com, roger.pau@citrix.com, jbeulich@suse.com, bertrand.marquis@arm.com, rahul.singh@arm.com, Oleksandr Andrushchenko , Michal Orzel Subject: [PATCH v3 05/11] vpci/header: Implement guest BAR register handlers Date: Thu, 30 Sep 2021 10:52:17 +0300 Message-Id: <20210930075223.860329-6-andr2000@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210930075223.860329-1-andr2000@gmail.com> References: <20210930075223.860329-1-andr2000@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1632988391245100001 Content-Type: text/plain; charset="utf-8" From: Oleksandr Andrushchenko Emulate guest BAR register values: this allows creating a guest view of the registers and emulates size and properties probe as it is done during PCI device enumeration by the guest. ROM BAR is only handled for the hardware domain and for guest domains there is a stub: at the moment PCI expansion ROM is x86 only, so it might not be used by other architectures without emulating x86. Other use-cases may include using that expansion ROM before Xen boots, hence no emulation is needed in Xen itself. Or when a guest wants to use the ROM code which seems to be rare. Signed-off-by: Oleksandr Andrushchenko Reviewed-by: Michal Orzel Reviewed-by: Jan Beulich --- Since v1: - re-work guest read/write to be much simpler and do more work on write than read which is expected to be called more frequently - removed one too obvious comment Signed-off-by: Oleksandr Andrushchenko --- xen/drivers/vpci/header.c | 30 +++++++++++++++++++++++++++++- xen/include/xen/vpci.h | 3 +++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index 1ce98795fcca..ec4d215f36ff 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -400,12 +400,38 @@ static void bar_write(const struct pci_dev *pdev, uns= igned int reg, static void guest_bar_write(const struct pci_dev *pdev, unsigned int reg, uint32_t val, void *data) { + struct vpci_bar *bar =3D data; + bool hi =3D false; + + if ( bar->type =3D=3D VPCI_BAR_MEM64_HI ) + { + ASSERT(reg > PCI_BASE_ADDRESS_0); + bar--; + hi =3D true; + } + else + { + val &=3D PCI_BASE_ADDRESS_MEM_MASK; + val |=3D bar->type =3D=3D VPCI_BAR_MEM32 ? PCI_BASE_ADDRESS_MEM_TY= PE_32 + : PCI_BASE_ADDRESS_MEM_TYPE_64; + val |=3D bar->prefetchable ? PCI_BASE_ADDRESS_MEM_PREFETCH : 0; + } + + bar->guest_addr &=3D ~(0xffffffffull << (hi ? 32 : 0)); + bar->guest_addr |=3D (uint64_t)val << (hi ? 32 : 0); + + bar->guest_addr &=3D ~(bar->size - 1) | ~PCI_BASE_ADDRESS_MEM_MASK; } =20 static uint32_t guest_bar_read(const struct pci_dev *pdev, unsigned int re= g, void *data) { - return 0xffffffff; + const struct vpci_bar *bar =3D data; + + if ( bar->type =3D=3D VPCI_BAR_MEM64_HI ) + return bar->guest_addr >> 32; + + return bar->guest_addr; } =20 static void rom_write(const struct pci_dev *pdev, unsigned int reg, @@ -522,6 +548,8 @@ static int add_bar_handlers(const struct pci_dev *pdev,= bool is_hwdom) if ( rc ) return rc; } + + bars[i].guest_addr =3D 0; } return 0; } diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index fd822c903af5..a0320b22cb36 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -75,7 +75,10 @@ struct vpci { struct vpci_header { /* Information about the PCI BARs of this device. */ struct vpci_bar { + /* Physical view of the BAR. */ uint64_t addr; + /* Guest view of the BAR. */ + uint64_t guest_addr; uint64_t size; enum { VPCI_BAR_EMPTY, --=20 2.25.1