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