fix printf format args
[people/xl0/gpxe.git] / src / core / debug.c
1 #include <stdint.h>
2 #include <io.h>
3 #include <console.h>
4
5 void pause ( void ) {
6         printf ( "\nPress a key" );
7         getchar();
8         printf ( "\r           \r" );
9 }
10
11 void more ( void ) {
12         printf ( "---more---" );
13         getchar();
14         printf ( "\r          \r" );
15 }
16
17 /* Produce a paged hex dump of the specified data and length */
18 void hex_dump ( const char *data, const unsigned int len ) {
19         unsigned int index;
20         for ( index = 0; index < len; index++ ) {
21                 if ( ( index % 16 ) == 0 ) {
22                         printf ( "\n" );
23                 }
24                 if ( ( index % 368 ) == 352 ) {
25                         more();
26                 }
27                 if ( ( index % 16 ) == 0 ) {
28                         printf ( "%p [%lX] : %X :", data + index,
29                                  virt_to_phys ( data + index ), index );
30                 }
31                 printf ( " %02X", data[index] );
32         }
33         printf ( "\n" );
34 }
35
36 #define GUARD_SYMBOL ( ( 'M' << 24 ) | ( 'I' << 16 ) | ( 'N' << 8 ) | 'E' )
37 /* Fill a region with guard markers.  We use a 4-byte pattern to make
38  * it less likely that check_region will find spurious 1-byte regions
39  * of non-corruption.
40  */
41 void guard_region ( void *region, size_t len ) {
42         uint32_t offset = 0;
43
44         len &= ~0x03;
45         for ( offset = 0; offset < len ; offset += 4 ) {
46                 *((uint32_t *)(region + offset)) = GUARD_SYMBOL;
47         }
48 }
49
50 /* Check a region that has been guarded with guard_region() for
51  * corruption.
52  */
53 int check_region ( void *region, size_t len ) {
54         uint8_t corrupted = 0;
55         uint8_t in_corruption = 0;
56         uint32_t offset = 0;
57         uint32_t test = 0;
58
59         len &= ~0x03;
60         for ( offset = 0; offset < len ; offset += 4 ) {
61                 test = *((uint32_t *)(region + offset)) = GUARD_SYMBOL;
62                 if ( ( in_corruption == 0 ) &&
63                      ( test != GUARD_SYMBOL ) ) {
64                         /* Start of corruption */
65                         if ( corrupted == 0 ) {
66                                 corrupted = 1;
67                                 printf ( "Region %p-%p (physical %#lx-%#lx) "
68                                          "corrupted\n",
69                                          region, region + len,
70                                          virt_to_phys ( region ),
71                                          virt_to_phys ( region + len ) );
72                         }
73                         in_corruption = 1;
74                         printf ( "--- offset %#lx ", offset );
75                 } else if ( ( in_corruption != 0 ) &&
76                             ( test == GUARD_SYMBOL ) ) {
77                         /* End of corruption */
78                         in_corruption = 0;
79                         printf ( "to offset %#lx", offset );
80                 }
81
82         }
83         if ( in_corruption != 0 ) {
84                 printf ( "to offset %#x (end of region)\n", len-1 );
85         }
86         return corrupted;
87 }