aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/asm-x86/hvm/vlapic.h
diff options
context:
space:
mode:
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-10-30 13:53:09 +0000
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>2006-10-30 13:53:09 +0000
commitf7c8af3a6476e39970caece3a368b024e434bd2b (patch)
treee51c33994e2d00ce98366d9f27f9e79dce0aedad /xen/include/asm-x86/hvm/vlapic.h
parent30c8005e6ecce51d0f1b72c799bdcd7f876d7be3 (diff)
downloadxen-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.h117
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);