| /** |
| * @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 */ |