From: "Michael S. Tsirkin" <mst@redhat.com>
To: Isaku Yamahata <yamahata@valinux.co.jp>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH V6 17/32] pci: 64bit bar support.
Date: Sun, 1 Nov 2009 18:07:30 +0200 [thread overview]
Message-ID: <20091101160730.GA21894@redhat.com> (raw)
In-Reply-To: <1256905286-25435-18-git-send-email-yamahata@valinux.co.jp>
On Fri, Oct 30, 2009 at 09:21:11PM +0900, Isaku Yamahata wrote:
> implemented pci 64bit bar support.
> The tricky bit is pci_update_mapping().
> An OS is allowed to set the BAR such that OS can't address the area
> pointed by BAR. It doesn't make sense, though.
It might make sense. 32 bit guest can address more than 4G of
physical RAM, e.g. using PAE.
Since I think qemu can not support this if target phys address is 32
bit, we should declare lack of support for 64 bit addressing on these
platforms, by forcing BAR into 32 bit mode, rather than silently failing
to map it.
> In that case, don't map the BAR.
>
> Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
> ---
> hw/pci.c | 35 ++++++++++++++++++++++++++++++-----
> hw/pci.h | 1 +
> 2 files changed, 31 insertions(+), 5 deletions(-)
>
> diff --git a/hw/pci.c b/hw/pci.c
> index b462bd6..7da3db9 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -484,8 +484,14 @@ void pci_register_bar(PCIDevice *pci_dev, int region_num,
> wmask |= PCI_ROM_ADDRESS_ENABLE;
> }
> pci_set_long(pci_dev->config + addr, type);
> - pci_set_long(pci_dev->wmask + addr, wmask & 0xffffffff);
> - pci_set_long(pci_dev->cmask + addr, 0xffffffff);
> + if (!(r->type & PCI_BASE_ADDRESS_SPACE_IO) &&
> + r->type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
> + pci_set_quad(pci_dev->wmask + addr, wmask);
> + pci_set_quad(pci_dev->cmask + addr, ~0ULL);
> + } else {
> + pci_set_long(pci_dev->wmask + addr, wmask & 0xffffffff);
> + pci_set_long(pci_dev->cmask + addr, 0xffffffff);
> + }
> }
>
> static void pci_update_mappings(PCIDevice *d)
> @@ -513,7 +519,11 @@ static void pci_update_mappings(PCIDevice *d)
> }
> } else {
> if (cmd & PCI_COMMAND_MEMORY) {
> - new_addr = pci_get_long(d->config + pci_bar(d, i));
> + if (r->type & PCI_BASE_ADDRESS_MEM_TYPE_64) {
> + new_addr = pci_get_quad(d->config + pci_bar(d, i));
> + } else {
> + new_addr = pci_get_long(d->config + pci_bar(d, i));
> + }
> /* the ROM slot has a specific enable bit */
> if (i == PCI_ROM_SLOT && !(new_addr & PCI_ROM_ADDRESS_ENABLE))
> goto no_mem_map;
> @@ -531,7 +541,15 @@ static void pci_update_mappings(PCIDevice *d)
> * Without this, PC ide doesn't work well.
> * TODO: remove this work around.
> */
> - last_addr >= UINT32_MAX) {
> + (!(r->type & PCI_BASE_ADDRESS_MEM_TYPE_64) &&
> + last_addr >= UINT32_MAX) ||
> +
> + /*
> + * OS is allowed to set BAR beyond its addressable
> + * bits. For example, 32 bit OS can set 64bit bar
> + * to >4G. Check it.
> + */
> + last_addr >= TARGET_PHYS_ADDR_MAX) {
> new_addr = PCI_BAR_UNMAPPED;
> }
> } else {
> @@ -773,8 +791,15 @@ static void pci_info_device(PCIDevice *d)
> " [0x%04"FMT_PCIBUS"].\n",
> r->addr, r->addr + r->size - 1);
> } else {
> - monitor_printf(mon, "32 bit memory at 0x%08"FMT_PCIBUS
> + const char *type = r->type & PCI_BASE_ADDRESS_MEM_TYPE_64 ?
> + "64 bit" : "32 bit";
> + const char *prefetch =
> + r->type & PCI_BASE_ADDRESS_MEM_PREFETCH ?
> + " prefetchable" : "";
> +
> + monitor_printf(mon, "%s%s memory at 0x%08"FMT_PCIBUS
> " [0x%08"FMT_PCIBUS"].\n",
> + type, prefetch,
> r->addr, r->addr + r->size - 1);
> }
> }
> diff --git a/hw/pci.h b/hw/pci.h
> index 305c030..e83faf5 100644
> --- a/hw/pci.h
> +++ b/hw/pci.h
> @@ -114,6 +114,7 @@ typedef struct PCIIORegion {
> #define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */
> #define PCI_BASE_ADDRESS_SPACE_IO 0x01
> #define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00
> +#define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */
> #define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */
> #define PCI_PRIMARY_BUS 0x18 /* Primary bus number */
> #define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */
> --
> 1.6.0.2
>
>
next prev parent reply other threads:[~2009-11-01 16:10 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-30 12:20 [Qemu-devel] [PATCH V6 00/32] pci: various pci clean up and pci express support Isaku Yamahata
2009-10-30 12:20 ` [Qemu-devel] [PATCH V6 01/32] pci: fix PCI_DPRINTF() wrt variadic macro Isaku Yamahata
2009-10-30 12:20 ` [Qemu-devel] [PATCH V6 02/32] pci: introduce constant PCI_NUM_PINS for the number of interrupt pins, 4 Isaku Yamahata
2009-10-30 12:20 ` [Qemu-devel] [PATCH V6 03/32] pci: use PCI_SLOT() and PCI_FUNC() Isaku Yamahata
2009-10-30 12:20 ` [Qemu-devel] [PATCH V6 04/32] pci: define a constant to represent a unmapped bar and use it Isaku Yamahata
2009-10-30 12:20 ` [Qemu-devel] [PATCH V6 05/32] pci: helper functions to access PCIDevice::config Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 06/32] pci: use helper functions to access pci config space Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 07/32] pci/bridge: clean up of pci_bridge_initfn() Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 08/32] pci: clean up pci_init_wmask() Isaku Yamahata
2009-11-03 13:22 ` [Qemu-devel] " Michael S. Tsirkin
2009-11-10 15:26 ` Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 09/32] pci: s/PCI_ADDRESS_SPACE_/PCI_BASE_ADDRESS_SPACE_/ to match pci_regs.h Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 10/32] pci: clean up of pci_default_read_config Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 11/32] pci: make pci_bar() aware of header type 1 Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 12/32] pci_host.h: move functions in pci_host.h into .c file Isaku Yamahata
2009-11-03 13:31 ` [Qemu-devel] " Michael S. Tsirkin
2009-11-03 13:35 ` Michael S. Tsirkin
2009-11-04 4:09 ` Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 13/32] pci_host: consolidate pci config address access Isaku Yamahata
2009-11-03 13:45 ` [Qemu-devel] " Michael S. Tsirkin
2009-11-04 6:14 ` Isaku Yamahata
2009-11-04 11:50 ` Alexander Graf
2009-11-04 15:17 ` Aurelien Jarno
2009-11-04 15:37 ` Michael S. Tsirkin
2009-11-04 17:34 ` Aurelien Jarno
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 14/32] pci: introduce pcibus_t to represent pci bus address/size instead of uint32_t Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 15/32] pci: introduce FMT_PCIBUS for printf format for pcibus_t Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 16/32] pci: typedef pcibus_t as uint64_t instead of uint32_t Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 17/32] pci: 64bit bar support Isaku Yamahata
2009-11-01 16:07 ` Michael S. Tsirkin [this message]
2009-11-03 3:52 ` [Qemu-devel] " Isaku Yamahata
2009-11-03 11:47 ` Michael S. Tsirkin
2009-11-03 12:22 ` Avi Kivity
2009-11-03 12:39 ` Michael S. Tsirkin
2009-11-03 13:21 ` Michael S. Tsirkin
2009-11-03 14:01 ` Isaku Yamahata
2009-11-03 14:09 ` Michael S. Tsirkin
2009-11-04 6:20 ` Isaku Yamahata
2009-11-04 12:19 ` Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 18/32] pci: remove bus_num member from struct PCIBus Isaku Yamahata
2009-11-03 13:47 ` [Qemu-devel] " Michael S. Tsirkin
2009-11-10 15:33 ` Michael S. Tsirkin
2009-11-10 15:46 ` Michael S. Tsirkin
2009-11-12 3:12 ` Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 19/32] pci: make pci configuration transaction more accurate Isaku Yamahata
2009-11-10 15:49 ` [Qemu-devel] " Michael S. Tsirkin
2009-11-12 3:27 ` Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 20/32] pci: factor out the conversion logic from io port address into pci device Isaku Yamahata
2009-11-03 13:52 ` [Qemu-devel] " Michael S. Tsirkin
2009-11-10 15:56 ` Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 21/32] pci: move pci host stuff from pci.c to pci_host.c Isaku Yamahata
2009-11-03 14:04 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 22/32] pci_host: change the signature of pci_data_{read, write} Isaku Yamahata
2009-11-10 15:57 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 23/32] vmstate: introduce VMSTATE_BUFFER_UNSAFE_INFO Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 24/32] pci: pcie host and mmcfg support Isaku Yamahata
2009-11-03 14:50 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 25/32] pci: add helper functions to check ranges overlap Isaku Yamahata
2009-11-03 14:18 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 26/32] pci: use range helper functions Isaku Yamahata
2009-11-03 14:19 ` [Qemu-devel] " Michael S. Tsirkin
2009-11-10 15:59 ` Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 27/32] pci: teach pci_default_config_write() ROM bar for normal/bridge device Isaku Yamahata
2009-11-03 14:20 ` [Qemu-devel] " Michael S. Tsirkin
2009-11-10 16:01 ` Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 28/32] pci: initialize pci config headers depending it pci header type Isaku Yamahata
2009-11-03 14:27 ` [Qemu-devel] " Michael S. Tsirkin
2009-11-12 5:23 ` Isaku Yamahata
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 29/32] pci: cosmetic on pci_upadte_mappings() Isaku Yamahata
2009-11-03 14:17 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 30/32] pci: factor out pci_for_each_device() Isaku Yamahata
2009-11-03 14:29 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 31/32] pci: implement pci bridge filtering Isaku Yamahata
2009-11-03 15:01 ` [Qemu-devel] " Michael S. Tsirkin
2009-10-30 12:21 ` [Qemu-devel] [PATCH V6 32/32] pci/monitor: print out bridge's filtering values and so on Isaku Yamahata
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091101160730.GA21894@redhat.com \
--to=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=yamahata@valinux.co.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).