Ronald G. Minnich | 9764d4c | 2012-06-12 16:29:32 -0700 | [diff] [blame] | 1 | /* |
| 2 | This software and ancillary information (herein called SOFTWARE ) |
| 3 | called LinuxBIOS is made available under the terms described |
| 4 | here. The SOFTWARE has been approved for release with associated |
| 5 | LA-CC Number 00-34 . Unless otherwise indicated, this SOFTWARE has |
| 6 | been authored by an employee or employees of the University of |
| 7 | California, operator of the Los Alamos National Laboratory under |
| 8 | Contract No. W-7405-ENG-36 with the U.S. Department of Energy. The |
| 9 | U.S. Government has rights to use, reproduce, and distribute this |
| 10 | SOFTWARE. The public may copy, distribute, prepare derivative works |
| 11 | and publicly display this SOFTWARE without charge, provided that this |
| 12 | Notice and any statement of authorship are reproduced on all copies. |
| 13 | Neither the Government nor the University makes any warranty, express |
| 14 | or implied, or assumes any liability or responsibility for the use of |
| 15 | this SOFTWARE. If SOFTWARE is modified to produce derivative works, |
| 16 | such modified SOFTWARE should be clearly marked, so as not to confuse |
| 17 | it with the version available from LANL. |
| 18 | */ |
| 19 | /* Copyright 2000, Ron Minnich, Advanced Computing Lab, LANL |
| 20 | * rminnich@lanl.gov |
| 21 | */ |
| 22 | |
Julius Werner | a43db19 | 2014-12-15 18:19:03 -0800 | [diff] [blame] | 23 | #include <assert.h> |
Ronald G. Minnich | 9764d4c | 2012-06-12 16:29:32 -0700 | [diff] [blame] | 24 | #include <lib.h> |
| 25 | #include <console/console.h> |
Julius Werner | a43db19 | 2014-12-15 18:19:03 -0800 | [diff] [blame] | 26 | #include <symbols.h> |
Ronald G. Minnich | 9764d4c | 2012-06-12 16:29:32 -0700 | [diff] [blame] | 27 | |
| 28 | int checkstack(void *top_of_stack, int core) |
| 29 | { |
Julius Werner | a43db19 | 2014-12-15 18:19:03 -0800 | [diff] [blame] | 30 | /* Not all archs use CONFIG_STACK_SIZE, those who don't set it to 0. */ |
| 31 | size_t stack_size = CONFIG_STACK_SIZE ? CONFIG_STACK_SIZE : _stack_size; |
Ronald G. Minnich | 9764d4c | 2012-06-12 16:29:32 -0700 | [diff] [blame] | 32 | int i; |
Julius Werner | a43db19 | 2014-12-15 18:19:03 -0800 | [diff] [blame] | 33 | u32 *stack = (u32 *) (top_of_stack - stack_size); |
Ronald G. Minnich | 9764d4c | 2012-06-12 16:29:32 -0700 | [diff] [blame] | 34 | |
| 35 | if (stack[0] != 0xDEADBEEF){ |
Stefan Reinauer | 1b54cc9 | 2013-11-13 15:41:13 -0800 | [diff] [blame] | 36 | printk(BIOS_ERR, "Stack overrun on CPU%d. " |
Julius Werner | a43db19 | 2014-12-15 18:19:03 -0800 | [diff] [blame] | 37 | "Increase stack from current %zu bytes\n", |
| 38 | core, stack_size); |
| 39 | BUG(); |
Ronald G. Minnich | 9764d4c | 2012-06-12 16:29:32 -0700 | [diff] [blame] | 40 | return -1; |
| 41 | } |
| 42 | |
Julius Werner | a43db19 | 2014-12-15 18:19:03 -0800 | [diff] [blame] | 43 | for(i = 1; i < stack_size/sizeof(stack[0]); i++){ |
Ronald G. Minnich | 9764d4c | 2012-06-12 16:29:32 -0700 | [diff] [blame] | 44 | if (stack[i] == 0xDEADBEEF) |
| 45 | continue; |
Stefan Reinauer | 75dbc38 | 2012-10-15 15:19:43 -0700 | [diff] [blame] | 46 | printk(BIOS_SPEW, "CPU%d: stack: %p - %p, ", |
Julius Werner | a43db19 | 2014-12-15 18:19:03 -0800 | [diff] [blame] | 47 | core, stack, &stack[stack_size/sizeof(stack[0])]); |
Stefan Reinauer | 75dbc38 | 2012-10-15 15:19:43 -0700 | [diff] [blame] | 48 | printk(BIOS_SPEW, "lowest used address %p, ", &stack[i]); |
| 49 | printk(BIOS_SPEW, "stack used: %ld bytes\n", |
Julius Werner | a43db19 | 2014-12-15 18:19:03 -0800 | [diff] [blame] | 50 | (unsigned long)&stack[stack_size / sizeof(stack[0])] |
| 51 | - (unsigned long)&stack[i]); |
Stefan Reinauer | 75dbc38 | 2012-10-15 15:19:43 -0700 | [diff] [blame] | 52 | return 0; |
Ronald G. Minnich | 9764d4c | 2012-06-12 16:29:32 -0700 | [diff] [blame] | 53 | } |
| 54 | |
| 55 | return 0; |
| 56 | |
| 57 | } |