Port-xen archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: ioapic: adaption required?



On Mon, Oct 08, 2007 at 02:09:23PM +0200, Christoph Egger wrote:
> On Monday 08 October 2007 13:33:38 Manuel Bouyer wrote:
> > On Mon, Oct 08, 2007 at 01:22:32PM +0200, Christoph Egger wrote:
> > > > xen/include/i82093var.h Or maybe you mean to use APIC operations to
> > > > query/ack the interrupts instead of these hypercalls ?
> > >
> > > I'm talking about the hypercall used in pirq_establish() in xen/evtchn.c.
> >
> > Do you know what should be used instead now ?
> 
> The information is in  include/xen3-public/physdev.h.
> 
> To acknowledge an interrupt use:
> 
> /*
>  * Notify end-of-interrupt (EOI) for the specified IRQ.
>  * @arg == pointer to physdev_eoi structure.
>  */
> #define PHYSDEVOP_eoi                   12
> struct physdev_eoi {
>     /* IN */
>     uint32_t irq;
> };
> 
> To query for an interrupt use:
> 
> /*
>  * Query the status of an IRQ line.
>  * @arg == pointer to physdev_irq_status_query structure.
>  */
> #define PHYSDEVOP_irq_status_query       5
> struct physdev_irq_status_query {
>     /* IN */
>     uint32_t irq;
>     /* OUT */
>     uint32_t flags; /* XENIRQSTAT_* */
> };
> 
> /* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */
> #define _XENIRQSTAT_needs_eoi   (0)
> #define  XENIRQSTAT_needs_eoi   (1U<<_XENIRQSTAT_needs_eoi)
> 
> /* IRQ shared by multiple guests? */
> #define _XENIRQSTAT_shared      (1)
> #define  XENIRQSTAT_shared      (1U<<_XENIRQSTAT_shared)
> 
> To set VCPU's iopl use:
> 
> /*
>  * Set the current VCPU's I/O privilege level.
>  * @arg == pointer to physdev_set_iopl structure.
>  */
> #define PHYSDEVOP_set_iopl               6
> struct physdev_set_iopl {
>     /* IN */
>     uint32_t iopl;
> };
> 
> To allocate/free an interrupt use:
> 
> /*
>  * Allocate or free a physical upcall vector for the specified IRQ line.
>  * @arg == pointer to physdev_irq structure.
>  */
> #define PHYSDEVOP_alloc_irq_vector      10
> #define PHYSDEVOP_free_irq_vector       11
> struct physdev_irq {
>     /* IN */
>     uint32_t irq;
>     /* IN or OUT */
>     uint32_t vector;
> };
> 
> 
> The new physdev_op collects all these structs in an union:
> 
> 
> struct physdev_op {
>     uint32_t cmd;
>     union {
>         struct physdev_irq_status_query      irq_status_query;
>         struct physdev_set_iopl              set_iopl;
>         struct physdev_set_iobitmap          set_iobitmap;
>         struct physdev_apic                  apic_op;
>         struct physdev_irq                   irq_op;
>     } u;
> };
> 
> So, fill out the structure, set cmd to one of the above's #define,
> then do the hypercall.

PHYSDEVOP_eoi and PHYSDEVOP_irq_status_query looks a lot like what we're
doing now with the old call; as long as we're not sharing IRQs with
multiple guests, I'm not sure it makes a difference.
Maybe PHYSDEVOP_alloc_irq_vector/PHYSDEVOP_free_irq_vector could make a
difference with what we do now (PHYSDEVOP_ASSIGN_VECTOR), although I
don't seee in which way for now (vectors have not been alloctated at
this point, PHYSDEVOP_free_irq_vector isn't that usefull for us).

-- 
Manuel Bouyer, LIP6, Universite Paris VI.           
Manuel.Bouyer%lip6.fr@localhost
     NetBSD: 26 ans d'experience feront toujours la difference
--



Home | Main Index | Thread Index | Old Index