[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 31/70] x86: CFI hardening for request_irq()
... and friends; alloc_direct_apic_vector() and set_direct_apic_vector(). Control Flow Integrity schemes use toolchain and optionally hardware support to help protect against call/jump/return oriented programming attacks. Use cf_check to annotate function pointer targets for the toolchain. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Acked-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/arch/x86/apic.c | 8 ++++---- xen/arch/x86/cpu/mcheck/mce_intel.c | 4 ++-- xen/arch/x86/guest/xen/xen.c | 2 +- xen/arch/x86/hpet.c | 4 ++-- xen/arch/x86/hvm/vmx/vmx.c | 4 ++-- xen/arch/x86/include/asm/irq.h | 16 ++++++++-------- xen/arch/x86/irq.c | 2 +- xen/arch/x86/smp.c | 6 +++--- xen/arch/x86/time.c | 3 ++- xen/drivers/passthrough/amd/iommu_init.c | 4 ++-- xen/drivers/passthrough/vtd/iommu.c | 4 ++-- 11 files changed, 29 insertions(+), 28 deletions(-) diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c index 68e4d870c749..5a7a58dc9830 100644 --- a/xen/arch/x86/apic.c +++ b/xen/arch/x86/apic.c @@ -1361,7 +1361,7 @@ int reprogram_timer(s_time_t timeout) return apic_tmict || !timeout; } -void apic_timer_interrupt(struct cpu_user_regs * regs) +void cf_check apic_timer_interrupt(struct cpu_user_regs *regs) { ack_APIC_irq(); perfc_incr(apic_timer); @@ -1380,7 +1380,7 @@ void smp_send_state_dump(unsigned int cpu) /* * Spurious interrupts should _never_ happen with our APIC/SMP architecture. */ -void spurious_interrupt(struct cpu_user_regs *regs) +void cf_check spurious_interrupt(struct cpu_user_regs *regs) { /* * Check if this is a vectored interrupt (most likely, as this is probably @@ -1411,7 +1411,7 @@ void spurious_interrupt(struct cpu_user_regs *regs) * This interrupt should never happen with our APIC/SMP architecture */ -void error_interrupt(struct cpu_user_regs *regs) +void cf_check error_interrupt(struct cpu_user_regs *regs) { static const char *const esr_fields[] = { "Send CS error", @@ -1444,7 +1444,7 @@ void error_interrupt(struct cpu_user_regs *regs) * This interrupt handles performance counters interrupt */ -void pmu_apic_interrupt(struct cpu_user_regs *regs) +void cf_check pmu_apic_interrupt(struct cpu_user_regs *regs) { ack_APIC_irq(); vpmu_do_interrupt(regs); diff --git a/xen/arch/x86/cpu/mcheck/mce_intel.c b/xen/arch/x86/cpu/mcheck/mce_intel.c index a691e10bdcd6..7aaa56fd02eb 100644 --- a/xen/arch/x86/cpu/mcheck/mce_intel.c +++ b/xen/arch/x86/cpu/mcheck/mce_intel.c @@ -55,7 +55,7 @@ bool __read_mostly lmce_support; #define MCE_RING 0x1 static DEFINE_PER_CPU(int, last_state); -static void intel_thermal_interrupt(struct cpu_user_regs *regs) +static void cf_check intel_thermal_interrupt(struct cpu_user_regs *regs) { uint64_t msr_content; unsigned int cpu = smp_processor_id(); @@ -639,7 +639,7 @@ static void cpu_mcheck_disable(void) clear_cmci(); } -static void cmci_interrupt(struct cpu_user_regs *regs) +static void cf_check cmci_interrupt(struct cpu_user_regs *regs) { mctelem_cookie_t mctc; struct mca_summary bs; diff --git a/xen/arch/x86/guest/xen/xen.c b/xen/arch/x86/guest/xen/xen.c index b2aa3a009b4a..17807cdea688 100644 --- a/xen/arch/x86/guest/xen/xen.c +++ b/xen/arch/x86/guest/xen/xen.c @@ -170,7 +170,7 @@ static void __init init_memmap(void) } } -static void xen_evtchn_upcall(struct cpu_user_regs *regs) +static void cf_check xen_evtchn_upcall(struct cpu_user_regs *regs) { struct vcpu_info *vcpu_info = this_cpu(vcpu_info); unsigned long pending; diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index 7b009a930498..c31fd97579dc 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -240,8 +240,8 @@ static void handle_hpet_broadcast(struct hpet_event_channel *ch) } } -static void hpet_interrupt_handler(int irq, void *data, - struct cpu_user_regs *regs) +static void cf_check hpet_interrupt_handler( + int irq, void *data, struct cpu_user_regs *regs) { struct hpet_event_channel *ch = data; diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 36c8a12cfe7d..dade08f60279 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2533,7 +2533,7 @@ static struct hvm_function_table __initdata vmx_function_table = { }; /* Handle VT-d posted-interrupt when VCPU is blocked. */ -static void pi_wakeup_interrupt(struct cpu_user_regs *regs) +static void cf_check pi_wakeup_interrupt(struct cpu_user_regs *regs) { struct vmx_vcpu *vmx, *tmp; spinlock_t *lock = &per_cpu(vmx_pi_blocking, smp_processor_id()).lock; @@ -2565,7 +2565,7 @@ static void pi_wakeup_interrupt(struct cpu_user_regs *regs) } /* Handle VT-d posted-interrupt when VCPU is running. */ -static void pi_notification_interrupt(struct cpu_user_regs *regs) +static void cf_check pi_notification_interrupt(struct cpu_user_regs *regs) { ack_APIC_irq(); this_cpu(irq_count)++; diff --git a/xen/arch/x86/include/asm/irq.h b/xen/arch/x86/include/asm/irq.h index 7c825e9d9c0a..b3f49abc5556 100644 --- a/xen/arch/x86/include/asm/irq.h +++ b/xen/arch/x86/include/asm/irq.h @@ -93,14 +93,14 @@ static inline struct cpu_user_regs *set_irq_regs(struct cpu_user_regs *new_regs) #define platform_legacy_irq(irq) ((irq) < 16) -void event_check_interrupt(struct cpu_user_regs *regs); -void invalidate_interrupt(struct cpu_user_regs *regs); -void call_function_interrupt(struct cpu_user_regs *regs); -void apic_timer_interrupt(struct cpu_user_regs *regs); -void error_interrupt(struct cpu_user_regs *regs); -void pmu_apic_interrupt(struct cpu_user_regs *regs); -void spurious_interrupt(struct cpu_user_regs *regs); -void irq_move_cleanup_interrupt(struct cpu_user_regs *regs); +void cf_check event_check_interrupt(struct cpu_user_regs *regs); +void cf_check invalidate_interrupt(struct cpu_user_regs *regs); +void cf_check call_function_interrupt(struct cpu_user_regs *regs); +void cf_check apic_timer_interrupt(struct cpu_user_regs *regs); +void cf_check error_interrupt(struct cpu_user_regs *regs); +void cf_check pmu_apic_interrupt(struct cpu_user_regs *regs); +void cf_check spurious_interrupt(struct cpu_user_regs *regs); +void cf_check irq_move_cleanup_interrupt(struct cpu_user_regs *regs); uint8_t alloc_hipriority_vector(void); diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index f43b926ed26b..61e09a356f97 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -744,7 +744,7 @@ void move_native_irq(struct irq_desc *desc) desc->handler->enable(desc); } -void irq_move_cleanup_interrupt(struct cpu_user_regs *regs) +void cf_check irq_move_cleanup_interrupt(struct cpu_user_regs *regs) { unsigned vector, me; diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c index b9a696f61963..33748e629a21 100644 --- a/xen/arch/x86/smp.c +++ b/xen/arch/x86/smp.c @@ -246,7 +246,7 @@ static cpumask_t flush_cpumask; static const void *flush_va; static unsigned int flush_flags; -void invalidate_interrupt(struct cpu_user_regs *regs) +void cf_check invalidate_interrupt(struct cpu_user_regs *regs) { unsigned int flags = flush_flags; ack_APIC_irq(); @@ -385,14 +385,14 @@ void smp_send_nmi_allbutself(void) send_IPI_mask(&cpu_online_map, APIC_DM_NMI); } -void event_check_interrupt(struct cpu_user_regs *regs) +void cf_check event_check_interrupt(struct cpu_user_regs *regs) { ack_APIC_irq(); perfc_incr(ipis); this_cpu(irq_count)++; } -void call_function_interrupt(struct cpu_user_regs *regs) +void cf_check call_function_interrupt(struct cpu_user_regs *regs) { ack_APIC_irq(); perfc_incr(ipis); diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c index 3d767d70f61f..b6e690b76fab 100644 --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -196,7 +196,8 @@ static void smp_send_timer_broadcast_ipi(void) } } -static void timer_interrupt(int irq, void *dev_id, struct cpu_user_regs *regs) +static void cf_check timer_interrupt( + int irq, void *dev_id, struct cpu_user_regs *regs) { ASSERT(local_irq_is_enabled()); diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c index cebcd68a6c04..d2ad282e93d3 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -715,8 +715,8 @@ static void cf_check do_amd_iommu_irq(void *unused) } } -static void iommu_interrupt_handler(int irq, void *dev_id, - struct cpu_user_regs *regs) +static void cf_check iommu_interrupt_handler( + int irq, void *dev_id, struct cpu_user_regs *regs) { unsigned long flags; struct amd_iommu *iommu = dev_id; diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 4d7703dd9a20..fc3ff064b692 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1117,8 +1117,8 @@ static void cf_check do_iommu_page_fault(void *unused) __do_iommu_page_fault(drhd->iommu); } -static void iommu_page_fault(int irq, void *dev_id, - struct cpu_user_regs *regs) +static void cf_check iommu_page_fault( + int irq, void *dev_id, struct cpu_user_regs *regs) { /* * Just flag the tasklet as runnable. This is fine, according to VT-d -- 2.11.0
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |