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