96 lines
2.7 KiB
Diff
96 lines
2.7 KiB
Diff
--- ksym.c
|
|
+++ ksym.c 2001-05-23 18:50:36.000000000 +0000
|
|
@@ -112,6 +112,7 @@
|
|
#include <stdlib.h>
|
|
#include <malloc.h>
|
|
#include <sys/utsname.h>
|
|
+#include <ctype.h>
|
|
#include "klogd.h"
|
|
#include "ksyms.h"
|
|
|
|
@@ -770,6 +771,84 @@ extern char * ExpandKadds(line, el)
|
|
if ( (num_syms == 0) ||
|
|
(kp = strstr(line, "[<")) == (char *) 0 )
|
|
{
|
|
+#ifdef __sparc__
|
|
+ if (num_syms) {
|
|
+ /*
|
|
+ * On SPARC, register dumps do not have the [< >] characters in it.
|
|
+ */
|
|
+ static struct sparc_tests {
|
|
+ char *str;
|
|
+ int len;
|
|
+ } tests[] = { { "PC: ", 4 },
|
|
+ { " o7: ", 5 },
|
|
+ { " ret_pc: ", 9 },
|
|
+ { " i7: ", 5 },
|
|
+ { "Caller[", 7 }
|
|
+ };
|
|
+ int i, j, ndigits;
|
|
+ char *kp2;
|
|
+ for (i = 0; i < 5; i++) {
|
|
+ kp = strstr(line, tests[i].str);
|
|
+ if (!kp) continue;
|
|
+ kp2 = kp + tests[i].len;
|
|
+ if (!isxdigit(*kp2)) continue;
|
|
+ for (ndigits = 1; isxdigit(kp2[ndigits]); ndigits++);
|
|
+ if (ndigits != 8 && ndigits != 16) continue;
|
|
+ /* On sparc64, all kernel addresses are in first 4GB */
|
|
+ if (ndigits == 16) {
|
|
+ if (strncmp (kp2, "00000000", 8)) continue;
|
|
+ kp2 += 8;
|
|
+ }
|
|
+ if (!i) {
|
|
+ char *kp3;
|
|
+ if (ndigits == 16 && kp > line && kp[-1L] != 'T') continue;
|
|
+ kp3 = kp2 + 8;
|
|
+ if (ndigits == 16) {
|
|
+ if (strncmp (kp3, " TNPC: 00000000", 15) || !isxdigit(kp3[15]))
|
|
+ continue;
|
|
+ kp3 += 15;
|
|
+ } else {
|
|
+ if (strncmp (kp3, " NPC: ", 6) || !isxdigit(kp3[6]))
|
|
+ continue;
|
|
+ kp3 += 6;
|
|
+ }
|
|
+ for (j = 0; isxdigit(kp3[j]); j++);
|
|
+ if (j != 8) continue;
|
|
+ strncpy(elp, line, kp2 + 8 - line);
|
|
+ elp += kp2 + 8 - line;
|
|
+ value = strtol(kp2, (char **) 0, 16);
|
|
+ if ( (symbol = LookupSymbol(value, &sym)) ) {
|
|
+ if (sym.size)
|
|
+ elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
|
|
+ else
|
|
+ elp += sprintf(elp, " (%s)", symbol);
|
|
+ }
|
|
+ strncpy(elp, kp2 + 8, kp3 - kp2);
|
|
+ elp += kp3 - kp2;
|
|
+ value = strtol(kp3, (char **) 0, 16);
|
|
+ if ( (symbol = LookupSymbol(value, &sym)) ) {
|
|
+ if (sym.size)
|
|
+ elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
|
|
+ else
|
|
+ elp += sprintf(elp, " (%s)", symbol);
|
|
+ }
|
|
+ strcpy(elp, kp3 + 8);
|
|
+ } else {
|
|
+ strncpy(elp, line, kp2 + 8 - line);
|
|
+ elp += kp2 + 8 - line;
|
|
+ value = strtol(kp2, (char **) 0, 16);
|
|
+ if ( (symbol = LookupSymbol(value, &sym)) ) {
|
|
+ if (sym.size)
|
|
+ elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
|
|
+ else
|
|
+ elp += sprintf(elp, " (%s)", symbol);
|
|
+ }
|
|
+ strcpy(elp, kp2 + 8);
|
|
+ }
|
|
+ return el;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
strcpy(el, line);
|
|
return(el);
|
|
}
|