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