/*
This software and ancillary information (herein called SOFTWARE)
called LinuxBIOS          is made available under the terms described
here.  The SOFTWARE has been approved for release with associated
LA-CC Number 00-34   .  Unless otherwise indicated, this SOFTWARE has
been authored by an employee or employees of the University of
California, operator of the Los Alamos National Laboratory under
Contract No. W-7405-ENG-36 with the U.S. Department of Energy.  The
U.S. Government has rights to use, reproduce, and distribute this
SOFTWARE.  The public may copy, distribute, prepare derivative works
and publicly display this SOFTWARE without charge, provided that this
Notice and any statement of authorship are reproduced on all copies.
Neither the Government nor the University makes any warranty, express
or implied, or assumes any liability or responsibility for the use of
this SOFTWARE.  If SOFTWARE is modified to produce derivative works,
such modified SOFTWARE should be clearly marked, so as not to confuse
it with the version available from LANL.
 */
/* Copyright 2000, Ron Minnich, Advanced Computing Lab, LANL
 * rminnich@lanl.gov
 * Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>,
 * Raptor Engineering
 */

#include <assert.h>
#include <lib.h>
#include <console/console.h>
#include <symbols.h>

int checkstack(void *top_of_stack, int core)
{
	/* Not all archs use CONFIG_STACK_SIZE, those who don't set it to 0. */
	size_t stack_size = CONFIG_STACK_SIZE ?
			    CONFIG_STACK_SIZE : REGION_SIZE(stack);
	int i;
	u32 *stack = (u32 *) (top_of_stack - stack_size);

	if (stack[0] != 0xDEADBEEF) {
		printk(BIOS_ERR,
			"Stack overrun on CPU%d (address %p overwritten). "
			"Increase stack from current %zu bytes\n",
			core, stack, stack_size);
		BUG();
		return -1;
	}

	for (i = 1; i < stack_size/sizeof(stack[0]); i++) {
		if (stack[i] == 0xDEADBEEF)
			continue;
		printk(BIOS_SPEW, "CPU%d: stack: %p - %p, ",
			core, stack, &stack[stack_size/sizeof(stack[0])]);
		printk(BIOS_SPEW, "lowest used address %p, ", &stack[i]);
		printk(BIOS_SPEW, "stack used: %ld bytes\n",
			(unsigned long)&stack[stack_size / sizeof(stack[0])]
			- (unsigned long)&stack[i]);
		return 0;
	}

	return 0;

}
