NetBSD/sys/arch/amd64/include/i82093reg.h

77 lines
1.6 KiB
C

/* $NetBSD: i82093reg.h,v 1.5 2008/07/03 14:02:25 drochner Exp $ */
#include <x86/i82093reg.h>
#ifdef _KERNEL
#if defined(_KERNEL_OPT)
#include "opt_multiprocessor.h"
#endif
#define ioapic_asm_ack(num) \
movl $0,(_C_LABEL(local_apic)+LAPIC_EOI)(%rip)
#ifdef MULTIPROCESSOR
#define ioapic_asm_lock(num) \
movb $1,%bl ; \
76: \
xchgb %bl,PIC_LOCK(%rdi) ; \
testb %bl,%bl ; \
jz 78f ; \
77: \
pause ; \
nop ; \
nop ; \
cmpb $0,PIC_LOCK(%rdi) ; \
jne 77b ; \
jmp 76b ; \
78:
#define ioapic_asm_unlock(num) \
movb $0,PIC_LOCK(%rdi)
#else
#define ioapic_asm_lock(num)
#define ioapic_asm_unlock(num)
#endif /* MULTIPROCESSOR */
#define ioapic_mask(num) \
movq IS_PIC(%r14),%rdi ;\
ioapic_asm_lock(num) ;\
movl IS_PIN(%r14),%esi ;\
leaq 0x10(%rsi,%rsi,1),%rsi ;\
movq PIC_IOAPIC(%rdi),%rdi ;\
movq IOAPIC_SC_REG(%rdi),%r15 ;\
movl %esi, (%r15) ;\
movq IOAPIC_SC_DATA(%rdi),%r15 ;\
movl (%r15),%esi ;\
orl $IOAPIC_REDLO_MASK,%esi ;\
movl %esi,(%r15) ;\
movq IS_PIC(%r14),%rdi ;\
ioapic_asm_unlock(num)
#define ioapic_unmask(num) \
cmpq $IREENT_MAGIC,(TF_ERR+8)(%rsp) ;\
jne 79f ;\
movq IS_PIC(%r14),%rdi ;\
ioapic_asm_lock(num) ;\
movl IS_PIN(%r14),%esi ;\
leaq 0x10(%rsi,%rsi,1),%rsi ;\
movq PIC_IOAPIC(%rdi),%rdi ;\
movq IOAPIC_SC_REG(%rdi),%r15 ;\
movq IOAPIC_SC_DATA(%rdi),%r13 ;\
movl %esi, (%r15) ;\
movl (%r13),%r12d ;\
andl $~IOAPIC_REDLO_MASK,%r12d ;\
movl %esi,(%r15) ;\
movl %r12d,(%r13) ;\
movq IS_PIC(%r14),%rdi ;\
ioapic_asm_unlock(num) ;\
79:
#endif