[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC PATCH V1 05/12] hvm/dm: Introduce xendevicemodel_set_irq_level DM op
On Sat, 8 Aug 2020 at 10:27, Julien Grall <julien.grall.oss@xxxxxxxxx> wrote: > > On Fri, 7 Aug 2020 at 22:51, Stefano Stabellini <sstabellini@xxxxxxxxxx> > wrote: > > > > On Fri, 7 Aug 2020, Jan Beulich wrote: > > > On 07.08.2020 01:49, Stefano Stabellini wrote: > > > > On Thu, 6 Aug 2020, Julien Grall wrote: > > > >> On 06/08/2020 01:37, Stefano Stabellini wrote: > > > >>> On Wed, 5 Aug 2020, Julien Grall wrote: > > > >>>> On 05/08/2020 00:22, Stefano Stabellini wrote: > > > >>>>> On Mon, 3 Aug 2020, Oleksandr Tyshchenko wrote: > > > >>>>>> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx> > > > >>>>>> > > > >>>>>> This patch adds ability to the device emulator to notify otherend > > > >>>>>> (some entity running in the guest) using a SPI and implements Arm > > > >>>>>> specific bits for it. Proposed interface allows emulator to set > > > >>>>>> the logical level of a one of a domain's IRQ lines. > > > >>>>>> > > > >>>>>> Please note, this is a split/cleanup of Julien's PoC: > > > >>>>>> "Add support for Guest IO forwarding to a device emulator" > > > >>>>>> > > > >>>>>> Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > > > >>>>>> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx> > > > >>>>>> --- > > > >>>>>> tools/libs/devicemodel/core.c | 18 > > > >>>>>> ++++++++++++++++++ > > > >>>>>> tools/libs/devicemodel/include/xendevicemodel.h | 4 ++++ > > > >>>>>> tools/libs/devicemodel/libxendevicemodel.map | 1 + > > > >>>>>> xen/arch/arm/dm.c | 22 > > > >>>>>> +++++++++++++++++++++- > > > >>>>>> xen/common/hvm/dm.c | 1 + > > > >>>>>> xen/include/public/hvm/dm_op.h | 15 > > > >>>>>> +++++++++++++++ > > > >>>>>> 6 files changed, 60 insertions(+), 1 deletion(-) > > > >>>>>> > > > >>>>>> diff --git a/tools/libs/devicemodel/core.c > > > >>>>>> b/tools/libs/devicemodel/core.c > > > >>>>>> index 4d40639..30bd79f 100644 > > > >>>>>> --- a/tools/libs/devicemodel/core.c > > > >>>>>> +++ b/tools/libs/devicemodel/core.c > > > >>>>>> @@ -430,6 +430,24 @@ int xendevicemodel_set_isa_irq_level( > > > >>>>>> return xendevicemodel_op(dmod, domid, 1, &op, sizeof(op)); > > > >>>>>> } > > > >>>>>> +int xendevicemodel_set_irq_level( > > > >>>>>> + xendevicemodel_handle *dmod, domid_t domid, uint32_t irq, > > > >>>>>> + unsigned int level) > > > >>>>> > > > >>>>> It is a pity that having xen_dm_op_set_pci_intx_level and > > > >>>>> xen_dm_op_set_isa_irq_level already we need to add a third one, but > > > >>>>> from > > > >>>>> the names alone I don't think we can reuse either of them. > > > >>>> > > > >>>> The problem is not the name... > > > >>>> > > > >>>>> > > > >>>>> It is very similar to set_isa_irq_level. We could almost rename > > > >>>>> xendevicemodel_set_isa_irq_level to xendevicemodel_set_irq_level or, > > > >>>>> better, just add an alias to it so that > > > >>>>> xendevicemodel_set_irq_level is > > > >>>>> implemented by calling xendevicemodel_set_isa_irq_level. Honestly I > > > >>>>> am > > > >>>>> not sure if it is worth doing it though. Any other opinions? > > > >>>> > > > >>>> ... the problem is the interrupt field is only 8-bit. So we would > > > >>>> only be > > > >>>> able > > > >>>> to cover IRQ 0 - 255. > > > >>> > > > >>> Argh, that's not going to work :-( I wasn't sure if it was a good > > > >>> idea > > > >>> anyway. > > > >>> > > > >>> > > > >>>> It is not entirely clear how the existing subop could be extended > > > >>>> without > > > >>>> breaking existing callers. > > > >>>> > > > >>>>> But I think we should plan for not needing two calls (one to set > > > >>>>> level > > > >>>>> to 1, and one to set it to 0): > > > >>>>> https://marc.info/?l=xen-devel&m=159535112027405 > > > >>>> > > > >>>> I am not sure to understand your suggestion here? Are you suggesting > > > >>>> to > > > >>>> remove > > > >>>> the 'level' parameter? > > > >>> > > > >>> My hope was to make it optional to call the hypercall with level = 0, > > > >>> not necessarily to remove 'level' from the struct. > > > >> > > > >> From my understanding, the hypercall is meant to represent the status > > > >> of the > > > >> line between the device and the interrupt controller (either low or > > > >> high). > > > >> > > > >> This is then up to the interrupt controller to decide when the > > > >> interrupt is > > > >> going to be fired: > > > >> - For edge interrupt, this will fire when the line move from low to > > > >> high (or > > > >> vice versa). > > > >> - For level interrupt, this will fire when line is high (assuming > > > >> level > > > >> trigger high) and will keeping firing until the device decided to > > > >> lower the > > > >> line. > > > >> > > > >> For a device, it is common to keep the line high until an OS wrote to a > > > >> specific register. > > > >> > > > >> Furthermore, technically, the guest OS is in charge to configure how an > > > >> interrupt is triggered. Admittely this information is part of the DT, > > > >> but > > > >> nothing prevent a guest to change it. > > > >> > > > >> As side note, we have a workaround in Xen for some buggy DT (see the > > > >> arch > > > >> timer) exposing the wrong trigger type. > > > >> > > > >> Because of that, I don't really see a way to make optional. Maybe you > > > >> have > > > >> something different in mind? > > > > > > > > For level, we need the level parameter. For edge, we are only interested > > > > in the "edge", right? > > > > > > I don't think so, unless Arm has special restrictions. Edges can be > > > both rising and falling ones. > > > > And the same is true for level interrupts too: they could be active-low > > or active-high. > > > > > > Instead of modelling the state of the line, which seems to be a bit > > error prone especially in the case of a single-device emulator that > > might not have enough information about the rest of the system (it might > > not know if the interrupt is active-high or active-low), we could model > > the triggering of the interrupt instead. > > I am not sure to understand why the single (or event multiple) device > emulator needs to know the trigger type. The information of the I mean trigger type configured by the OS here. Sorry for the confusion. > trigger type of the interrupt would be described in the firmware table > and it is expected to be the same as what the emulator expects. > > If the guest OS decided to configure wrongly the interrupt trigger > type, then it may not work properly. But, from my understanding, this > doesn't differ from the HW behavior. > > > > > In the case of level=1, it would mean that the interrupt line is active, > > no matter if it is active-low or active-high. In the case of level=0, it > > would mean that it is inactive. > > > > Similarly, in the case of an edge interrupt edge=1 or level=1 would mean > > that there is an edge, no matter if it is rising or falling. > > TBH, I think your approach is only going to introduce more headache in > Xen if a guest OS decides to change the trigger type. > > It feels much easier to just ask the emulator to let us know the level > of the line. Then if the guest OS decides to change the trigger type, > we only need to resample the line. > > Cheers,
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |