i82093reg.h revision 1.7 1 /* $NetBSD: i82093reg.h,v 1.7 2016/11/25 14:12:55 maxv Exp $ */
2
3 #include <x86/i82093reg.h>
4
5 #ifdef _KERNEL
6
7 #if defined(_KERNEL_OPT)
8 #include "opt_multiprocessor.h"
9 #endif
10
11 #define ioapic_asm_ack(num) \
12 movq _C_LABEL(local_apic_va),%rax ; \
13 movl $0,LAPIC_EOI(%rax)
14
15 #ifdef MULTIPROCESSOR
16
17 #define ioapic_asm_lock(num) \
18 movb $1,%bl ; \
19 76: \
20 xchgb %bl,PIC_LOCK(%rdi) ; \
21 testb %bl,%bl ; \
22 jz 78f ; \
23 77: \
24 pause ; \
25 nop ; \
26 nop ; \
27 cmpb $0,PIC_LOCK(%rdi) ; \
28 jne 77b ; \
29 jmp 76b ; \
30 78:
31
32 #define ioapic_asm_unlock(num) \
33 movb $0,PIC_LOCK(%rdi)
34
35 #else
36
37 #define ioapic_asm_lock(num)
38 #define ioapic_asm_unlock(num)
39
40 #endif /* MULTIPROCESSOR */
41
42
43 #define ioapic_mask(num) \
44 movq IS_PIC(%r14),%rdi ;\
45 ioapic_asm_lock(num) ;\
46 movl IS_PIN(%r14),%esi ;\
47 leaq 0x10(%rsi,%rsi,1),%rsi ;\
48 movq PIC_IOAPIC(%rdi),%rdi ;\
49 movq IOAPIC_SC_REG(%rdi),%r15 ;\
50 movl %esi, (%r15) ;\
51 movq IOAPIC_SC_DATA(%rdi),%r15 ;\
52 movl (%r15),%esi ;\
53 orl $IOAPIC_REDLO_MASK,%esi ;\
54 movl %esi,(%r15) ;\
55 movq IS_PIC(%r14),%rdi ;\
56 ioapic_asm_unlock(num)
57
58 #define ioapic_unmask(num) \
59 cmpq $IREENT_MAGIC,(TF_ERR+8)(%rsp) ;\
60 jne 79f ;\
61 movq IS_PIC(%r14),%rdi ;\
62 ioapic_asm_lock(num) ;\
63 movl IS_PIN(%r14),%esi ;\
64 leaq 0x10(%rsi,%rsi,1),%rsi ;\
65 movq PIC_IOAPIC(%rdi),%rdi ;\
66 movq IOAPIC_SC_REG(%rdi),%r15 ;\
67 movq IOAPIC_SC_DATA(%rdi),%r13 ;\
68 movl %esi, (%r15) ;\
69 movl (%r13),%r12d ;\
70 andl $~IOAPIC_REDLO_MASK,%r12d ;\
71 movl %esi,(%r15) ;\
72 movl %r12d,(%r13) ;\
73 movq IS_PIC(%r14),%rdi ;\
74 ioapic_asm_unlock(num) ;\
75 79:
76
77 #endif
78