blob: bebeea2c61a81de8b2afecdd80e5da3e73efa24b [file] [log] [blame]
Ronald G. Minnich9764d4c2012-06-12 16:29:32 -07001/*
2This software and ancillary information (herein called SOFTWARE )
3called LinuxBIOS is made available under the terms described
4here. The SOFTWARE has been approved for release with associated
5LA-CC Number 00-34 . Unless otherwise indicated, this SOFTWARE has
6been authored by an employee or employees of the University of
7California, operator of the Los Alamos National Laboratory under
8Contract No. W-7405-ENG-36 with the U.S. Department of Energy. The
9U.S. Government has rights to use, reproduce, and distribute this
10SOFTWARE. The public may copy, distribute, prepare derivative works
11and publicly display this SOFTWARE without charge, provided that this
12Notice and any statement of authorship are reproduced on all copies.
13Neither the Government nor the University makes any warranty, express
14or implied, or assumes any liability or responsibility for the use of
15this SOFTWARE. If SOFTWARE is modified to produce derivative works,
16such modified SOFTWARE should be clearly marked, so as not to confuse
17it with the version available from LANL.
18 */
19/* Copyright 2000, Ron Minnich, Advanced Computing Lab, LANL
20 * rminnich@lanl.gov
Timothy Pearson478575c2015-09-05 19:31:03 -050021 * Copyright (C) 2015 Timothy Pearson <tpearson@raptorengineeringinc.com>, Raptor Engineering
Ronald G. Minnich9764d4c2012-06-12 16:29:32 -070022 */
23
Julius Wernera43db192014-12-15 18:19:03 -080024#include <assert.h>
Ronald G. Minnich9764d4c2012-06-12 16:29:32 -070025#include <lib.h>
26#include <console/console.h>
Julius Wernera43db192014-12-15 18:19:03 -080027#include <symbols.h>
Ronald G. Minnich9764d4c2012-06-12 16:29:32 -070028
29int checkstack(void *top_of_stack, int core)
30{
Julius Wernera43db192014-12-15 18:19:03 -080031 /* Not all archs use CONFIG_STACK_SIZE, those who don't set it to 0. */
32 size_t stack_size = CONFIG_STACK_SIZE ? CONFIG_STACK_SIZE : _stack_size;
Ronald G. Minnich9764d4c2012-06-12 16:29:32 -070033 int i;
Julius Wernera43db192014-12-15 18:19:03 -080034 u32 *stack = (u32 *) (top_of_stack - stack_size);
Ronald G. Minnich9764d4c2012-06-12 16:29:32 -070035
36 if (stack[0] != 0xDEADBEEF){
Timothy Pearson478575c2015-09-05 19:31:03 -050037 printk(BIOS_ERR, "Stack overrun on CPU%d (address %p overwritten). "
Julius Wernera43db192014-12-15 18:19:03 -080038 "Increase stack from current %zu bytes\n",
Timothy Pearson478575c2015-09-05 19:31:03 -050039 core, stack, stack_size);
Julius Wernera43db192014-12-15 18:19:03 -080040 BUG();
Ronald G. Minnich9764d4c2012-06-12 16:29:32 -070041 return -1;
42 }
43
Julius Wernera43db192014-12-15 18:19:03 -080044 for(i = 1; i < stack_size/sizeof(stack[0]); i++){
Ronald G. Minnich9764d4c2012-06-12 16:29:32 -070045 if (stack[i] == 0xDEADBEEF)
46 continue;
Stefan Reinauer75dbc382012-10-15 15:19:43 -070047 printk(BIOS_SPEW, "CPU%d: stack: %p - %p, ",
Julius Wernera43db192014-12-15 18:19:03 -080048 core, stack, &stack[stack_size/sizeof(stack[0])]);
Stefan Reinauer75dbc382012-10-15 15:19:43 -070049 printk(BIOS_SPEW, "lowest used address %p, ", &stack[i]);
50 printk(BIOS_SPEW, "stack used: %ld bytes\n",
Julius Wernera43db192014-12-15 18:19:03 -080051 (unsigned long)&stack[stack_size / sizeof(stack[0])]
52 - (unsigned long)&stack[i]);
Stefan Reinauer75dbc382012-10-15 15:19:43 -070053 return 0;
Ronald G. Minnich9764d4c2012-06-12 16:29:32 -070054 }
55
56 return 0;
57
58}