diff options
author | Chris Johns <chrisj@rtems.org> | 2012-12-23 16:54:59 +1100 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2012-12-23 16:57:16 +1100 |
commit | 5b16e44523c99ea08f8392e732e486ab45658e4a (patch) | |
tree | 0e001348bcb7617d9974d0ed8b7f1b28578eb174 | |
parent | 9556127da537437341278517767a68f59fbeb0b8 (diff) |
Add a memory dump utility.
-rw-r--r-- | rtems-utils.cpp | 162 | ||||
-rw-r--r-- | rtems-utils.h | 51 | ||||
-rw-r--r-- | wscript | 7 |
3 files changed, 219 insertions, 1 deletions
diff --git a/rtems-utils.cpp b/rtems-utils.cpp new file mode 100644 index 0000000..8fda105 --- /dev/null +++ b/rtems-utils.cpp @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2012, Chris Johns <chrisj@rtems.org> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/** + * @file + * + * @ingroup RLD + * + * @brief A memory dump routine. + * + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <iomanip> +#include <iostream> +#include <vector> + +#include <rtems-utils.h> + +namespace rtems +{ + namespace utils + { + void + dump (const void* addr, + size_t length, + size_t size, + bool real, + size_t line_length, + uint32_t offset) + { + char* data; + size_t b = 0; + uint8_t d8 = 0; + uint16_t d16 = 0; + uint32_t d32 = 0; + uint64_t d64 = 0; + + const uint8_t* addr8 = static_cast <const uint8_t*> (addr); + + data = new char[line_length]; + + try + { + std::cout << std::hex << std::setfill ('0'); + + while (true) + { + if (((b % line_length) == 0) || (b >= length)) + { + if (b) + { + size_t line = b % line_length; + + if (line) + { + size_t remaining = line_length - line; + remaining = (remaining * 2) + (remaining / size); + std::cout << std::setfill (' ') + << std::setw (remaining) << ' ' + << std::setfill ('0'); + } + else + line = line_length; + + std::cout << ' '; + + for (size_t c = 0; c < line; c++) + { + if ((data[c] < 0x20) || (data[c] > 0x7e)) + std::cout << '.'; + else + std::cout << data[c]; + } + + if (b >= length) + { + std::cout << std::dec << std::setfill (' ') + << std::endl << std::flush; + break; + } + + std::cout << std::endl; + } + + if (real) + std::cout << std::setw (sizeof(void*)) << (uint64_t) (addr8 + b); + else + std::cout << std::setw (8) << (uint32_t) (offset + b); + } + + if ((b & (line_length - 1)) == (line_length >> 1)) + std::cout << "-"; + else + std::cout << " "; + + switch (size) + { + case sizeof (uint8_t): + default: + d8 = *(addr8 + b); + std::cout << std::setw (2) << (uint32_t) d8; + data[(b % line_length) + 0] = d8; + break; + + case sizeof (uint16_t): + d16 = *((const uint16_t*) (addr8 + b)); + std::cout << std::setw (4) << d16; + data[(b % line_length) + 0] = (uint8_t) (d16 >> 8); + data[(b % line_length) + 1] = (uint8_t) d16; + break; + + case sizeof (uint32_t): + d32 = *((const uint32_t*) (addr8 + b)); + std::cout << std::setw (8) << d32; + for (int i = sizeof (uint32_t); i > 0; --i) + { + data[(b % line_length) + i] = (uint8_t) d32; + d32 >>= 8; + } + break; + + case sizeof (uint64_t): + d64 = *((const uint64_t*) (addr8 + b)); + std::cout << std::setw (16) << d64; + for (int i = sizeof (uint64_t); i > 0; --i) + { + data[(b % line_length) + i] = (uint8_t) d64; + d64 >>= 8; + } + break; + } + b += size; + } + } + catch (...) + { + delete [] data; + throw; + } + + delete [] data; + + std::cout << std::dec << std::setfill (' '); + } + } +} diff --git a/rtems-utils.h b/rtems-utils.h new file mode 100644 index 0000000..7a8dd74 --- /dev/null +++ b/rtems-utils.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2012, Chris Johns <chrisj@rtems.org> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/** + * @file + * + * @ingroup RLD + * + * @brief A memory dump routine. + * + */ + +#if !defined (_MEMORY_DUMP_H_) +#define _MEMORY_DUMP_H_ + +namespace rtems +{ + namespace utils + { + /** + * Hex display memory. + * + * @param addr The address of the memory to display. + * @param mem The actual memory to display. If 0 use addr. + * @param length The number of elements to display. + * @param size The size of the data element. + * @param real Use the real address based on addr. + * @param line_length Number of elements per line. + */ + void dump (const void* addr, + size_t length, + size_t size, + bool real = false, + size_t line_length = 16, + uint32_t offset = 0); + } +} + +#endif @@ -111,6 +111,11 @@ def build(bld): 'rld.cpp'] # + # RTEMS Utilities. + # + rtems_utils = ['rtems-utils.cpp'] + + # # Build the linker. # bld.program(target = 'rtems-ld', @@ -139,7 +144,7 @@ def build(bld): # Build the RAP utility. # bld.program(target = 'rtems-rap', - source = ['rtems-rapper.cpp'] + rld_source, + source = ['rtems-rapper.cpp'] + rld_source + rtems_utils, defines = ['HAVE_CONFIG_H=1', 'RTEMS_VERSION=' + bld.env.RTEMS_VERSION], includes = ['.'] + bld.includes, cflags = bld.cflags + bld.warningflags, |