| 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 ; \ |
| 18 | 76: \ |
| 19 | xchgb %bl,PIC_LOCK(%rdi) ; \ |
| 20 | testb %bl,%bl ; \ |
| 21 | jz 78f ; \ |
| 22 | 77: \ |
| 23 | pause ; \ |
| 24 | nop ; \ |
| 25 | nop ; \ |
| 26 | cmpb $0,PIC_LOCK(%rdi) ; \ |
| 27 | jne 77b ; \ |
| 28 | jmp 76b ; \ |
| 29 | 78: |
| 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) ;\ |
| 74 | 79: |
| 75 | |
| 76 | #endif |
| 77 | |