1 /** 2 * @file op_apic.h 3 * x86 apic, nmi, perf counter declaration 4 * 5 * @remark Copyright 2002 OProfile authors 6 * @remark Read the file COPYING 7 * 8 * @author John Levon 9 * @author Philippe Elie 10 * @author Dave Jones 11 * @author Graydon Hoare 12 */ 13 14 #ifndef OP_APIC_H 15 #define OP_APIC_H 16 17 #include "apic_compat.h" 18 19 #define NMI_GATE_TYPE 14 20 #define NMI_VECTOR_NUM 2 21 #define NMI_DPL_LEVEL 0 22 23 24 /* copied from kernel 2.4.19 : arch/i386/traps.c */ 25 26 struct gate_struct { 27 u32 a; 28 u32 b; 29 } __attribute__((packed)); 30 31 #define _set_gate(gate_addr, type, dpl, addr) \ 32 do { \ 33 int __d0, __d1; \ 34 __asm__ __volatile__ ("movw %%dx, %%ax\n\t" \ 35 "movw %4, %%dx\n\t" \ 36 "movl %%eax, %0\n\t" \ 37 "movl %%edx, %1" \ 38 :"=m" (*((long *) (gate_addr))), \ 39 "=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \ 40 :"i" ((short) (0x8000+(dpl << 13)+(type << 8))), \ 41 "3" ((char *) (addr)), "2" (__KERNEL_CS << 16)); \ 42 } while (0) 43 44 #define SET_NMI_GATE \ 45 _set_gate(&descr.base[NMI_VECTOR_NUM], NMI_GATE_TYPE, NMI_DPL_LEVEL, &op_nmi); 46 47 #define store_idt(addr) \ 48 do { \ 49 __asm__ __volatile__ ("sidt %0" \ 50 : "=m" (addr) \ 51 : : "memory"); \ 52 } while (0) 53 54 struct _descr { 55 u16 limit; 56 struct gate_struct * base; 57 } __attribute__((__packed__)); 58 59 void lvtpc_apic_setup(void * dummy); 60 void lvtpc_apic_restore(void * dummy); 61 int apic_setup(void); 62 void apic_restore(void); 63 void install_nmi(void); 64 void restore_nmi(void); 65 66 void fixmap_setup(void); 67 void fixmap_restore(void); 68 69 asmlinkage void op_nmi(void); 70 71 #endif /* OP_APIC_H */ 72