tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

suspicious code in ioapic locking



The apic handling routines embedded in the macros in vector.S come from i82093reg.h, and operate on struct pic (sys/x86/include/pic.h). The __cpu_simple_lock_t in the struct pic is now a byte, so the code is wrong. This doesn't seem to break anything, probably due to structure padding. The following patch corrects the ioapic code. Another approach would be to rearrange the register usage so that the simple lock routines could be called directly, but this would be more involved. In the patch below, I used %bl because %rbx is blown away in the macros anyway.

Let me know if you think I should commit this.

skd

Index: sys/arch/amd64/include/i82093reg.h
===================================================================
RCS file: /cvsroot/src/sys/arch/amd64/include/i82093reg.h,v
retrieving revision 1.3
diff -u -u -r1.3 i82093reg.h
--- sys/arch/amd64/include/i82093reg.h  11 May 2003 15:46:57 -0000      1.3
+++ sys/arch/amd64/include/i82093reg.h  23 Apr 2008 04:58:48 -0000
@@ -14,14 +14,13 @@
 #ifdef MULTIPROCESSOR
 
 #define ioapic_asm_lock(num) \
-       movl    $1,%esi                                         ;\
+       movb    $1,%bl                                  ;       \
 77:                                                            \
-       xchgl   %esi,PIC_LOCK(%rdi)                             ;\
-       testl   %esi,%esi                                       ;\
+        cmpxchgb %bl,PIC_LOCK(%rdi)                    ;       \
        jne     77b
 
 #define ioapic_asm_unlock(num) \
-       movl    $0,PIC_LOCK(%rdi)
+       movb    $0,PIC_LOCK(%rdi)
        
 #else
 


Home | Main Index | Thread Index | Old Index