From 75dbc389ec62d9ec85178eb5364850c7f9a77997 Mon Sep 17 00:00:00 2001
From: Stefan Reinauer <reinauer@chromium.org>
Date: Mon, 15 Oct 2012 15:19:43 -0700
Subject: Clean up stack checking code

Several small improvements of the stack checking code:
- move the CPU0 stack check right before jumping to the payload
  and out of hardwaremain (that file is too crowded anyways)
- fix prototype in lib.h
- print size of used stack
- use checkstack function both on CPU0 and CPU1-x
- print amount of stack used per core

Signed-off-by: Stefan Reinauer <reinauer@google.com>

Test: Boot coreboot on Link, see the following output:
     ...
     CPU1: stack: 00156000 - 00157000, lowest used address 00156c68,
           stack used: 920 bytes
     CPU2: stack: 00155000 - 00156000, lowest used address 00155c68,
           stack used: 920 bytes
     CPU3: stack: 00154000 - 00155000, lowest used address 00154c68,
           stack used: 920 bytes
     ...
     Jumping to boot code at 1110008
     CPU0: stack: 00157000 - 00158000, lowest used address 00157af8,
           stack used: 1288 bytes

Change-Id: I7b83eeee0186559a0a62daa12e3f7782990fd2df
Reviewed-on: http://review.coreboot.org/1787
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
---
 src/cpu/x86/lapic/lapic_cpu_init.c | 19 +++----------------
 1 file changed, 3 insertions(+), 16 deletions(-)

(limited to 'src/cpu')

diff --git a/src/cpu/x86/lapic/lapic_cpu_init.c b/src/cpu/x86/lapic/lapic_cpu_init.c
index 6c01d8c3a1..621990c0e5 100644
--- a/src/cpu/x86/lapic/lapic_cpu_init.c
+++ b/src/cpu/x86/lapic/lapic_cpu_init.c
@@ -22,6 +22,7 @@
 
 #include <cpu/x86/lapic.h>
 #include <delay.h>
+#include <lib.h>
 #include <string.h>
 #include <console/console.h>
 #include <arch/hlt.h>
@@ -240,7 +241,6 @@ volatile unsigned int secondary_cpu_index;
 
 int start_cpu(device_t cpu)
 {
-	extern unsigned char _estack[];
 	struct cpu_info *info;
 	unsigned long stack_end;
 	unsigned long stack_base;
@@ -503,21 +503,8 @@ static void wait_other_cpus_stop(struct bus *cpu_bus)
 		}
 	}
 	printk(BIOS_DEBUG, "All AP CPUs stopped (%ld loops)\n", loopcount);
-	for(i = 1; i <= last_cpu_index; i++){
-		unsigned long *stack = stacks[i];
-		int lowest;
-		int maxstack = (CONFIG_STACK_SIZE - sizeof(struct cpu_info))
-					/sizeof(*stack) - 1;
-		if (stack[0] != 0xDEADBEEF)
-			printk(BIOS_ERR, "CPU%d overran its stack\n", i);
-		for(lowest = 0; lowest < maxstack; lowest++)
-			if (stack[lowest] != 0xDEADBEEF)
-				break;
-		printk(BIOS_SPEW, "CPU%d: stack allocated from %p to %p:", i,
-			stack, &stack[maxstack]);
-		printk(BIOS_SPEW, "lowest stack address was %p\n",
-			&stack[lowest]);
-	}
+	for(i = 1; i <= last_cpu_index; i++)
+		checkstack((void *)stacks[i] + CONFIG_STACK_SIZE, i);
 }
 
 #endif /* CONFIG_SMP */
-- 
cgit v1.2.3