From 795fec2b6041e7367c65114ea8222d9cfb4ad1d6 Mon Sep 17 00:00:00 2001 From: fvdl Date: Sun, 11 May 2003 14:02:17 +0000 Subject: [PATCH] The i82093 spec is unclear about it, but my assumption that the selected ioapic register would stick across a read+write appears to be invalid for some ioapics. So, select it again for the mask write. --- sys/arch/i386/include/i82093reg.h | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/sys/arch/i386/include/i82093reg.h b/sys/arch/i386/include/i82093reg.h index 5180d64a38b2..a0133b5587e3 100644 --- a/sys/arch/i386/include/i82093reg.h +++ b/sys/arch/i386/include/i82093reg.h @@ -1,4 +1,4 @@ -/* $NetBSD: i82093reg.h,v 1.5 2003/05/04 22:01:58 fvdl Exp $ */ +/* $NetBSD: i82093reg.h,v 1.6 2003/05/11 14:02:17 fvdl Exp $ */ #include @@ -30,7 +30,6 @@ #endif /* MULTIPROCESSOR */ - #define ioapic_mask(num) \ movl IS_PIC(%ebp),%edi ;\ ioapic_asm_lock(num) ;\ @@ -44,19 +43,26 @@ movl %esi,(%ebx) ;\ ioapic_asm_unlock(num) +/* + * Since this is called just before the interrupt stub exits, AND + * because the apic ACK doesn't use any registers, all registers + * can be used here. + * XXX this is not obvious + */ #define ioapic_unmask(num) \ - cmpl $IREENT_MAGIC,(TF_ERR+4)(%esp) ;\ - jne 79f ;\ + cmpl $IREENT_MAGIC,(TF_ERR+4)(%esp) ;\ + jne 79f ;\ movl IS_PIC(%ebp),%edi ;\ ioapic_asm_lock(num) ;\ movl IS_PIN(%ebp),%esi ;\ leal 0x10(%esi,%esi,1),%esi ;\ movl IOAPIC_SC_REG(%edi),%ebx ;\ + movl IOAPIC_SC_DATA(%edi),%eax ;\ movl %esi, (%ebx) ;\ - movl IOAPIC_SC_DATA(%edi),%ebx ;\ - movl (%ebx),%esi ;\ - andl $~IOAPIC_REDLO_MASK,%esi ;\ - movl %esi,(%ebx) ;\ + movl (%eax),%edx ;\ + andl $~IOAPIC_REDLO_MASK,%edx ;\ + movl %esi, (%ebx) ;\ + movl %edx,(%eax) ;\ ioapic_asm_unlock(num) ;\ 79: