i82093reg.h revision 1.8.40.1 1 1.8.40.1 jdolecek /* $NetBSD: i82093reg.h,v 1.8.40.1 2017/12/03 11:36:18 jdolecek Exp $ */
2 1.3 fvdl
3 1.4 fvdl #include <x86/i82093reg.h>
4 1.3 fvdl
5 1.5 fvdl #ifdef _KERNEL
6 1.5 fvdl
7 1.5 fvdl #if defined(_KERNEL_OPT)
8 1.5 fvdl #include "opt_multiprocessor.h"
9 1.5 fvdl #endif
10 1.5 fvdl
11 1.3 fvdl #define ioapic_asm_ack(num) \
12 1.8.40.1 jdolecek movl _C_LABEL(local_apic_va),%eax ; \
13 1.8.40.1 jdolecek movl $0,LAPIC_EOI(%eax)
14 1.8.40.1 jdolecek
15 1.8.40.1 jdolecek #define x2apic_asm_ack(num) \
16 1.8.40.1 jdolecek movl $(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx ; \
17 1.8.40.1 jdolecek xorl %eax,%eax ; \
18 1.8.40.1 jdolecek xorl %edx,%edx ; \
19 1.8.40.1 jdolecek wrmsr
20 1.5 fvdl
21 1.5 fvdl #ifdef MULTIPROCESSOR
22 1.5 fvdl
23 1.5 fvdl #define ioapic_asm_lock(num) \
24 1.5 fvdl movl $1,%esi ;\
25 1.5 fvdl 77: \
26 1.5 fvdl xchgl %esi,PIC_LOCK(%edi) ;\
27 1.5 fvdl testl %esi,%esi ;\
28 1.5 fvdl jne 77b
29 1.5 fvdl
30 1.5 fvdl #define ioapic_asm_unlock(num) \
31 1.5 fvdl movl $0,PIC_LOCK(%edi)
32 1.5 fvdl
33 1.5 fvdl #else
34 1.5 fvdl
35 1.5 fvdl #define ioapic_asm_lock(num)
36 1.5 fvdl #define ioapic_asm_unlock(num)
37 1.5 fvdl
38 1.5 fvdl #endif /* MULTIPROCESSOR */
39 1.5 fvdl
40 1.5 fvdl #define ioapic_mask(num) \
41 1.5 fvdl movl IS_PIC(%ebp),%edi ;\
42 1.5 fvdl ioapic_asm_lock(num) ;\
43 1.5 fvdl movl IS_PIN(%ebp),%esi ;\
44 1.5 fvdl leal 0x10(%esi,%esi,1),%esi ;\
45 1.8 drochner movl PIC_IOAPIC(%edi),%edi ;\
46 1.5 fvdl movl IOAPIC_SC_REG(%edi),%ebx ;\
47 1.5 fvdl movl %esi, (%ebx) ;\
48 1.5 fvdl movl IOAPIC_SC_DATA(%edi),%ebx ;\
49 1.5 fvdl movl (%ebx),%esi ;\
50 1.5 fvdl orl $IOAPIC_REDLO_MASK,%esi ;\
51 1.8.40.1 jdolecek andl $~IOAPIC_REDLO_RIRR,%esi ;\
52 1.5 fvdl movl %esi,(%ebx) ;\
53 1.8 drochner movl IS_PIC(%ebp),%edi ;\
54 1.5 fvdl ioapic_asm_unlock(num)
55 1.5 fvdl
56 1.6 fvdl /*
57 1.6 fvdl * Since this is called just before the interrupt stub exits, AND
58 1.6 fvdl * because the apic ACK doesn't use any registers, all registers
59 1.6 fvdl * can be used here.
60 1.6 fvdl * XXX this is not obvious
61 1.6 fvdl */
62 1.5 fvdl #define ioapic_unmask(num) \
63 1.7 yamt movl (%esp),%eax ;\
64 1.7 yamt cmpl $IREENT_MAGIC,(TF_ERR+4)(%eax) ;\
65 1.6 fvdl jne 79f ;\
66 1.5 fvdl movl IS_PIC(%ebp),%edi ;\
67 1.5 fvdl ioapic_asm_lock(num) ;\
68 1.5 fvdl movl IS_PIN(%ebp),%esi ;\
69 1.5 fvdl leal 0x10(%esi,%esi,1),%esi ;\
70 1.8 drochner movl PIC_IOAPIC(%edi),%edi ;\
71 1.5 fvdl movl IOAPIC_SC_REG(%edi),%ebx ;\
72 1.6 fvdl movl IOAPIC_SC_DATA(%edi),%eax ;\
73 1.6 fvdl movl %esi, (%ebx) ;\
74 1.6 fvdl movl (%eax),%edx ;\
75 1.8.40.1 jdolecek andl $~(IOAPIC_REDLO_MASK|IOAPIC_REDLO_RIRR),%edx ;\
76 1.5 fvdl movl %esi, (%ebx) ;\
77 1.6 fvdl movl %edx,(%eax) ;\
78 1.8 drochner movl IS_PIC(%ebp),%edi ;\
79 1.5 fvdl ioapic_asm_unlock(num) ;\
80 1.5 fvdl 79:
81 1.5 fvdl
82 1.5 fvdl #endif
83