1/*	 $NetBSD: i82093reg.h,v 1.11 2017/11/13 11:45:54 nakayama 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	_C_LABEL(local_apic_va),%eax	; \
13	movl	$0,LAPIC_EOI(%eax)
14
15#define x2apic_asm_ack(num) \
16	movl	$(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx ; \
17	xorl	%eax,%eax			; \
18	xorl	%edx,%edx			; \
19	wrmsr
20
21#ifdef MULTIPROCESSOR
22
23#define ioapic_asm_lock(num) \
24	movl	$1,%esi						;\
2577:								\
26	xchgl	%esi,PIC_LOCK(%edi)				;\
27	testl	%esi,%esi					;\
28	jne	77b
29
30#define ioapic_asm_unlock(num) \
31	movl	$0,PIC_LOCK(%edi)
32
33#else
34
35#define ioapic_asm_lock(num)
36#define ioapic_asm_unlock(num)
37
38#endif	/* MULTIPROCESSOR */
39
40#define ioapic_mask(num) \
41	movl	IS_PIC(%ebp),%edi				;\
42	ioapic_asm_lock(num)					;\
43	movl	IS_PIN(%ebp),%esi				;\
44	leal	0x10(%esi,%esi,1),%esi				;\
45	movl	PIC_IOAPIC(%edi),%edi				;\
46	movl	IOAPIC_SC_REG(%edi),%ebx			;\
47	movl	%esi, (%ebx)					;\
48	movl	IOAPIC_SC_DATA(%edi),%ebx			;\
49	movl	(%ebx),%esi					;\
50	orl	$IOAPIC_REDLO_MASK,%esi				;\
51	andl	$~IOAPIC_REDLO_RIRR,%esi			;\
52	movl	%esi,(%ebx)					;\
53	movl	IS_PIC(%ebp),%edi				;\
54	ioapic_asm_unlock(num)
55
56/*
57 * Since this is called just before the interrupt stub exits, AND
58 * because the apic ACK doesn't use any registers, all registers
59 * can be used here.
60 * XXX this is not obvious
61 */
62#define ioapic_unmask(num) \
63	movl    (%esp),%eax					;\
64	cmpl    $IREENT_MAGIC,(TF_ERR+4)(%eax)			;\
65	jne     79f						;\
66	movl	IS_PIC(%ebp),%edi				;\
67	ioapic_asm_lock(num)					;\
68	movl	IS_PIN(%ebp),%esi				;\
69	leal	0x10(%esi,%esi,1),%esi				;\
70	movl	PIC_IOAPIC(%edi),%edi				;\
71	movl	IOAPIC_SC_REG(%edi),%ebx			;\
72	movl	IOAPIC_SC_DATA(%edi),%eax			;\
73	movl	%esi, (%ebx)					;\
74	movl	(%eax),%edx					;\
75	andl	$~(IOAPIC_REDLO_MASK|IOAPIC_REDLO_RIRR),%edx	;\
76	movl	%esi, (%ebx)					;\
77	movl	%edx,(%eax)					;\
78	movl	IS_PIC(%ebp),%edi				;\
79	ioapic_asm_unlock(num)					;\
8079:
81
82#endif
83