summaryrefslogtreecommitdiff
path: root/src/include/cpu
diff options
context:
space:
mode:
authorMarc Jones <marc.jones@amd.com>2007-12-19 01:52:11 +0000
committerMarc Jones <marc.jones@amd.com>2007-12-19 01:52:11 +0000
commitba8965c0395a295828911cb375e7122051e73962 (patch)
treeea593e7a7d743cd6bd80c246379b8fafeaea9079 /src/include/cpu
parent2ce8bfd251cfee8a19c09217ace28a5be2684311 (diff)
Changed the stop_this_cpu() to just hlt.
Removed local APIC INIT (don't worry the APIC and AP are still initialized). The local APIC INIT seemed to be the incorrect thing to do to stop an AP. The Intel Multiprocessor specification indicated that a vector should be set and a START should happen following an INIT. Then AP will execute the instructions pointed to by the vector. There is no vector or start in stop_this_cpu(). This seems to put the AP in an in-between state. In the case of Barcelona the AP's MSRs and PCI register are not accessible by the hardware debugger. The better solution seems to be to just put the AP in a hlt and allow the AP to go into C1. Then APIC managing software running on the BSP can program the AP as needed. Signed-off-by: Marc Jones <marc.jones@amd.com> Reviewed-by: Jordan Crouse <jordan.crouse@amd.com> Acked-by: Ronald G. Minnich <rminnich@gmail.com> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3017 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src/include/cpu')
-rw-r--r--src/include/cpu/x86/lapic.h17
1 files changed, 1 insertions, 16 deletions
diff --git a/src/include/cpu/x86/lapic.h b/src/include/cpu/x86/lapic.h
index 5d696dce18..e2c2146942 100644
--- a/src/include/cpu/x86/lapic.h
+++ b/src/include/cpu/x86/lapic.h
@@ -54,22 +54,7 @@ static inline __attribute__((always_inline)) unsigned long lapicid(void)
static inline __attribute__((always_inline)) void stop_this_cpu(void)
{
- unsigned apicid;
- apicid = lapicid();
-
- /* Send an APIC INIT to myself */
- lapic_write(LAPIC_ICR2, SET_LAPIC_DEST_FIELD(apicid));
- lapic_write(LAPIC_ICR, LAPIC_INT_LEVELTRIG | LAPIC_INT_ASSERT | LAPIC_DM_INIT);
- /* Wait for the ipi send to finish */
- lapic_wait_icr_idle();
-
- /* Deassert the APIC INIT */
- lapic_write(LAPIC_ICR2, SET_LAPIC_DEST_FIELD(apicid));
- lapic_write(LAPIC_ICR, LAPIC_INT_LEVELTRIG | LAPIC_DM_INIT);
- /* Wait for the ipi send to finish */
- lapic_wait_icr_idle();
-
- /* If I haven't halted spin forever */
+ /* Called by an AP when it is ready to halt and wait for a new task */
for(;;) {
hlt();
}