1/* $NetBSD: i82093reg.h,v 1.6 2016/08/11 15:45:39 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 movl $0,_C_LABEL(local_apic)+LAPIC_EOI
13
14#ifdef MULTIPROCESSOR
15
16#define ioapic_asm_lock(num) \
17 movb $1,%bl ; \
1876: \
19 xchgb %bl,PIC_LOCK(%rdi) ; \
20 testb %bl,%bl ; \
21 jz 78f ; \
2277: \
23 pause ; \
24 nop ; \
25 nop ; \
26 cmpb $0,PIC_LOCK(%rdi) ; \
27 jne 77b ; \
28 jmp 76b ; \
2978:
30
31#define ioapic_asm_unlock(num) \
32 movb $0,PIC_LOCK(%rdi)
33
34#else
35
36#define ioapic_asm_lock(num)
37#define ioapic_asm_unlock(num)
38
39#endif /* MULTIPROCESSOR */
40
41
42#define ioapic_mask(num) \
43 movq IS_PIC(%r14),%rdi ;\
44 ioapic_asm_lock(num) ;\
45 movl IS_PIN(%r14),%esi ;\
46 leaq 0x10(%rsi,%rsi,1),%rsi ;\
47 movq PIC_IOAPIC(%rdi),%rdi ;\
48 movq IOAPIC_SC_REG(%rdi),%r15 ;\
49 movl %esi, (%r15) ;\
50 movq IOAPIC_SC_DATA(%rdi),%r15 ;\
51 movl (%r15),%esi ;\
52 orl $IOAPIC_REDLO_MASK,%esi ;\
53 movl %esi,(%r15) ;\
54 movq IS_PIC(%r14),%rdi ;\
55 ioapic_asm_unlock(num)
56
57#define ioapic_unmask(num) \
58 cmpq $IREENT_MAGIC,(TF_ERR+8)(%rsp) ;\
59 jne 79f ;\
60 movq IS_PIC(%r14),%rdi ;\
61 ioapic_asm_lock(num) ;\
62 movl IS_PIN(%r14),%esi ;\
63 leaq 0x10(%rsi,%rsi,1),%rsi ;\
64 movq PIC_IOAPIC(%rdi),%rdi ;\
65 movq IOAPIC_SC_REG(%rdi),%r15 ;\
66 movq IOAPIC_SC_DATA(%rdi),%r13 ;\
67 movl %esi, (%r15) ;\
68 movl (%r13),%r12d ;\
69 andl $~IOAPIC_REDLO_MASK,%r12d ;\
70 movl %esi,(%r15) ;\
71 movl %r12d,(%r13) ;\
72 movq IS_PIC(%r14),%rdi ;\
73 ioapic_asm_unlock(num) ;\
7479:
75
76#endif
77