diff options
author | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2006-12-20 10:37:23 +0000 |
---|---|---|
committer | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2006-12-20 10:37:23 +0000 |
commit | ddc35d1cc994bde1c3560c5dc30a4adc944ef4ac (patch) | |
tree | 70de5fedc1a3be62d38992962caac2b15647da6d /xen/include | |
parent | 625141e5d7a0076eddf421cd7afccefce9cb000e (diff) | |
download | xen-ddc35d1cc994bde1c3560c5dc30a4adc944ef4ac.tar.gz xen-ddc35d1cc994bde1c3560c5dc30a4adc944ef4ac.tar.bz2 xen-ddc35d1cc994bde1c3560c5dc30a4adc944ef4ac.zip |
[HVM] Enable more than one platform timer (PIT/RTC/HPET)
programmed as periodic timer and adds them to abstract layer, which
keeps track of pending_intr_nr to avoid time interrupt lost and
sync'ed timer with TSC.
It also makes some cleanup to the time related code.
Signed-off-by: Xiaowei Yang <xiaowei.yang@intel.com>
Signed-off-by: Yunhong Jiang <yunhong.jiang@intel.com>
Diffstat (limited to 'xen/include')
-rw-r--r-- | xen/include/asm-x86/hvm/hvm.h | 2 | ||||
-rw-r--r-- | xen/include/asm-x86/hvm/io.h | 2 | ||||
-rw-r--r-- | xen/include/asm-x86/hvm/irq.h | 5 | ||||
-rw-r--r-- | xen/include/asm-x86/hvm/vcpu.h | 1 | ||||
-rw-r--r-- | xen/include/asm-x86/hvm/vlapic.h | 2 | ||||
-rw-r--r-- | xen/include/asm-x86/hvm/vpt.h | 91 |
6 files changed, 50 insertions, 53 deletions
diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h index b41c84b526..f97c00ec89 100644 --- a/xen/include/asm-x86/hvm/hvm.h +++ b/xen/include/asm-x86/hvm/hvm.h @@ -223,7 +223,7 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx); void hvm_stts(struct vcpu *v); void hvm_set_guest_time(struct vcpu *v, u64 gtime); -void hvm_freeze_time(struct vcpu *v); +u64 hvm_get_guest_time(struct vcpu *v); void hvm_migrate_timers(struct vcpu *v); void hvm_do_resume(struct vcpu *v); diff --git a/xen/include/asm-x86/hvm/io.h b/xen/include/asm-x86/hvm/io.h index 028a885eb2..c71a9bbc6c 100644 --- a/xen/include/asm-x86/hvm/io.h +++ b/xen/include/asm-x86/hvm/io.h @@ -147,8 +147,6 @@ extern void send_pio_req(unsigned long port, unsigned long count, int size, extern void handle_mmio(unsigned long gpa); extern void hvm_interrupt_post(struct vcpu *v, int vector, int type); extern void hvm_io_assist(struct vcpu *v); -extern int cpu_get_interrupt(struct vcpu *v, int *type); -extern int cpu_has_pending_irq(struct vcpu *v); #endif /* __ASM_X86_HVM_IO_H__ */ diff --git a/xen/include/asm-x86/hvm/irq.h b/xen/include/asm-x86/hvm/irq.h index cfc0de765d..85e3d3fa88 100644 --- a/xen/include/asm-x86/hvm/irq.h +++ b/xen/include/asm-x86/hvm/irq.h @@ -104,4 +104,9 @@ void hvm_set_pci_link_route(struct domain *d, u8 link, u8 isa_irq); void hvm_set_callback_irq_level(void); void hvm_set_callback_gsi(struct domain *d, unsigned int gsi); +int cpu_get_interrupt(struct vcpu *v, int *type); +int cpu_has_pending_irq(struct vcpu *v); +int get_intr_vector(struct vcpu* vcpu, int irq, int type); +int is_irq_masked(struct vcpu *v, int irq); + #endif /* __ASM_X86_HVM_IRQ_H__ */ diff --git a/xen/include/asm-x86/hvm/vcpu.h b/xen/include/asm-x86/hvm/vcpu.h index 0c073028ee..0d4c95930c 100644 --- a/xen/include/asm-x86/hvm/vcpu.h +++ b/xen/include/asm-x86/hvm/vcpu.h @@ -35,6 +35,7 @@ struct hvm_vcpu { struct vlapic vlapic; s64 cache_tsc_offset; u64 guest_time; + struct list_head tm_list; /* For AP startup */ unsigned long init_sipi_sipi_state; diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h index 2053fc56ec..3691e3ca4f 100644 --- a/xen/include/asm-x86/hvm/vlapic.h +++ b/xen/include/asm-x86/hvm/vlapic.h @@ -89,8 +89,6 @@ int vlapic_accept_pic_intr(struct vcpu *v); struct vlapic *apic_round_robin( struct domain *d, uint8_t vector, uint32_t bitmap); -s_time_t get_apictime_scheduled(struct vcpu *v); - int vlapic_match_logical_addr(struct vlapic *vlapic, uint8_t mda); #endif /* __ASM_X86_HVM_VLAPIC_H__ */ diff --git a/xen/include/asm-x86/hvm/vpt.h b/xen/include/asm-x86/hvm/vpt.h index 9a83417996..b43007ea5e 100644 --- a/xen/include/asm-x86/hvm/vpt.h +++ b/xen/include/asm-x86/hvm/vpt.h @@ -27,11 +27,33 @@ #include <xen/errno.h> #include <xen/time.h> #include <xen/timer.h> +#include <xen/list.h> #include <asm/hvm/vpic.h> #define PIT_FREQ 1193181 #define PIT_BASE 0x40 +/* + * Abstract layer of periodic time, one short time. + */ +typedef void time_cb(struct vcpu *v, void *opaque); + +struct periodic_time { + struct list_head list; + char enabled; + char one_shot; /* one shot time */ + int irq; + struct vcpu *vcpu; /* vcpu timer interrupt delivers to */ + u32 pending_intr_nr; /* the couner for pending timer interrupts */ + u32 period; /* frequency in ns */ + u64 period_cycles; /* frequency in cpu cycles */ + s_time_t scheduled; /* scheduled timer interrupt */ + u64 last_plt_gtime; /* platform time when last IRQ is injected */ + struct timer timer; /* ac_timer */ + time_cb *cb; + void *priv; /* ponit back to platform time source */ +}; + typedef struct PITChannelState { int count; /* can be 65536 */ u16 latched_count; @@ -47,8 +69,7 @@ typedef struct PITChannelState { u8 gate; /* timer start */ s64 count_load_time; /* irq handling */ - struct vcpu *vcpu; - struct periodic_time *pt; + struct periodic_time pt; } PITChannelState; typedef struct PITState { @@ -66,10 +87,7 @@ typedef struct RTCState { int64_t next_second_time; struct timer second_timer; struct timer second_timer2; - struct timer pie_timer; - int period; - s_time_t next_pie; - struct vcpu *vcpu; + struct periodic_time pt; } RTCState; #define FREQUENCE_PMTIMER 3579545 @@ -82,58 +100,35 @@ typedef struct PMTState { struct vcpu *vcpu; } PMTState; -/* - * Abstract layer of periodic time, one short time. - */ -typedef void time_cb(struct vcpu *v, void *opaque); - -struct periodic_time { - char enabled; /* enabled */ - char one_shot; /* one shot time */ - char irq; - char first_injected; /* flag to prevent shadow window */ - u32 bind_vcpu; /* vcpu timer interrupt delivers to */ - u32 pending_intr_nr; /* the couner for pending timer interrupts */ - u32 period; /* frequency in ns */ - u64 period_cycles; /* frequency in cpu cycles */ - s_time_t scheduled; /* scheduled timer interrupt */ - u64 last_plt_gtime; /* platform time when last IRQ is injected */ - struct timer timer; /* ac_timer */ - time_cb *cb; - void *priv; /* ponit back to platform time source */ -}; - struct pl_time { /* platform time */ - struct periodic_time periodic_tm; - struct PITState vpit; - struct RTCState vrtc; - struct PMTState vpmt; + struct PITState vpit; + struct RTCState vrtc; + struct PMTState vpmt; }; -extern u64 hvm_get_guest_time(struct vcpu *v); -static inline int64_t hvm_get_clock(struct vcpu *v) -{ - return hvm_get_guest_time(v); -} - #define ticks_per_sec(v) (v->domain->arch.hvm_domain.tsc_frequency) -/* to hook the ioreq packet to get the PIT initialization info */ -extern void hvm_hooks_assist(struct vcpu *v); -extern void pickup_deactive_ticks(struct periodic_time *vpit); -extern struct periodic_time *create_periodic_time( - u32 period, char irq, char one_shot, time_cb *cb, void *data); -extern void destroy_periodic_time(struct periodic_time *pt); +void pt_freeze_time(struct vcpu *v); +void pt_thaw_time(struct vcpu *v); +void pt_timer_fn(void *data); +void pt_update_irq(struct vcpu *v); +struct periodic_time *is_pt_irq(struct vcpu *v, int vector, int type); +void pt_intr_post(struct vcpu *v, int vector, int type); +void pt_reset(struct vcpu *v); +void create_periodic_time(struct periodic_time *pt, u32 period, char irq, + char one_shot, time_cb *cb, void *data); +void destroy_periodic_time(struct periodic_time *pt); + int pv_pit_handler(int port, int data, int write); void pit_init(struct vcpu *v, unsigned long cpu_khz); +void pit_migrate_timers(struct vcpu *v); +void pit_deinit(struct domain *d); void rtc_init(struct vcpu *v, int base, int irq); -void rtc_deinit(struct domain *d); -void rtc_freeze(struct vcpu *v); -void rtc_thaw(struct vcpu *v); void rtc_migrate_timers(struct vcpu *v); +void rtc_deinit(struct domain *d); +int is_rtc_periodic_irq(void *opaque); void pmtimer_init(struct vcpu *v, int base); +void pmtimer_migrate_timers(struct vcpu *v); void pmtimer_deinit(struct domain *d); -void pt_timer_fn(void *data); -void pit_time_fired(struct vcpu *v, void *priv); #endif /* __ASM_X86_HVM_VPT_H__ */ |