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