# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1191425603 -3600
# Node ID ca1085e8ab82d33bffb01a1a0fa9d507bbcff5f1
# Parent 74a3ee6e1795b46527437107185df78440cbaf67
hvm: More changes to reduce size of domain structure.
It is now smaller than a page (4kB) on x86/32 and x86/64.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
xen/arch/x86/hvm/hvm.c | 6 ++++-
xen/arch/x86/hvm/i8254.c | 42 ++++++++++++++++----------------------
xen/arch/x86/hvm/vioapic.c | 31 +++++++++++++++++++---------
xen/include/asm-x86/hvm/domain.h | 3 +-
xen/include/asm-x86/hvm/vioapic.h | 14 +++++++++---
xen/include/asm-x86/hvm/vpt.h | 4 +--
6 files changed, 59 insertions(+), 41 deletions(-)
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/arch/x86/hvm/hvm.c Wed Oct 03 16:33:23 2007 +0100
@@ -232,7 +232,10 @@ int hvm_domain_initialise(struct domain
return rc;
vpic_init(d);
- vioapic_init(d);
+
+ rc = vioapic_init(d);
+ if ( rc != 0 )
+ return rc;
hvm_init_ioreq_page(d, &d->arch.hvm_domain.ioreq);
hvm_init_ioreq_page(d, &d->arch.hvm_domain.buf_ioreq);
@@ -254,6 +257,7 @@ void hvm_domain_destroy(struct domain *d
void hvm_domain_destroy(struct domain *d)
{
hvm_funcs.domain_destroy(d);
+ vioapic_deinit(d);
}
static int hvm_save_cpu_ctxt(struct domain *d, hvm_domain_context_t *h)
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/arch/x86/hvm/i8254.c
--- a/xen/arch/x86/hvm/i8254.c Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/arch/x86/hvm/i8254.c Wed Oct 03 16:33:23 2007 +0100
@@ -185,7 +185,6 @@ static void pit_load_count(PITState *pit
{
u32 period;
struct hvm_hw_pit_channel *s = &pit->hw.channels[channel];
- struct periodic_time *pt = &pit->pt[channel];
struct vcpu *v = vpit_vcpu(pit);
ASSERT(spin_is_locked(&pit->lock));
@@ -207,16 +206,16 @@ static void pit_load_count(PITState *pit
{
case 2:
/* Periodic timer. */
- create_periodic_time(v, pt, period, 0, 0, pit_time_fired,
+ create_periodic_time(v, &pit->pt0, period, 0, 0, pit_time_fired,
&pit->count_load_time[channel]);
break;
case 1:
/* One-shot timer. */
- create_periodic_time(v, pt, period, 0, 1, pit_time_fired,
+ create_periodic_time(v, &pit->pt0, period, 0, 1, pit_time_fired,
&pit->count_load_time[channel]);
break;
default:
- destroy_periodic_time(pt);
+ destroy_periodic_time(&pit->pt0);
break;
}
}
@@ -396,7 +395,7 @@ void pit_stop_channel0_irq(PITState *pit
void pit_stop_channel0_irq(PITState *pit)
{
spin_lock(&pit->lock);
- destroy_periodic_time(&pit->pt[0]);
+ destroy_periodic_time(&pit->pt0);
spin_unlock(&pit->lock);
}
@@ -425,21 +424,18 @@ static void pit_info(PITState *pit)
printk("pit 0x%x.\n", s->gate);
printk("pit %"PRId64"\n", pit->count_load_time[i]);
- pt = &pit->pt[i];
- if ( pt )
- {
- printk("pit channel %d has a periodic timer:\n", i);
- printk("pt %d.\n", pt->enabled);
- printk("pt %d.\n", pt->one_shot);
- printk("pt %d.\n", pt->irq);
- printk("pt %d.\n", pt->first_injected);
-
- printk("pt %d.\n", pt->pending_intr_nr);
- printk("pt %d.\n", pt->period);
- printk("pt %"PRId64"\n", pt->period_cycles);
- printk("pt %"PRId64"\n", pt->last_plt_gtime);
- }
- }
+ }
+
+ pt = &pit->pt0;
+ printk("pit channel 0 periodic timer:\n", i);
+ printk("pt %d.\n", pt->enabled);
+ printk("pt %d.\n", pt->one_shot);
+ printk("pt %d.\n", pt->irq);
+ printk("pt %d.\n", pt->first_injected);
+ printk("pt %d.\n", pt->pending_intr_nr);
+ printk("pt %d.\n", pt->period);
+ printk("pt %"PRId64"\n", pt->period_cycles);
+ printk("pt %"PRId64"\n", pt->last_plt_gtime);
}
#else
static void pit_info(PITState *pit)
@@ -481,11 +477,9 @@ static int pit_load(struct domain *d, hv
/* Recreate platform timers from hardware state. There will be some
* time jitter here, but the wall-clock will have jumped massively, so
* we hope the guest can handle it. */
+ pit->pt0.last_plt_gtime = hvm_get_guest_time(d->vcpu[0]);
for ( i = 0; i < 3; i++ )
- {
pit_load_count(pit, i, pit->hw.channels[i].count);
- pit->pt[i].last_plt_gtime = hvm_get_guest_time(d->vcpu[0]);
- }
pit_info(pit);
@@ -525,7 +519,7 @@ void pit_deinit(struct domain *d)
void pit_deinit(struct domain *d)
{
PITState *pit = domain_vpit(d);
- destroy_periodic_time(&pit->pt[0]);
+ destroy_periodic_time(&pit->pt0);
}
/* the intercept action for PIT DM retval:0--not handled; 1--handled */
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/arch/x86/hvm/vioapic.c
--- a/xen/arch/x86/hvm/vioapic.c Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/arch/x86/hvm/vioapic.c Wed Oct 03 16:33:23 2007 +0100
@@ -300,8 +300,7 @@ static inline int pit_channel0_enabled(v
static inline int pit_channel0_enabled(void)
{
PITState *pit = ¤t->domain->arch.hvm_domain.pl_time.vpit;
- struct periodic_time *pt = &pit->pt[0];
- return pt->enabled;
+ return pit->pt0.enabled;
}
static void vioapic_deliver(struct hvm_hw_vioapic *vioapic, int irq)
@@ -517,13 +516,27 @@ static int ioapic_load(struct domain *d,
HVM_REGISTER_SAVE_RESTORE(IOAPIC, ioapic_save, ioapic_load, 1, HVMSR_PER_DOM);
-void vioapic_init(struct domain *d)
-{
- struct hvm_hw_vioapic *vioapic = domain_vioapic(d);
+int vioapic_init(struct domain *d)
+{
+ struct hvm_vioapic *vioapic;
int i;
- memset(vioapic, 0, sizeof(*vioapic));
+ vioapic = d->arch.hvm_domain.vioapic = xmalloc(struct hvm_vioapic);
+ if ( vioapic == NULL )
+ return -ENOMEM;
+
+ vioapic->domain = d;
+
+ memset(&vioapic->hvm_hw_vioapic, 0, sizeof(vioapic->hvm_hw_vioapic));
for ( i = 0; i < VIOAPIC_NUM_PINS; i++ )
- vioapic->redirtbl[i].fields.mask = 1;
- vioapic->base_address = VIOAPIC_DEFAULT_BASE_ADDRESS;
-}
+ vioapic->hvm_hw_vioapic.redirtbl[i].fields.mask = 1;
+ vioapic->hvm_hw_vioapic.base_address = VIOAPIC_DEFAULT_BASE_ADDRESS;
+
+ return 0;
+}
+
+void vioapic_deinit(struct domain *d)
+{
+ xfree(d->arch.hvm_domain.vioapic);
+ d->arch.hvm_domain.vioapic = NULL;
+}
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/include/asm-x86/hvm/domain.h
--- a/xen/include/asm-x86/hvm/domain.h Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/include/asm-x86/hvm/domain.h Wed Oct 03 16:33:23 2007 +0100
@@ -25,6 +25,7 @@
#include <asm/hvm/irq.h>
#include <asm/hvm/vpt.h>
#include <asm/hvm/vlapic.h>
+#include <asm/hvm/vioapic.h>
#include <asm/hvm/io.h>
#include <asm/hvm/iommu.h>
#include <public/hvm/params.h>
@@ -49,7 +50,7 @@ struct hvm_domain {
spinlock_t irq_lock;
struct hvm_irq irq;
struct hvm_hw_vpic vpic[2]; /* 0=master; 1=slave */
- struct hvm_hw_vioapic vioapic;
+ struct hvm_vioapic *vioapic;
/* hvm_print_line() logging. */
char pbuf[80];
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/include/asm-x86/hvm/vioapic.h
--- a/xen/include/asm-x86/hvm/vioapic.h Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/include/asm-x86/hvm/vioapic.h Wed Oct 03 16:33:23 2007 +0100
@@ -52,11 +52,17 @@
#define VIOAPIC_REG_VERSION 0x01
#define VIOAPIC_REG_ARB_ID 0x02 /* x86 IOAPIC only */
-#define domain_vioapic(d) (&(d)->arch.hvm_domain.vioapic)
-#define vioapic_domain(v) (container_of((v), struct domain, \
- arch.hvm_domain.vioapic))
+struct hvm_vioapic {
+ struct hvm_hw_vioapic hvm_hw_vioapic;
+ struct domain *domain;
+};
-void vioapic_init(struct domain *d);
+#define domain_vioapic(d) (&(d)->arch.hvm_domain.vioapic->hvm_hw_vioapic)
+#define vioapic_domain(v) (container_of((v), struct hvm_vioapic, \
+ hvm_hw_vioapic)->domain)
+
+int vioapic_init(struct domain *d);
+void vioapic_deinit(struct domain *d);
void vioapic_irq_positive_edge(struct domain *d, unsigned int irq);
void vioapic_update_EOI(struct domain *d, int vector);
diff -r 74a3ee6e1795 -r ca1085e8ab82 xen/include/asm-x86/hvm/vpt.h
--- a/xen/include/asm-x86/hvm/vpt.h Wed Oct 03 15:47:47 2007 +0100
+++ b/xen/include/asm-x86/hvm/vpt.h Wed Oct 03 16:33:23 2007 +0100
@@ -95,8 +95,8 @@ typedef struct PITState {
struct hvm_hw_pit hw;
/* Last time the counters read zero, for calcuating counter reads */
int64_t count_load_time[3];
- /* irq handling */
- struct periodic_time pt[3];
+ /* Channel 0 IRQ handling. */
+ struct periodic_time pt0;
spinlock_t lock;
} PITState;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|