i82093reg.h revision 1.8.68.1       1  1.8.68.1       snj /*	 $NetBSD: i82093reg.h,v 1.8.68.1 2018/01/03 19:58:12 snj Exp $ */
      2       1.3      fvdl 
      3       1.4      fvdl #include <x86/i82093reg.h>
      4       1.3      fvdl 
      5       1.5      fvdl #ifdef _KERNEL
      6       1.5      fvdl 
      7       1.5      fvdl #if defined(_KERNEL_OPT)
      8       1.5      fvdl #include "opt_multiprocessor.h"
      9       1.5      fvdl #endif
     10       1.5      fvdl 
     11       1.3      fvdl #define ioapic_asm_ack(num) \
     12       1.3      fvdl 	movl	$0,_C_LABEL(local_apic)+LAPIC_EOI
     13       1.5      fvdl 
     14       1.5      fvdl #ifdef MULTIPROCESSOR
     15       1.5      fvdl 
     16       1.5      fvdl #define ioapic_asm_lock(num) \
     17       1.5      fvdl 	movl	$1,%esi						;\
     18       1.5      fvdl 77:								\
     19       1.5      fvdl 	xchgl	%esi,PIC_LOCK(%edi)				;\
     20       1.5      fvdl 	testl	%esi,%esi					;\
     21       1.5      fvdl 	jne	77b
     22       1.5      fvdl 
     23       1.5      fvdl #define ioapic_asm_unlock(num) \
     24       1.5      fvdl 	movl	$0,PIC_LOCK(%edi)
     25       1.5      fvdl 
     26       1.5      fvdl #else
     27       1.5      fvdl 
     28       1.5      fvdl #define ioapic_asm_lock(num)
     29       1.5      fvdl #define ioapic_asm_unlock(num)
     30       1.5      fvdl 
     31       1.5      fvdl #endif	/* MULTIPROCESSOR */
     32       1.5      fvdl 
     33       1.5      fvdl #define ioapic_mask(num) \
     34       1.5      fvdl 	movl	IS_PIC(%ebp),%edi				;\
     35       1.5      fvdl 	ioapic_asm_lock(num)					;\
     36       1.5      fvdl 	movl	IS_PIN(%ebp),%esi				;\
     37       1.5      fvdl 	leal	0x10(%esi,%esi,1),%esi				;\
     38       1.8  drochner 	movl	PIC_IOAPIC(%edi),%edi				;\
     39       1.5      fvdl 	movl	IOAPIC_SC_REG(%edi),%ebx			;\
     40       1.5      fvdl 	movl	%esi, (%ebx)					;\
     41       1.5      fvdl 	movl	IOAPIC_SC_DATA(%edi),%ebx			;\
     42       1.5      fvdl 	movl	(%ebx),%esi					;\
     43       1.5      fvdl 	orl	$IOAPIC_REDLO_MASK,%esi				;\
     44  1.8.68.1       snj 	andl	$~IOAPIC_REDLO_RIRR,%esi			;\
     45       1.5      fvdl 	movl	%esi,(%ebx)					;\
     46       1.8  drochner 	movl	IS_PIC(%ebp),%edi				;\
     47       1.5      fvdl 	ioapic_asm_unlock(num)
     48       1.5      fvdl 
     49       1.6      fvdl /*
     50       1.6      fvdl  * Since this is called just before the interrupt stub exits, AND
     51       1.6      fvdl  * because the apic ACK doesn't use any registers, all registers
     52       1.6      fvdl  * can be used here.
     53       1.6      fvdl  * XXX this is not obvious
     54       1.6      fvdl  */
     55       1.5      fvdl #define ioapic_unmask(num) \
     56       1.7      yamt 	movl    (%esp),%eax					;\
     57       1.7      yamt 	cmpl    $IREENT_MAGIC,(TF_ERR+4)(%eax)			;\
     58       1.6      fvdl 	jne     79f						;\
     59       1.5      fvdl 	movl	IS_PIC(%ebp),%edi				;\
     60       1.5      fvdl 	ioapic_asm_lock(num)					;\
     61       1.5      fvdl 	movl	IS_PIN(%ebp),%esi				;\
     62       1.5      fvdl 	leal	0x10(%esi,%esi,1),%esi				;\
     63       1.8  drochner 	movl	PIC_IOAPIC(%edi),%edi				;\
     64       1.5      fvdl 	movl	IOAPIC_SC_REG(%edi),%ebx			;\
     65       1.6      fvdl 	movl	IOAPIC_SC_DATA(%edi),%eax			;\
     66       1.6      fvdl 	movl	%esi, (%ebx)					;\
     67       1.6      fvdl 	movl	(%eax),%edx					;\
     68  1.8.68.1       snj 	andl	$~(IOAPIC_REDLO_MASK|IOAPIC_REDLO_RIRR),%edx	;\
     69       1.5      fvdl 	movl	%esi, (%ebx)					;\
     70       1.6      fvdl 	movl	%edx,(%eax)					;\
     71       1.8  drochner 	movl	IS_PIC(%ebp),%edi				;\
     72       1.5      fvdl 	ioapic_asm_unlock(num)					;\
     73       1.5      fvdl 79:
     74       1.5      fvdl 
     75       1.5      fvdl #endif
     76