aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/vpic.c
diff options
context:
space:
mode:
authorTim Deegan <Tim.Deegan@xensource.com>2007-01-20 11:17:40 +0000
committerTim Deegan <Tim.Deegan@xensource.com>2007-01-20 11:17:40 +0000
commit7a04b0ca7e8949cd87343d1d53f11d681cff64d1 (patch)
treef16ed9d1e48f56f496fb4ddeaf65b72a4f3a32d8 /xen/arch/x86/hvm/vpic.c
parent820c0c0735181f2ea3fd80d56a39455a2ae21b66 (diff)
downloadxen-7a04b0ca7e8949cd87343d1d53f11d681cff64d1.tar.gz
xen-7a04b0ca7e8949cd87343d1d53f11d681cff64d1.tar.bz2
xen-7a04b0ca7e8949cd87343d1d53f11d681cff64d1.zip
[HVM] Save/restore cleanups 03: IRQ
IRQ, PIC, IOAPIC and LAPIC Signed-off-by: Tim Deegan <Tim.Deegan@xensource.com>
Diffstat (limited to 'xen/arch/x86/hvm/vpic.c')
-rw-r--r--xen/arch/x86/hvm/vpic.c84
1 files changed, 25 insertions, 59 deletions
diff --git a/xen/arch/x86/hvm/vpic.c b/xen/arch/x86/hvm/vpic.c
index 4f36dd3bdf..290b5f3129 100644
--- a/xen/arch/x86/hvm/vpic.c
+++ b/xen/arch/x86/hvm/vpic.c
@@ -35,9 +35,9 @@
#include <asm/hvm/support.h>
#define vpic_domain(v) (container_of((v), struct domain, \
- arch.hvm_domain.irq.vpic[!vpic->is_master]))
-#define __vpic_lock(v) &container_of((v), struct hvm_irq, \
- vpic[!(v)->is_master])->lock
+ arch.hvm_domain.vpic[!vpic->is_master]))
+#define __vpic_lock(v) &container_of((v), struct hvm_domain, \
+ vpic[!(v)->is_master])->irq_lock
#define vpic_lock(v) spin_lock(__vpic_lock(v))
#define vpic_unlock(v) spin_unlock(__vpic_lock(v))
#define vpic_is_locked(v) spin_is_locked(__vpic_lock(v))
@@ -45,7 +45,7 @@
/* Return the highest priority found in mask. Return 8 if none. */
#define VPIC_PRIO_NONE 8
-static int vpic_get_priority(struct vpic *vpic, uint8_t mask)
+static int vpic_get_priority(struct hvm_hw_vpic *vpic, uint8_t mask)
{
int prio;
@@ -61,7 +61,7 @@ static int vpic_get_priority(struct vpic *vpic, uint8_t mask)
}
/* Return the PIC's highest priority pending interrupt. Return -1 if none. */
-static int vpic_get_highest_priority_irq(struct vpic *vpic)
+static int vpic_get_highest_priority_irq(struct hvm_hw_vpic *vpic)
{
int cur_priority, priority, irq;
uint8_t mask;
@@ -92,7 +92,7 @@ static int vpic_get_highest_priority_irq(struct vpic *vpic)
return (priority < cur_priority) ? irq : -1;
}
-static void vpic_update_int_output(struct vpic *vpic)
+static void vpic_update_int_output(struct hvm_hw_vpic *vpic)
{
int irq;
@@ -129,7 +129,7 @@ static void vpic_update_int_output(struct vpic *vpic)
}
}
-static void __vpic_intack(struct vpic *vpic, int irq)
+static void __vpic_intack(struct hvm_hw_vpic *vpic, int irq)
{
uint8_t mask = 1 << irq;
@@ -147,7 +147,7 @@ static void __vpic_intack(struct vpic *vpic, int irq)
vpic_update_int_output(vpic);
}
-static int vpic_intack(struct vpic *vpic)
+static int vpic_intack(struct hvm_hw_vpic *vpic)
{
int irq = -1;
@@ -174,7 +174,7 @@ static int vpic_intack(struct vpic *vpic)
return irq;
}
-static void vpic_ioport_write(struct vpic *vpic, uint32_t addr, uint32_t val)
+static void vpic_ioport_write(struct hvm_hw_vpic *vpic, uint32_t addr, uint32_t val)
{
int priority, cmd, irq;
uint8_t mask;
@@ -291,7 +291,7 @@ static void vpic_ioport_write(struct vpic *vpic, uint32_t addr, uint32_t val)
vpic_unlock(vpic);
}
-static uint32_t vpic_ioport_read(struct vpic *vpic, uint32_t addr)
+static uint32_t vpic_ioport_read(struct hvm_hw_vpic *vpic, uint32_t addr)
{
if ( vpic->poll )
{
@@ -307,7 +307,7 @@ static uint32_t vpic_ioport_read(struct vpic *vpic, uint32_t addr)
static int vpic_intercept_pic_io(ioreq_t *p)
{
- struct vpic *vpic;
+ struct hvm_hw_vpic *vpic;
uint32_t data;
if ( (p->size != 1) || (p->count != 1) )
@@ -316,7 +316,7 @@ static int vpic_intercept_pic_io(ioreq_t *p)
return 1;
}
- vpic = &current->domain->arch.hvm_domain.irq.vpic[p->addr >> 7];
+ vpic = &current->domain->arch.hvm_domain.vpic[p->addr >> 7];
if ( p->dir == IOREQ_WRITE )
{
@@ -340,7 +340,7 @@ static int vpic_intercept_pic_io(ioreq_t *p)
static int vpic_intercept_elcr_io(ioreq_t *p)
{
- struct vpic *vpic;
+ struct hvm_hw_vpic *vpic;
uint32_t data;
if ( (p->size != 1) || (p->count != 1) )
@@ -349,7 +349,7 @@ static int vpic_intercept_elcr_io(ioreq_t *p)
return 1;
}
- vpic = &current->domain->arch.hvm_domain.irq.vpic[p->addr & 1];
+ vpic = &current->domain->arch.hvm_domain.vpic[p->addr & 1];
if ( p->dir == IOREQ_WRITE )
{
@@ -379,7 +379,7 @@ static int vpic_intercept_elcr_io(ioreq_t *p)
}
#ifdef HVM_DEBUG_SUSPEND
-static void vpic_info(struct vpic *s)
+static void vpic_info(struct hvm_hw_vpic *s)
{
printk("*****pic state:*****\n");
printk("pic 0x%x.\n", s->irr);
@@ -399,61 +399,27 @@ static void vpic_info(struct vpic *s)
printk("pic 0x%x.\n", s->is_master);
}
#else
-static void vpic_info(struct vpic *s)
+static void vpic_info(struct hvm_hw_vpic *s)
{
}
#endif
static void vpic_save(hvm_domain_context_t *h, void *opaque)
{
- struct vpic *s = opaque;
+ struct hvm_hw_vpic *s = opaque;
vpic_info(s);
-
- hvm_put_8u(h, s->irr);
- hvm_put_8u(h, s->imr);
- hvm_put_8u(h, s->isr);
- hvm_put_8u(h, s->irq_base);
- hvm_put_8u(h, s->init_state);
- hvm_put_8u(h, s->priority_add);
- hvm_put_8u(h, s->readsel_isr);
-
- hvm_put_8u(h, s->poll);
- hvm_put_8u(h, s->auto_eoi);
-
- hvm_put_8u(h, s->rotate_on_auto_eoi);
- hvm_put_8u(h, s->special_fully_nested_mode);
- hvm_put_8u(h, s->special_mask_mode);
-
- hvm_put_8u(h, s->elcr);
- hvm_put_8u(h, s->int_output);
+ hvm_put_struct(h, s);
}
static int vpic_load(hvm_domain_context_t *h, void *opaque, int version_id)
{
- struct vpic *s = opaque;
+ struct hvm_hw_vpic *s = opaque;
if (version_id != 1)
return -EINVAL;
- s->irr = hvm_get_8u(h);
- s->imr = hvm_get_8u(h);
- s->isr = hvm_get_8u(h);
- s->irq_base = hvm_get_8u(h);
- s->init_state = hvm_get_8u(h);
- s->priority_add = hvm_get_8u(h);
- s->readsel_isr = hvm_get_8u(h);
-
- s->poll = hvm_get_8u(h);
- s->auto_eoi = hvm_get_8u(h);
-
- s->rotate_on_auto_eoi = hvm_get_8u(h);
- s->special_fully_nested_mode = hvm_get_8u(h);
- s->special_mask_mode = hvm_get_8u(h);
-
- s->elcr = hvm_get_8u(h);
- s->int_output = hvm_get_8u(h);
-
+ hvm_get_struct(h, s);
vpic_info(s);
return 0;
@@ -461,10 +427,10 @@ static int vpic_load(hvm_domain_context_t *h, void *opaque, int version_id)
void vpic_init(struct domain *d)
{
- struct vpic *vpic;
+ struct hvm_hw_vpic *vpic;
/* Master PIC. */
- vpic = &d->arch.hvm_domain.irq.vpic[0];
+ vpic = &d->arch.hvm_domain.vpic[0];
memset(vpic, 0, sizeof(*vpic));
vpic->is_master = 1;
vpic->elcr = 1 << 2;
@@ -482,7 +448,7 @@ void vpic_init(struct domain *d)
void vpic_irq_positive_edge(struct domain *d, int irq)
{
- struct vpic *vpic = &d->arch.hvm_domain.irq.vpic[irq >> 3];
+ struct hvm_hw_vpic *vpic = &d->arch.hvm_domain.vpic[irq >> 3];
uint8_t mask = 1 << (irq & 7);
ASSERT(irq <= 15);
@@ -498,7 +464,7 @@ void vpic_irq_positive_edge(struct domain *d, int irq)
void vpic_irq_negative_edge(struct domain *d, int irq)
{
- struct vpic *vpic = &d->arch.hvm_domain.irq.vpic[irq >> 3];
+ struct hvm_hw_vpic *vpic = &d->arch.hvm_domain.vpic[irq >> 3];
uint8_t mask = 1 << (irq & 7);
ASSERT(irq <= 15);
@@ -515,7 +481,7 @@ void vpic_irq_negative_edge(struct domain *d, int irq)
int cpu_get_pic_interrupt(struct vcpu *v, int *type)
{
int irq, vector;
- struct vpic *vpic = &v->domain->arch.hvm_domain.irq.vpic[0];
+ struct hvm_hw_vpic *vpic = &v->domain->arch.hvm_domain.vpic[0];
if ( !vlapic_accept_pic_intr(v) || !vpic->int_output )
return -1;