All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin O'Connor <kevin@koconnor.net>
To: Laszlo Ersek <lersek@redhat.com>
Cc: Drew <drjones@redhat.com>, "Stefan Hajnoczi" <stefanha@gmail.com>,
	"Gabriel L. Somlo" <somlo@cmu.edu>,
	qemu-devel@nongnu.org, "Gerd Hoffmann" <kraxel@redhat.com>,
	"Marc Marí" <markmb@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v4 7/7] fw_cfg: Define a static signature to be returned on DMA port reads
Date: Thu, 1 Oct 2015 13:02:13 -0400	[thread overview]
Message-ID: <20151001170213.GA10605@morn.lan> (raw)
In-Reply-To: <560D5A2A.7090403@redhat.com>

On Thu, Oct 01, 2015 at 06:07:06PM +0200, Laszlo Ersek wrote:
> On 10/01/15 14:16, Marc Marí wrote:
> > From: Kevin O'Connor <kevin@koconnor.net>
> > 
> > Return a static signature ("QEMU CFG") if the guest does a read to the
> > DMA address io register.
> > 
> > Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
> > ---
> >  docs/specs/fw_cfg.txt |  4 ++++
> >  hw/nvram/fw_cfg.c     | 13 +++++++++++--
> >  2 files changed, 15 insertions(+), 2 deletions(-)
> > 
> > diff --git a/docs/specs/fw_cfg.txt b/docs/specs/fw_cfg.txt
> > index 2d6b2da..249b99e 100644
> > --- a/docs/specs/fw_cfg.txt
> > +++ b/docs/specs/fw_cfg.txt
> > @@ -93,6 +93,10 @@ by selecting the "signature" item using key 0x0000 (FW_CFG_SIGNATURE),
> >  and reading four bytes from the data register. If the fw_cfg device is
> >  present, the four bytes read will contain the characters "QEMU".
> >  
> > +Additionaly, if the DMA interface is available then a read to the DMA
> > +Address will return 0x51454d5520434647 ("QEMU CFG" in big-endian
> > +format).
> 
> I suggest:
> 
>   Additionaly, if the DMA interface is available, then a read into the
>   DMA Address register will return the matching substring of the
>   "QEMU CFG" string. Characters that are at lower offsets of the
>   substring being read will be stored at lower addresses in the guest.

The interface only supports 32bit and 64bit writes, so I would suggest
the document not encourage 8bit reads.  The implementation happens to
works with 8bit reads, but that was just a side-effect.

[...]
> > @@ -393,6 +395,12 @@ static void fw_cfg_dma_transfer(FWCfgState *s)
> >      trace_fw_cfg_read(s, 0);
> >  }
> >  
> > +static uint64_t fw_cfg_dma_mem_read(void *opaque, hwaddr addr,
> > +                                    unsigned size)
> > +{
> > +    return FW_CFG_DMA_SIGNATURE >> ((8 - addr - size) * 8);
> > +}
> > +
> 
> After re-reading the message of QEMU commit 36b62ae6a5, I think this is
> mostly correct.
> 
> (I think *technically* it is fully correct, due to the truncation that
> is implicit in the argument passing to bswapXX(), in the
> adjust_endianness() function [memory.c].)
>
> However, for the human reader's sake, I'd like to see the
> over-significant bits masked off explicitly here, after the shift.

The value has to be truncated, as a guest inl() or readl() can't
possibly return more than 32 bits.

I think the code's harder to read with the mask in place.  Are there
any helper macros or functions in QEMU to help with register
read/writes of smaller/larger sizes than expected?  Maybe the
.impl.min_access_size should just be set to 4.

