-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
KVM: Move irqchip declarations into new ioapic.h and lapic.h
This allows reuse of ioapic in ia64. Signed-off-by: Zhang Xiantao <xiantao.zhang@intel.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
- Loading branch information
Zhang Xiantao
authored and
Avi Kivity
committed
Jan 30, 2008
1 parent
0fce562
commit 8247019
Showing
4 changed files
with
148 additions
and
111 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
#ifndef __KVM_IO_APIC_H | ||
#define __KVM_IO_APIC_H | ||
|
||
#include <linux/kvm_host.h> | ||
|
||
#include "iodev.h" | ||
|
||
struct kvm; | ||
struct kvm_vcpu; | ||
|
||
#define IOAPIC_NUM_PINS KVM_IOAPIC_NUM_PINS | ||
#define IOAPIC_VERSION_ID 0x11 /* IOAPIC version */ | ||
#define IOAPIC_EDGE_TRIG 0 | ||
#define IOAPIC_LEVEL_TRIG 1 | ||
|
||
#define IOAPIC_DEFAULT_BASE_ADDRESS 0xfec00000 | ||
#define IOAPIC_MEM_LENGTH 0x100 | ||
|
||
/* Direct registers. */ | ||
#define IOAPIC_REG_SELECT 0x00 | ||
#define IOAPIC_REG_WINDOW 0x10 | ||
#define IOAPIC_REG_EOI 0x40 /* IA64 IOSAPIC only */ | ||
|
||
/* Indirect registers. */ | ||
#define IOAPIC_REG_APIC_ID 0x00 /* x86 IOAPIC only */ | ||
#define IOAPIC_REG_VERSION 0x01 | ||
#define IOAPIC_REG_ARB_ID 0x02 /* x86 IOAPIC only */ | ||
|
||
/*ioapic delivery mode*/ | ||
#define IOAPIC_FIXED 0x0 | ||
#define IOAPIC_LOWEST_PRIORITY 0x1 | ||
#define IOAPIC_PMI 0x2 | ||
#define IOAPIC_NMI 0x4 | ||
#define IOAPIC_INIT 0x5 | ||
#define IOAPIC_EXTINT 0x7 | ||
|
||
struct kvm_ioapic { | ||
u64 base_address; | ||
u32 ioregsel; | ||
u32 id; | ||
u32 irr; | ||
u32 pad; | ||
union ioapic_redir_entry { | ||
u64 bits; | ||
struct { | ||
u8 vector; | ||
u8 delivery_mode:3; | ||
u8 dest_mode:1; | ||
u8 delivery_status:1; | ||
u8 polarity:1; | ||
u8 remote_irr:1; | ||
u8 trig_mode:1; | ||
u8 mask:1; | ||
u8 reserve:7; | ||
u8 reserved[4]; | ||
u8 dest_id; | ||
} fields; | ||
} redirtbl[IOAPIC_NUM_PINS]; | ||
struct kvm_io_device dev; | ||
struct kvm *kvm; | ||
}; | ||
|
||
#ifdef DEBUG | ||
#define ASSERT(x) \ | ||
do { \ | ||
if (!(x)) { \ | ||
printk(KERN_EMERG "assertion failed %s: %d: %s\n", \ | ||
__FILE__, __LINE__, #x); \ | ||
BUG(); \ | ||
} \ | ||
} while (0) | ||
#else | ||
#define ASSERT(x) do { } while (0) | ||
#endif | ||
|
||
static inline struct kvm_ioapic *ioapic_irqchip(struct kvm *kvm) | ||
{ | ||
return kvm->arch.vioapic; | ||
} | ||
|
||
#ifdef CONFIG_IA64 | ||
static inline int irqchip_in_kernel(struct kvm *kvm) | ||
{ | ||
return 1; | ||
} | ||
#endif | ||
|
||
struct kvm_vcpu *kvm_get_lowest_prio_vcpu(struct kvm *kvm, u8 vector, | ||
unsigned long bitmap); | ||
void kvm_ioapic_update_eoi(struct kvm *kvm, int vector); | ||
int kvm_ioapic_init(struct kvm *kvm); | ||
void kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level); | ||
void kvm_ioapic_reset(struct kvm_ioapic *ioapic); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
#ifndef __KVM_X86_LAPIC_H | ||
#define __KVM_X86_LAPIC_H | ||
|
||
#include "iodev.h" | ||
|
||
#include <linux/kvm_host.h> | ||
|
||
struct kvm_lapic { | ||
unsigned long base_address; | ||
struct kvm_io_device dev; | ||
struct { | ||
atomic_t pending; | ||
s64 period; /* unit: ns */ | ||
u32 divide_count; | ||
ktime_t last_update; | ||
struct hrtimer dev; | ||
} timer; | ||
struct kvm_vcpu *vcpu; | ||
struct page *regs_page; | ||
void *regs; | ||
}; | ||
int kvm_create_lapic(struct kvm_vcpu *vcpu); | ||
void kvm_free_lapic(struct kvm_vcpu *vcpu); | ||
|
||
int kvm_apic_has_interrupt(struct kvm_vcpu *vcpu); | ||
int kvm_apic_accept_pic_intr(struct kvm_vcpu *vcpu); | ||
int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu); | ||
void kvm_lapic_reset(struct kvm_vcpu *vcpu); | ||
u64 kvm_lapic_get_cr8(struct kvm_vcpu *vcpu); | ||
void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu, unsigned long cr8); | ||
void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value); | ||
|
||
int kvm_apic_match_physical_addr(struct kvm_lapic *apic, u16 dest); | ||
int kvm_apic_match_logical_addr(struct kvm_lapic *apic, u8 mda); | ||
int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig); | ||
|
||
u64 kvm_get_apic_base(struct kvm_vcpu *vcpu); | ||
void kvm_set_apic_base(struct kvm_vcpu *vcpu, u64 data); | ||
void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu); | ||
int kvm_lapic_enabled(struct kvm_vcpu *vcpu); | ||
int kvm_lapic_find_highest_irr(struct kvm_vcpu *vcpu); | ||
void kvm_apic_timer_intr_post(struct kvm_vcpu *vcpu, int vec); | ||
|
||
#endif |