[SLOF] [PATCH v4] board-qemu: add private hcall to inform host on "phandle" update
David Gibson
david at gibson.dropbear.id.au
Thu Sep 7 19:54:33 AEST 2017
On Thu, Sep 07, 2017 at 09:56:12AM +0200, Greg Kurz wrote:
> On Thu, 7 Sep 2017 16:38:00 +1000
> David Gibson <david at gibson.dropbear.id.au> wrote:
>
> > On Wed, Sep 06, 2017 at 10:05:41AM -0500, Segher Boessenkool wrote:
> > > On Wed, Sep 06, 2017 at 04:40:58PM +0200, Greg Kurz wrote:
> > > > > A phandle is an opaque cookie to everything but the firmware itself.
> > > > > Using pointers to some internal structure works just fine; most Open
> > > > > Firmware implementations do this.
> > > > >
> > > > > Anything other than OF itself should *not* make up phandles. There
> > > > > is no way to guarantee these will be unique, so it is a non-starter.
> > > > >
> > > > > If QEMU wants to create a device node, it should ask OF to do it,
> > > > > say, via new-device.
> > >
> > > > Hmm... QEMU creates an FDT and writes it into the guest memory to pass
> > > > it to SLOF.
> > >
> > > It probably should skip that FDT intermediate step, just create all
> > > nodes it wants directly? Sounds a lot simpler, and all current phandle
> > > problems will disappear too.
> >
> > No, it would be a complete PITA. We'd have to have a way of running
> > the guest (running SLOF) concurrent with the qemu machine reset code,
> > communicating OF commands in, and responses back. As it is now, we
> > just drop the FDT into guest memory before SLOF executes its first
> > instruction.
> >
> > This is actually perfectly sound, even with an archaically OF centric
> > view of the world. OF is allowed to build its DT from other
> > information available to it. In this case that other data just
> > happens to be a FDT which will, in practice, look pretty similar to
> > OF's final DT. The information flow is strictly in one direction:
> > qemu to OF to guest.
> >
> > In other words OF *does* allocate all the phandles itself - in the
> > tree it presents to the guest. The phandles allocated by qemu are
> > overwritten and obsolete by the time the guest gets the DT from OF.
> >
> > The problem comes when we need to do hotplug, and qemu needs to inject
> > DT fragments long after SLOF is dead. So far it works, because the
> > only things about the existing output-from-SLOF tree we rely on would
> > be completely perverse for SLOF to gratuitously change from the
> > input-to-SLOF DT. To allow PHB hotplug, though, we need the master
> > XICS phandle, and SLOF *does* change all the phandles, so we don't
> > know it. Hence this proposal.
> >
> > I don't like this proposal precisely because it does make the DT
> > communication two way between qemu and SLOF, which has the prospect to
> > make things far, far uglier.
> >
> > Unfortunately, I'm yet to see a better way to do this.
> >
> > > > QEMU uses arbitrary and unique numbers when a phandle is
> > > > needed (we just need one actually for the interrupt controller which
> > > > is referenced by each PHB). SLOF then fixes all the QEMU-generated
> > > > phandles to "opaque cookies" (see commit 82954d4c1088)... the problem
> > > > is that if we want to hotplug another PHB later on, SLOF isn't involved
> > > > anymore and QEMU doesn't know about the "opaque cookie" to be put in
> > > > the node for this PHB... I hope I'm clear enough.
> > > >
> > > > This being said, you partly answer the question when you say:
> > > >
> > > > "A phandle is an opaque cookie to everything but the firmware itself."
> > > >
> > > > and
> > > >
> > > > "Anything other than OF itself should *not* make up phandles."
> > > >
> > > > Even if QEMU takes care of only forging unique phandles,
> > >
> > > It cannot. It cannot know about all phandles the firmware uses. It
> > > can guess, sure, but that is very fragile.
> > >
> > > > it already
> > > > does some arm-twisting with the OF specification... but would it be
> > > > acceptable for SLOF to have a translation table when using phandles
> > > > generated by QEMU ?
> >
> > I'm not sure exactly what you mean by this. Converting SLOF to use
> > qemu supplied phandles everywhere would be possible, I think, but very
> > awkward and ugly.
> >
>
> I had this last mail from you in mind, when I posted the PHB hotplug series:
>
> https://lists.nongnu.org/archive/html/qemu-ppc/2017-08/msg00005.html
>
> "I'd be thinking of replacing the direct pointer dereferences for
> phandles with a simple lookup table of phandle to pointer, populated
> as we unflatten the tree."
Ah, right. Since then I talked to Thomas and discovered this was
harder than I thought.
> > Applying some sort of translation just to the hotplugged fragments
> > isn't possible because SLOF is no longer around by the time of the
> > hotplug. qemu talks directly to the guest.
>
> Yes of course... hence the initial proposal of having SLOF to send any
> phandle value it *fixes* back to QEMU (only one with the current code).
>
> > > Then you need to translate from "qhandle" to phandle every time anything
> > > changes, keep both up to date. Why not just have actual phandles?
> > > Those stay up to date always (namely, they never change).
> > >
> > > Why does QEMU think it is a good idea to make up phandles out of thin
> > > air? Or, why does it do it if it is not a good idea?
> >
> > It doesn't. The problem is that it needs to *know* a phandle that
> > SLOF made up in order to make a compatible hotplug fragment. At
> > present it has no way to do that - qemu never sees the
> > output-from-SLOF DT.
> >
>
> <thinking aloud>
> Would it be more acceptable to send back the updated value of the
> XICS phandle through CAS ?
> </thinking aloud>
I don't think that makes sense. I mean CAS is a negotiation between
guest OS and firmware. We use a custom hypercall to punt most of it
from firmware to hypervisor. We could piggyback on that to add
firmware -> hypervisor information, but I think it would be
functionally equivalent to an update phandle hypercall, just more
awkward.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/slof/attachments/20170907/3dc6348e/attachment.sig>
More information about the SLOF
mailing list