diff options
author | Michael Brown | 2006-05-17 19:16:24 +0200 |
---|---|---|
committer | Michael Brown | 2006-05-17 19:16:24 +0200 |
commit | a4143e8c87b42cd2bc36f52639929c358eeec8ff (patch) | |
tree | f4fc3c5549c1e67a948b0d7361d49a9bbcfb18f2 /src/core/debug.c | |
parent | Strip down i386 PCI configuration space I/O to the bare minimum. A (diff) | |
download | ipxe-a4143e8c87b42cd2bc36f52639929c358eeec8ff.tar.gz ipxe-a4143e8c87b42cd2bc36f52639929c358eeec8ff.tar.xz ipxe-a4143e8c87b42cd2bc36f52639929c358eeec8ff.zip |
Split debug functions out into core/debug.c, so that they can be
automatically linked in on demand.
Corrected warnings in misc.c. strtoul() really should be
unsigned long strtoul ( const char *p, const char **endp, int base )
but such is not the ANSI standard.
Diffstat (limited to 'src/core/debug.c')
-rw-r--r-- | src/core/debug.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/core/debug.c b/src/core/debug.c new file mode 100644 index 00000000..175a2f95 --- /dev/null +++ b/src/core/debug.c @@ -0,0 +1,87 @@ +#include <stdint.h> +#include <io.h> +#include <console.h> + +void pause ( void ) { + printf ( "\nPress a key" ); + getchar(); + printf ( "\r \r" ); +} + +void more ( void ) { + printf ( "---more---" ); + getchar(); + printf ( "\r \r" ); +} + +/* Produce a paged hex dump of the specified data and length */ +void hex_dump ( const char *data, const unsigned int len ) { + unsigned int index; + for ( index = 0; index < len; index++ ) { + if ( ( index % 16 ) == 0 ) { + printf ( "\n" ); + } + if ( ( index % 368 ) == 352 ) { + more(); + } + if ( ( index % 16 ) == 0 ) { + printf ( "%X [%X] : %hX :", data + index, + virt_to_phys ( data + index ), index ); + } + printf ( " %hhX", data[index] ); + } + printf ( "\n" ); +} + +#define GUARD_SYMBOL ( ( 'M' << 24 ) | ( 'I' << 16 ) | ( 'N' << 8 ) | 'E' ) +/* Fill a region with guard markers. We use a 4-byte pattern to make + * it less likely that check_region will find spurious 1-byte regions + * of non-corruption. + */ +void guard_region ( void *region, size_t len ) { + uint32_t offset = 0; + + len &= ~0x03; + for ( offset = 0; offset < len ; offset += 4 ) { + *((uint32_t *)(region + offset)) = GUARD_SYMBOL; + } +} + +/* Check a region that has been guarded with guard_region() for + * corruption. + */ +int check_region ( void *region, size_t len ) { + uint8_t corrupted = 0; + uint8_t in_corruption = 0; + uint32_t offset = 0; + uint32_t test = 0; + + len &= ~0x03; + for ( offset = 0; offset < len ; offset += 4 ) { + test = *((uint32_t *)(region + offset)) = GUARD_SYMBOL; + if ( ( in_corruption == 0 ) && + ( test != GUARD_SYMBOL ) ) { + /* Start of corruption */ + if ( corrupted == 0 ) { + corrupted = 1; + printf ( "Region %#x-%#x (physical %#x-%#x) " + "corrupted\n", + region, region + len, + virt_to_phys ( region ), + virt_to_phys ( region + len ) ); + } + in_corruption = 1; + printf ( "--- offset %#x ", offset ); + } else if ( ( in_corruption != 0 ) && + ( test == GUARD_SYMBOL ) ) { + /* End of corruption */ + in_corruption = 0; + printf ( "to offset %#x", offset ); + } + + } + if ( in_corruption != 0 ) { + printf ( "to offset %#x (end of region)\n", len-1 ); + } + return corrupted; +} |