aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/include/asm-x86/io_apic.h9
1 files changed, 6 insertions, 3 deletions
diff --git a/xen/include/asm-x86/io_apic.h b/xen/include/asm-x86/io_apic.h
index 59f8e0712e..5964521592 100644
--- a/xen/include/asm-x86/io_apic.h
+++ b/xen/include/asm-x86/io_apic.h
@@ -123,9 +123,12 @@ extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
/* non-0 if default (table-less) MP configuration */
extern int mpc_default_type;
+/* Only need to remap ioapic RTE (reg: 10~3Fh) */
+#define ioapic_reg_remapped(reg) (iommu_enabled && ((reg) >= 0x10))
+
static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)
{
- if (iommu_enabled)
+ if (ioapic_reg_remapped(reg))
return io_apic_read_remap_rte(apic, reg);
*IO_APIC_BASE(apic) = reg;
return *(IO_APIC_BASE(apic)+4);
@@ -133,7 +136,7 @@ static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)
static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value)
{
- if (iommu_enabled)
+ if (ioapic_reg_remapped(reg))
return iommu_update_ire_from_apic(apic, reg, value);
*IO_APIC_BASE(apic) = reg;
*(IO_APIC_BASE(apic)+4) = value;
@@ -152,7 +155,7 @@ extern int sis_apic_bug;
#endif
static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned int value)
{
- if (iommu_enabled)
+ if (ioapic_reg_remapped(reg))
return iommu_update_ire_from_apic(apic, reg, value);
if (sis_apic_bug)
*IO_APIC_BASE(apic) = reg;