xref: /netbsd-src/sys/arch/amd64/include/i82093reg.h (revision 63587e37ee62a993fb53e201ae81ff76361b4eb6)
1*63587e37Srillig /*	 $NetBSD: i82093reg.h,v 1.10 2021/04/17 20:12:55 rillig Exp $ */
281918bf8Sfvdl 
381918bf8Sfvdl #include <x86/i82093reg.h>
481918bf8Sfvdl 
59756b6a9Sfvdl #ifdef _KERNEL
69756b6a9Sfvdl 
79756b6a9Sfvdl #if defined(_KERNEL_OPT)
89756b6a9Sfvdl #include "opt_multiprocessor.h"
99756b6a9Sfvdl #endif
109756b6a9Sfvdl 
1181918bf8Sfvdl #define ioapic_asm_ack(num) \
12b4878842Smaxv 	movq	_C_LABEL(local_apic_va),%rax	; \
13b4878842Smaxv 	movl	$0,LAPIC_EOI(%rax)
149756b6a9Sfvdl 
155c120a76Snonaka #define x2apic_asm_ack(num) \
165c120a76Snonaka 	movl	$(MSR_X2APIC_BASE + MSR_X2APIC_EOI),%ecx ; \
175c120a76Snonaka 	xorl	%eax,%eax			; \
185c120a76Snonaka 	xorl	%edx,%edx			; \
195c120a76Snonaka 	wrmsr
205c120a76Snonaka 
219756b6a9Sfvdl #ifdef MULTIPROCESSOR
229756b6a9Sfvdl 
239756b6a9Sfvdl #define ioapic_asm_lock(num) 			        \
248b7bbc00Sskd 	movb	$1,%bl				;	\
258b7bbc00Sskd 76:							\
268b7bbc00Sskd         xchgb	%bl,PIC_LOCK(%rdi)		;	\
278b7bbc00Sskd 	testb	%bl,%bl				;	\
288b7bbc00Sskd 	jz	78f				;	\
299756b6a9Sfvdl 77:							\
308b7bbc00Sskd 	pause					;	\
318b7bbc00Sskd 	nop					;	\
328b7bbc00Sskd 	nop					;	\
338b7bbc00Sskd 	cmpb	$0,PIC_LOCK(%rdi)		;	\
348b7bbc00Sskd 	jne	77b				;	\
358b7bbc00Sskd 	jmp	76b				;	\
368b7bbc00Sskd 78:
379756b6a9Sfvdl 
389756b6a9Sfvdl #define ioapic_asm_unlock(num) \
398b7bbc00Sskd 	movb	$0,PIC_LOCK(%rdi)
409756b6a9Sfvdl 
419756b6a9Sfvdl #else
429756b6a9Sfvdl 
439756b6a9Sfvdl #define ioapic_asm_lock(num)
449756b6a9Sfvdl #define ioapic_asm_unlock(num)
459756b6a9Sfvdl 
469756b6a9Sfvdl #endif	/* MULTIPROCESSOR */
479756b6a9Sfvdl 
489756b6a9Sfvdl 
499756b6a9Sfvdl #define ioapic_mask(num) \
509756b6a9Sfvdl 	movq	IS_PIC(%r14),%rdi				;\
519756b6a9Sfvdl 	ioapic_asm_lock(num)					;\
529756b6a9Sfvdl 	movl	IS_PIN(%r14),%esi				;\
539756b6a9Sfvdl 	leaq	0x10(%rsi,%rsi,1),%rsi				;\
5454745077Sdrochner 	movq	PIC_IOAPIC(%rdi),%rdi				;\
559756b6a9Sfvdl 	movq	IOAPIC_SC_REG(%rdi),%r15			;\
569756b6a9Sfvdl 	movl	%esi, (%r15)					;\
579756b6a9Sfvdl 	movq	IOAPIC_SC_DATA(%rdi),%r15			;\
589756b6a9Sfvdl 	movl	(%r15),%esi					;\
599756b6a9Sfvdl 	orl	$IOAPIC_REDLO_MASK,%esi				;\
60eafc5bd3Snakayama 	andl	$~IOAPIC_REDLO_RIRR,%esi			;\
619756b6a9Sfvdl 	movl	%esi,(%r15)					;\
6254745077Sdrochner 	movq	IS_PIC(%r14),%rdi				;\
639756b6a9Sfvdl 	ioapic_asm_unlock(num)
649756b6a9Sfvdl 
659756b6a9Sfvdl #define ioapic_unmask(num) \
669756b6a9Sfvdl 	cmpq	$IREENT_MAGIC,(TF_ERR+8)(%rsp)			;\
679756b6a9Sfvdl 	jne	79f						;\
689756b6a9Sfvdl 	movq	IS_PIC(%r14),%rdi				;\
699756b6a9Sfvdl 	ioapic_asm_lock(num)					;\
709756b6a9Sfvdl 	movl	IS_PIN(%r14),%esi				;\
719756b6a9Sfvdl 	leaq	0x10(%rsi,%rsi,1),%rsi				;\
7254745077Sdrochner 	movq	PIC_IOAPIC(%rdi),%rdi				;\
739756b6a9Sfvdl 	movq	IOAPIC_SC_REG(%rdi),%r15			;\
7431024872Sfvdl 	movq	IOAPIC_SC_DATA(%rdi),%r13			;\
759756b6a9Sfvdl 	movl	%esi, (%r15)					;\
7631024872Sfvdl 	movl	(%r13),%r12d					;\
77eafc5bd3Snakayama 	andl	$~(IOAPIC_REDLO_MASK|IOAPIC_REDLO_RIRR),%r12d	;\
789756b6a9Sfvdl 	movl	%esi,(%r15)					;\
7931024872Sfvdl 	movl	%r12d,(%r13)					;\
8054745077Sdrochner 	movq	IS_PIC(%r14),%rdi				;\
819756b6a9Sfvdl 	ioapic_asm_unlock(num)					;\
829756b6a9Sfvdl 79:
839756b6a9Sfvdl 
849756b6a9Sfvdl #endif
85