From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=51039 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PHvbE-00075z-10 for qemu-devel@nongnu.org; Mon, 15 Nov 2010 04:43:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PHvb8-0004Fj-Pt for qemu-devel@nongnu.org; Mon, 15 Nov 2010 04:43:43 -0500 Received: from demumfd002.nsn-inter.net ([93.183.12.31]:11750) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PHvb8-0004FA-Hp for qemu-devel@nongnu.org; Mon, 15 Nov 2010 04:43:38 -0500 Message-ID: <4CE100C5.3010506@nsn.com> Date: Mon, 15 Nov 2010 10:43:33 +0100 From: Bernhard Kohl MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH RESENT] msix: allow byte and word reading from mmio References: <1282222611-21192-1-git-send-email-bernhard.kohl@nsn.com> <4C7197D8.4070208@codemonkey.ws> In-Reply-To: <4C7197D8.4070208@codemonkey.ws> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: ext Anthony Liguori Cc: qemu-devel@nongnu.org, mst@redhat.com Am 22.08.2010 23:34, schrieb ext Anthony Liguori: > On 08/19/2010 07:56 AM, Bernhard Kohl wrote: > >> It's legal that the guest reads a single byte or word from mmio. >> I have an OS which reads single bytes and it works fine on real >> hardware. Maybe this happens due to casting. >> >> Signed-off-by: Bernhard Kohl >> >> > Hi Michael, > > I'm looking for this to come through your tree unless you disagree. > > Regards, > > Anthony Liguori > Hi, could you please look at this again? Thanks Bernhard > >> --- >> hw/msix.c | 20 ++++++++++++++++---- >> 1 files changed, 16 insertions(+), 4 deletions(-) >> >> diff --git a/hw/msix.c b/hw/msix.c >> index d99403a..7dac7f7 100644 >> --- a/hw/msix.c >> +++ b/hw/msix.c >> @@ -100,10 +100,22 @@ static uint32_t msix_mmio_readl(void *opaque, target_phys_addr_t addr) >> return pci_get_long(page + offset); >> } >> >> -static uint32_t msix_mmio_read_unallowed(void *opaque, target_phys_addr_t addr) >> +static uint32_t msix_mmio_readw(void *opaque, target_phys_addr_t addr) >> { >> - fprintf(stderr, "MSI-X: only dword read is allowed!\n"); >> - return 0; >> + PCIDevice *dev = opaque; >> + unsigned int offset = addr& (MSIX_PAGE_SIZE - 1)& ~0x1; >> + void *page = dev->msix_table_page; >> + >> + return pci_get_word(page + offset); >> +} >> + >> +static uint32_t msix_mmio_readb(void *opaque, target_phys_addr_t addr) >> +{ >> + PCIDevice *dev = opaque; >> + unsigned int offset = addr& (MSIX_PAGE_SIZE - 1); >> + void *page = dev->msix_table_page; >> + >> + return pci_get_byte(page + offset); >> } >> >> static uint8_t msix_pending_mask(int vector) >> @@ -198,7 +210,7 @@ static CPUWriteMemoryFunc * const msix_mmio_write[] = { >> }; >> >> static CPUReadMemoryFunc * const msix_mmio_read[] = { >> - msix_mmio_read_unallowed, msix_mmio_read_unallowed, msix_mmio_readl >> + msix_mmio_readb, msix_mmio_readw, msix_mmio_readl >> }; >> >> /* Should be called from device's map method. */ >> >> > >