--- crash/memory.c.orig 2003-09-10 14:06:01.000000000 -0400
+++ crash/memory.c 2003-09-10 14:06:46.000000000 -0400
@@ -6170,6 +6170,7 @@
si->flags &= ~SLAB_WALKTHROUGH;
si->cpucached_cache = 0;
si->num_slabs = si->inuse = 0;
+ gather_cpudata_list(si);
slab_s_buf = GETBUF(SIZE(slab_s));
@@ -6204,7 +6205,9 @@
tmp = INT(slab_s_buf + OFFSET(slab_s_inuse));
si->inuse += tmp;
- gather_cpudata_list(si);
+ if (ACTIVE())
+ gather_cpudata_list(si);
+
si->s_mem = ULONG(slab_s_buf +
OFFSET(slab_s_s_mem));
gather_slab_cached_count(si);
--- crash/task.c.orig 2003-09-10 14:06:05.000000000 -0400
+++ crash/task.c 2003-09-10 14:06:50.000000000 -0400
@@ -3921,7 +3921,7 @@
cnt++;
}
} else if (VALID_MEMBER(runqueue_cpu)) {
- for (i = 0; i < NR_CPUS; i++) {
+ for (i = 0; i < kt->cpus; i++) {
runqaddr = runq + (SIZE(runqueue) * rq_idx(i));
readmem(runqaddr, KVADDR, runqbuf,
SIZE(runqueue), "runqueues curr",
--- crash/lkcd_x86_trace.c.orig 2003-09-19 10:32:11.000000000 -0400
+++ crash/lkcd_x86_trace.c 2003-09-22 14:19:44.000000000 -0400
@@ -891,6 +891,19 @@
#define KERNEL_EFRAME_SZ 13 /* no ss and esp */
#define USER_EFRAME_SZ 15
+#ifdef REDHAT
+#undef __KERNEL_CS
+#undef __KERNEL_DS
+#undef __USER_CS
+#undef __USER_DS
+
+#define __KERNEL_CS 0x10
+#define __KERNEL_DS 0x18
+
+#define __USER_CS 0x23
+#define __USER_DS 0x2B
+#endif
+
/*
* Check if the exception frame is of kernel or user type
* Is checking only DS and CS values sufficient ?
@@ -900,6 +913,11 @@
if (((regs->xcs & 0xffff) == __KERNEL_CS) &&
((regs->xds & 0xffff) == __KERNEL_DS))
return KERNEL_EFRAME;
+#ifdef REDHAT
+ else if (((regs->xcs & 0xffff) == 0x60) &&
+ ((regs->xds & 0xffff) == 0x68))
+ return KERNEL_EFRAME;
+#endif
else if (((regs->xcs & 0xffff) == __USER_CS) &&
((regs->xds & 0xffff) == __USER_DS))
return USER_EFRAME;
@@ -1100,7 +1118,9 @@
* a valid RA at a higher stack address.
*/
if ((bt->flags & BT_SPECULATE) &&
- !STREQ(funcname, "context_switch"))
+ !STREQ(funcname, "context_switch") &&
+ !STREQ(funcname, "die") &&
+ !(bt->frameptr && ((bp+4) < bt->frameptr)))
SEEK_VALID_RA();
}
#else
@@ -1188,7 +1208,7 @@
ra, sp, bp, asp, 0, 0, 0, 0);
return(trace->nframes);
#ifdef REDHAT
- } else if (strstr(func_name, "cpu_idle")) {
+ } else if (STREQ(func_name, "cpu_idle")) {
ra = 0;
bp = sp = saddr - 4;
asp = curframe->asp;
@@ -1634,8 +1654,12 @@
if ((frmp = trace->frame)) {
do {
- if (frmp->error)
+ if (frmp->error) {
errcnt++;
+ if (!(bt->flags & BT_SPECULATE) &&
+ !bt->frameptr)
+ bt->frameptr = frmp->fp;
+ }
if (BT_REFERENCE_CHECK(bt))
do_bt_reference_check(bt, frmp);
frmp = frmp->next;
--- crash/defs.h.orig 2003-09-22 10:40:29.000000000 -0400
+++ crash/defs.h 2003-09-19 15:10:42.000000000 -0400
@@ -503,6 +503,7 @@
struct stack_hook *hp;
struct stack_hook *textlist;
struct reference *ref;
+ ulong frameptr;
ulong debug;
};
--- crash/x86.c.orig 2003-09-19 10:32:26.000000000 -0400
+++ crash/x86.c 2003-09-19 10:28:17.000000000 -0400
@@ -1401,15 +1401,28 @@
/* check for kernel exception frame */
- if (INSTACK(pt->reg_value[INT_EFRAME_EBP], bt) &&
- ((short)pt->reg_value[INT_EFRAME_CS] == 0x10) &&
+ if (((short)pt->reg_value[INT_EFRAME_CS] == 0x10) &&
((short)pt->reg_value[INT_EFRAME_DS] == 0x18) &&
((short)pt->reg_value[INT_EFRAME_ES] == 0x18) &&
IS_KVADDR(pt->reg_value[INT_EFRAME_EIP])) {
+ if (!(machdep->flags & OMIT_FRAME_PTR) &&
+ !INSTACK(pt->reg_value[INT_EFRAME_EBP], bt))
+ continue;
rv = bt->stackbase + sizeof(ulong) * (first - stack);
break;
}
+ if (((short)pt->reg_value[INT_EFRAME_CS] == 0x60) &&
+ ((short)pt->reg_value[INT_EFRAME_DS] == 0x68) &&
+ ((short)pt->reg_value[INT_EFRAME_ES] == 0x68) &&
+ IS_KVADDR(pt->reg_value[INT_EFRAME_EIP])) {
+ if (!(machdep->flags & OMIT_FRAME_PTR) &&
+ !INSTACK(pt->reg_value[INT_EFRAME_EBP], bt))
+ continue;
+ rv = bt->stackbase + sizeof(ulong) * (first - stack);
+ break;
+ }
+
/* check for user exception frame */
if (((short)pt->reg_value[INT_EFRAME_CS] == 0x23) &&
@@ -1417,8 +1430,7 @@
((short)pt->reg_value[INT_EFRAME_ES] == 0x2b) &&
((short)pt->reg_value[INT_EFRAME_SS] == 0x2b) &&
IS_UVADDR(pt->reg_value[INT_EFRAME_EIP], bt->tc) &&
- IS_UVADDR(pt->reg_value[INT_EFRAME_ESP], bt->tc) &&
- IS_UVADDR(pt->reg_value[INT_EFRAME_EBP], bt->tc)) {
+ IS_UVADDR(pt->reg_value[INT_EFRAME_ESP], bt->tc)) {
rv = bt->stackbase + sizeof(ulong) * (first - stack);
break;
}
@@ -1454,7 +1466,7 @@
cs = pt->reg_value[INT_EFRAME_CS];
if (cs == 0x23) {
mode = "USER-MODE";
- } else if (cs == 0x10) {
+ } else if ((cs == 0x10) || (cs == 0x60)) {
mode = "KERNEL-MODE";
} else {
mode = "UNKNOWN-MODE";