[...]
> > @@ -416,8 +424,8 @@ static void fw_cfg_dma_mem_write(void *opaque, hwaddr addr,
> >  static bool fw_cfg_dma_mem_valid(void *opaque, hwaddr addr,
> >                                    unsigned size, bool is_write)
> >  {
> > -    return is_write && ((size == 4 && (addr == 0 || addr == 4)) ||
> > -                        (size == 8 && addr == 0));
> > +    return !is_write || ((size == 4 && (addr == 0 || addr == 4)) ||
> > +                         (size == 8 && addr == 0));
> >  }
> 
> This is not good enough I think; it's possible for the guest to do an
> "inl" at offset 7 into the register, which will cause undefined behavior
> in fw_cfg_dma_mem_read(). (The shift count being negative.)

The function never gets called on unaligned accesses (.impl.unaligned
!= true), so that can't happen.

-Kevin

  reply	other threads:[~2015-10-01 17:02 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-01 12:14 QEMU fw_cfg DMA interface Marc Marí
2015-10-01 12:14 ` [Qemu-devel] " Marc Marí
2015-10-01 12:14 ` Marc Marí
     [not found] ` <1443701677-13629-1-git-send-email-markmb-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-10-01 12:15   ` [PATCH v4] QEMU fw_cfg DMA interface documentation Marc Marí
2015-10-01 12:15     ` Marc Marí
     [not found]     ` <1443701732-13696-1-git-send-email-markmb-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-10-05  8:20       ` Stefan Hajnoczi
2015-10-05  8:20         ` Stefan Hajnoczi
2015-10-05 10:06         ` Marc Marí
2015-10-05 10:11           ` Stefan Hajnoczi
2015-10-05 10:11             ` Stefan Hajnoczi
2015-10-01 12:16 ` [Qemu-devel] [PATCH v4 0/7] fw_cfg DMA interface Marc Marí
2015-10-01 12:16   ` [Qemu-devel] [PATCH v4 1/7] fw_cfg: document fw_cfg_modify_iXX() update functions Marc Marí
2015-10-01 12:16   ` [Qemu-devel] [PATCH v4 2/7] fw_cfg DMA interface documentation Marc Marí
2015-10-01 14:41     ` Laszlo Ersek
2015-10-01 12:16   ` [Qemu-devel] [PATCH v4 3/7] Implement fw_cfg DMA interface Marc Marí
2015-10-01 14:36     ` Laszlo Ersek
2015-10-01 15:52       ` Marc Marí
2015-10-01 17:18       ` Peter Maydell
2015-10-01 19:20         ` Laszlo Ersek
2015-10-06 14:44     ` Stefan Hajnoczi
2015-10-06 14:53       ` Peter Maydell
2015-10-08  9:07         ` Stefan Hajnoczi
2015-10-08 10:01           ` Marc Marí
2015-10-06 14:54       ` Marc Marí
2015-10-01 12:16   ` [Qemu-devel] [PATCH v4 4/7] Enable fw_cfg DMA interface for ARM Marc Marí
2015-10-01 14:42     ` Laszlo Ersek
2015-10-01 12:16   ` [Qemu-devel] [PATCH v4 5/7] Enable fw_cfg DMA interface for x86 Marc Marí
2015-10-01 14:48     ` Laszlo Ersek
2015-10-01 12:16   ` [Qemu-devel] [PATCH v4 6/7] Make the kernel image in the fw_cfg DMA interface bootable Marc Marí
2015-10-01 15:25     ` Laszlo Ersek
2015-10-01 16:02       ` Kevin O'Connor
2015-10-01 16:10         ` Laszlo Ersek
2015-10-01 18:15         ` Marc Marí
2015-10-02  8:16         ` Gerd Hoffmann
2015-10-02  8:24           ` Marc Marí
2015-10-02  9:01             ` Gerd Hoffmann
2015-10-02 11:47               ` Laszlo Ersek
2015-10-02 12:07                 ` Gerd Hoffmann
2015-10-02 13:25                   ` Laszlo Ersek
2015-10-02 13:30                     ` Laszlo Ersek
2015-10-03  0:05                     ` Jordan Justen
2015-10-02 13:38           ` Kevin O'Connor
2015-10-05  9:18             ` Gerd Hoffmann
2015-10-02  8:09       ` Gerd Hoffmann
2015-10-02 13:40         ` Kevin O'Connor
2015-10-02 13:50           ` Laszlo Ersek
2015-10-02 15:24           ` Daniel P. Berrange
2015-10-05  9:26           ` Gerd Hoffmann
2015-10-01 12:16   ` [Qemu-devel] [PATCH v4 7/7] fw_cfg: Define a static signature to be returned on DMA port reads Marc Marí
2015-10-01 16:07     ` Laszlo Ersek
2015-10-01 17:02       ` Kevin O'Connor [this message]
2015-10-01 17:17         ` Laszlo Ersek
2015-10-01 13:19   ` [Qemu-devel] [PATCH v4 0/7] fw_cfg DMA interface Kevin O'Connor
2015-10-01 16:03 ` [Qemu-devel] QEMU " Eric Blake
     [not found]   ` <560D5945.5050700-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-10-01 16:11     ` Eric Blake
2015-10-01 16:11       ` Eric Blake
2015-10-01 16:19       ` Laszlo Ersek
2015-10-01 16:17     ` Laszlo Ersek
2015-10-01 16:17       ` Laszlo Ersek
     [not found]       ` <560D5C7E.8080900-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-10-01 16:21         ` Eric Blake
2015-10-01 16:21           ` Eric Blake
2015-10-01 16:34           ` Laszlo Ersek

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=20151001170213.GA10605@morn.lan \
    --to=kevin@koconnor.net \
    --cc=drjones@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=lersek@redhat.com \
    --cc=markmb@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=somlo@cmu.edu \
    --cc=stefanha@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.