diff options
author | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2006-10-30 13:53:09 +0000 |
---|---|---|
committer | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2006-10-30 13:53:09 +0000 |
commit | f7c8af3a6476e39970caece3a368b024e434bd2b (patch) | |
tree | e51c33994e2d00ce98366d9f27f9e79dce0aedad /xen/include/asm-x86/hvm/vlapic.h | |
parent | 30c8005e6ecce51d0f1b72c799bdcd7f876d7be3 (diff) | |
download | xen-f7c8af3a6476e39970caece3a368b024e434bd2b.tar.gz xen-f7c8af3a6476e39970caece3a368b024e434bd2b.tar.bz2 xen-f7c8af3a6476e39970caece3a368b024e434bd2b.zip |
[XEN] HVM: Clean up and simplify vlapic device-model code.
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/include/asm-x86/hvm/vlapic.h')
-rw-r--r-- | xen/include/asm-x86/hvm/vlapic.h | 117 |
1 files changed, 13 insertions, 104 deletions
diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h index b57d213775..4478b71ac2 100644 --- a/xen/include/asm-x86/hvm/vlapic.h +++ b/xen/include/asm-x86/hvm/vlapic.h @@ -25,56 +25,11 @@ #define MAX_VECTOR 256 -#define VEC_POS(v) ((v)%32) -#define REG_POS(v) (((v)/32)* 0x10) -#define vlapic_test_and_set_vector(vec, bitmap) \ - test_and_set_bit(VEC_POS(vec), (bitmap) + REG_POS(vec)) -#define vlapic_test_and_clear_vector(vec, bitmap) \ - test_and_clear_bit(VEC_POS(vec), (bitmap) + REG_POS(vec)) -#define vlapic_set_vector(vec, bitmap) \ - set_bit(VEC_POS(vec), (bitmap) + REG_POS(vec)) -#define vlapic_clear_vector(vec, bitmap) \ - clear_bit(VEC_POS(vec), (bitmap) + REG_POS(vec)) - -static inline int vlapic_find_highest_vector(u32 *bitmap) -{ - int word_offset = MAX_VECTOR / 32; - - /* Work backwards through the bitmap (first 32-bit word in every four). */ - while ( (word_offset != 0) && (bitmap[(--word_offset)*4] == 0) ) - continue; - - return (fls(bitmap[word_offset*4]) - 1) + (word_offset * 32); -} - #define VLAPIC(v) (v->arch.hvm_vcpu.vlapic) -#define VLAPIC_VERSION 0x00050014 - -#define VLOCAL_APIC_MEM_LENGTH (1 << 12) - -#define VLAPIC_LVT_NUM 6 - #define VLAPIC_ID(vlapic) \ (GET_APIC_ID(vlapic_get_reg(vlapic, APIC_ID))) -/* followed define is not in apicdef.h */ -#define APIC_SHORT_MASK 0xc0000 -#define APIC_DEST_NOSHORT 0x0 -#define APIC_DEST_MASK 0x800 - -#define vlapic_lvt_enabled(vlapic, lvt_type) \ - (!(vlapic_get_reg(vlapic, lvt_type) & APIC_LVT_MASKED)) - -#define vlapic_lvt_vector(vlapic, lvt_type) \ - (vlapic_get_reg(vlapic, lvt_type) & APIC_VECTOR_MASK) - -#define vlapic_lvt_dm(vlapic, lvt_type) \ - (vlapic_get_reg(vlapic, lvt_type) & APIC_MODE_MASK) - -#define vlapic_lvtt_period(vlapic) \ - (vlapic_get_reg(vlapic, APIC_LVTT) & APIC_LVT_TIMER_PERIODIC) - #define _VLAPIC_GLOB_DISABLE 0x0 #define VLAPIC_GLOB_DISABLE_MASK 0x1 #define VLAPIC_SOFTWARE_DISABLE_MASK 0x2 @@ -87,96 +42,50 @@ static inline int vlapic_find_highest_vector(u32 *bitmap) #define vlapic_global_enabled(vlapic) \ (!(test_bit(_VLAPIC_GLOB_DISABLE, &(vlapic)->status))) -#define LVT_MASK \ - APIC_LVT_MASKED | APIC_SEND_PENDING | APIC_VECTOR_MASK - -#define LINT_MASK \ - LVT_MASK | APIC_MODE_MASK | APIC_INPUT_POLARITY |\ - APIC_LVT_REMOTE_IRR | APIC_LVT_LEVEL_TRIGGER - -typedef struct direct_intr_info { - int deliver_mode; - int source[6]; -} direct_intr_info_t; - struct vlapic { uint32_t status; - uint32_t vcpu_id; uint64_t apic_base_msr; unsigned long base_address; uint32_t timer_divide_count; struct timer vlapic_timer; - int intr_pending_count[MAX_VECTOR]; + int timer_pending_count; int flush_tpr_threshold; s_time_t timer_last_update; - direct_intr_info_t direct_intr; - uint32_t err_status; - uint32_t err_write_count; struct vcpu *vcpu; struct domain *domain; struct page_info *regs_page; void *regs; }; -static inline int vlapic_test_and_set_irr(int vector, struct vlapic *vlapic) -{ - vlapic->flush_tpr_threshold = 1; - return vlapic_test_and_set_vector(vector, vlapic->regs + APIC_IRR); -} - -static inline void vlapic_set_irr(int vector, struct vlapic *vlapic) -{ - vlapic->flush_tpr_threshold = 1; - vlapic_set_vector(vector, vlapic->regs + APIC_IRR); -} - -static inline void vlapic_clear_irr(int vector, struct vlapic *vlapic) -{ - vlapic->flush_tpr_threshold = 1; - vlapic_clear_vector(vector, vlapic->regs + APIC_IRR); -} - -static inline int vlapic_set_irq(struct vlapic *vlapic, - uint8_t vec, uint8_t trig) -{ - int ret; - - ret = vlapic_test_and_set_irr(vec, vlapic); - if ( trig ) - vlapic_set_vector(vec, vlapic->regs + APIC_TMR); - - /* We may need to wake up target vcpu, besides set pending bit here */ - return ret; -} - static inline uint32_t vlapic_get_reg(struct vlapic *vlapic, uint32_t reg) { - return *( (uint32_t *)(vlapic->regs + reg)); + return *((uint32_t *)(vlapic->regs + reg)); } -static inline void vlapic_set_reg(struct vlapic *vlapic, - uint32_t reg, uint32_t val) +static inline void vlapic_set_reg( + struct vlapic *vlapic, uint32_t reg, uint32_t val) { *((uint32_t *)(vlapic->regs + reg)) = val; } -void vlapic_post_injection(struct vcpu* v, int vector, int deliver_mode); +int vlapic_set_irq(struct vlapic *vlapic, uint8_t vec, uint8_t trig); + +void vlapic_post_injection(struct vcpu *v, int vector, int deliver_mode); -extern int vlapic_find_highest_irr(struct vlapic *vlapic); +int vlapic_find_highest_irr(struct vlapic *vlapic); -int cpu_has_apic_interrupt(struct vcpu* v); -int cpu_get_apic_interrupt(struct vcpu* v, int *mode); +int cpu_get_apic_interrupt(struct vcpu *v, int *mode); -extern int vlapic_init(struct vcpu *vc); +int vlapic_init(struct vcpu *vc); -extern void vlapic_msr_set(struct vlapic *vlapic, uint64_t value); +void vlapic_msr_set(struct vlapic *vlapic, uint64_t value); -extern uint32_t vlapic_update_ppr(struct vlapic *vlapic); +uint32_t vlapic_update_ppr(struct vlapic *vlapic); int vlapic_accept_pic_intr(struct vcpu *v); -struct vlapic* apic_round_robin(struct domain *d, +struct vlapic *apic_round_robin(struct domain *d, uint8_t dest_mode, uint8_t vector, uint32_t bitmap); |