STI, HLT in acpi_cpu_idle_c1

John Baldwin jhb at FreeBSD.org
Tue Jun 29 09:08:03 PDT 2004


On Monday 28 June 2004 09:53 am, Gerrit Nagelhout wrote:
> John Baldwin wrote:
> > Hmm, it appears it is consistently CPU1 that thinks that
> > IPI_HARDCLOCK is not
> > being EOI'd.  Can you try swapping the CPUs and see if the
> > lockup moves from
> > CPU1 to CPU3?
> >
> > --
>
> I added the following *HACK* to the idle code, and let it run
> over the weekend (with halt on idle disabled).  It hit the function
> isr_problem 9 times, but did not lockup anymore.  The problem
> is that I don't know if the EOI just got lost, or whether the
> interrupt was not handled at all.  I couldn't find any ill effects
> from this code ... yet.

As per an errata that Brian pointed out, try using this patch perhaps.  You 
can leave your isr_problem one in and hopefully the counter will stay at zero 
if it works.  It adds some dummy reads of the local APIC to EOI's for IPIs.

Index: apic_vector.s
===================================================================
RCS file: /usr/cvs/src/sys/i386/i386/apic_vector.s,v
retrieving revision 1.101
diff -u -r1.101 apic_vector.s
--- apic_vector.s	26 May 2004 07:43:41 -0000	1.101
+++ apic_vector.s	29 Jun 2004 15:48:29 -0000
@@ -141,6 +141,7 @@
 
 	movl	lapic, %eax
 	movl	$0, LA_EOI(%eax)	/* End Of Interrupt to APIC */
+	movl	LA_EOI(%eax),%eax
 
 	lock
 	incl	smp_tlb_wait
@@ -174,6 +175,7 @@
 
 	movl	lapic, %eax
 	movl	$0, LA_EOI(%eax)	/* End Of Interrupt to APIC */
+	movl	LA_EOI(%eax),%eax
 
 	lock
 	incl	smp_tlb_wait
@@ -212,6 +214,7 @@
 
 	movl	lapic, %eax
 	movl	$0, LA_EOI(%eax)	/* End Of Interrupt to APIC */
+	movl	LA_EOI(%eax),%edx
 
 	lock
 	incl	smp_tlb_wait
@@ -237,6 +240,7 @@
 
 	movl	lapic, %edx
 	movl	$0, LA_EOI(%edx)	/* End Of Interrupt to APIC */
+	movl	LA_EOI(%edx),%eax
 
 	pushl	$0		/* XXX convert trapframe to clockframe */
 	call	forwarded_hardclock
@@ -260,6 +264,7 @@
 
 	movl	lapic, %edx
 	movl	$0, LA_EOI(%edx)	/* End Of Interrupt to APIC */
+	movl	LA_EOI(%edx),%eax
 
 	FAKE_MCOUNT(TF_EIP(%esp))
 
@@ -322,6 +327,7 @@
 
 	movl	lapic, %eax
 	movl	$0, LA_EOI(%eax)	/* End Of Interrupt to APIC */
+	movl	LA_EOI(%eax),%edx
 
 	movl	PCPU(CPUID), %eax
 	imull	$PCB_SIZE, %eax
@@ -382,6 +388,7 @@
 
 	movl	lapic, %eax
 	movl	$0, LA_EOI(%eax)	/* End Of Interrupt to APIC */
+	movl	LA_EOI(%eax),%edx
 	POP_FRAME
 	iret
 	
@@ -402,6 +409,7 @@
 
 	movl	lapic, %eax	
 	movl	$0, LA_EOI(%eax)	/* End Of Interrupt to APIC */
+	movl	LA_EOI(%eax),%edx
 	POP_FRAME
 	iret
 #endif /* SMP */


-- 
John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org


More information about the freebsd-current mailing list