1/*	 $NetBSD: i82093reg.h,v 1.4 2008/04/27 17:47:11 skd 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)(%rip)
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