On Wed, Jan 28, 2015 at 07:49:48PM +1100, Alexey Kardashevskiy wrote: > On 01/28/2015 08:21 AM, Alexey Kardashevskiy wrote: > > On 01/27/2015 05:13 PM, Alexey Kardashevskiy wrote: [snip] > >> diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h > >> index 46edc2a..6ad55d1 100644 > >> --- a/include/hw/ppc/spapr_vio.h > >> +++ b/include/hw/ppc/spapr_vio.h > >> @@ -64,6 +64,8 @@ struct VIOsPAPRDevice { > >> target_ulong signal_state; > >> VIOsPAPR_CRQ crq; > >> AddressSpace as; > >> + MemoryRegion mrroot; > >> + MemoryRegion mrbypass; > >> sPAPRTCETable *tcet; > >> }; > >> > >> > > > > > > > I believe doing something like this is way too disguising because of > tobj->parent?
It's kinda ugly, but it's the best way I can think of. So, I think this is a reasonable approach, but it does need a comment saying why the hack is necessary. > > > > --- a/hw/ppc/spapr_iommu.c > +++ b/hw/ppc/spapr_iommu.c > @@ -25,6 +25,7 @@ > #include "trace.h" > > #include "hw/ppc/spapr.h" > +#include "hw/ppc/spapr_vio.h" > > #include <libfdt.h> > > @@ -88,10 +89,26 @@ static IOMMUTLBEntry > spapr_tce_translate_iommu(MemoryRegion *iommu, hwaddr addr, > return ret; > } > > +static int spapr_tce_table_post_load(void *opaque, int version_id) > +{ > + sPAPRTCETable *tcet = SPAPR_TCE_TABLE(opaque); > + Object *tobj = OBJECT(tcet); > + Object *vobj = object_dynamic_cast(tobj->parent, TYPE_VIO_SPAPR_DEVICE); > + > + if (!vobj) { > + return 0; > + } > + > + spapr_vio_set_bypass((VIOsPAPRDevice *) vobj, tcet->bypass); > + > + return 0; > +} > + > static const VMStateDescription vmstate_spapr_tce_table = { > .name = "spapr_iommu", > .version_id = 2, > .minimum_version_id = 2, > + .post_load = spapr_tce_table_post_load, > .fields = (VMStateField []) { > /* Sanity check */ > VMSTATE_UINT32_EQUAL(liobn, sPAPRTCETable), > > > -- 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
pgpnypLU8hg6Y.pgp
Description: PGP signature