/** * @file op_apic.h * x86 apic, nmi, perf counter declaration * * @remark Copyright 2002 OProfile authors * @remark Read the file COPYING * * @author John Levon * @author Philippe Elie * @author Dave Jones * @author Graydon Hoare */ #ifndef OP_APIC_H #define OP_APIC_H #include "apic_compat.h" #define NMI_GATE_TYPE 14 #define NMI_VECTOR_NUM 2 #define NMI_DPL_LEVEL 0 /* copied from kernel 2.4.19 : arch/i386/traps.c */ struct gate_struct { u32 a; u32 b; } __attribute__((packed)); #define _set_gate(gate_addr, type, dpl, addr) \ do { \ int __d0, __d1; \ __asm__ __volatile__ ("movw %%dx, %%ax\n\t" \ "movw %4, %%dx\n\t" \ "movl %%eax, %0\n\t" \ "movl %%edx, %1" \ :"=m" (*((long *) (gate_addr))), \ "=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \ :"i" ((short) (0x8000+(dpl << 13)+(type << 8))), \ "3" ((char *) (addr)), "2" (__KERNEL_CS << 16)); \ } while (0) #define SET_NMI_GATE \ _set_gate(&descr.base[NMI_VECTOR_NUM], NMI_GATE_TYPE, NMI_DPL_LEVEL, &op_nmi); #define store_idt(addr) \ do { \ __asm__ __volatile__ ("sidt %0" \ : "=m" (addr) \ : : "memory"); \ } while (0) struct _descr { u16 limit; struct gate_struct * base; } __attribute__((__packed__)); void lvtpc_apic_setup(void * dummy); void lvtpc_apic_restore(void * dummy); int apic_setup(void); void apic_restore(void); void install_nmi(void); void restore_nmi(void); void fixmap_setup(void); void fixmap_restore(void); asmlinkage void op_nmi(void); #endif /* OP_APIC_H */