This isn't perfect but it should be a good start in regards to 
    testing kstack use.  This patch is against -stable.  It reports
    kernel stack use on process exit and will generate a 'Kernel stack
    underflow' message if it detects an underflow.  It doesn't panic,
    so for a fun time you can leave UPAGES at 2 and watch in horror.

    note: make sure you make depend before making a new kernel, or use
    buildkernel.

                                                -Matt


Index: sys/user.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/user.h,v
retrieving revision 1.24
diff -u -r1.24 user.h
--- sys/user.h  1999/12/29 04:24:49     1.24
+++ sys/user.h  2001/09/25 03:41:04
@@ -109,9 +109,13 @@
         * Remaining fields only for core dump and/or ptrace--
         * not valid at other times!
         */
+       u_int32_t u_guard2;             /* guard the base of the kstack */
        struct  kinfo_proc u_kproc;     /* proc + eproc */
        struct  md_coredump u_md;       /* machine dependent glop */
+       u_int32_t u_guard;              /* guard the base of the kstack */
 };
+
+#define U_GUARD_MAGIC   0x51A2C3D4
 
 /*
  * Redefinitions to make the debuggers happy for now...  This subterfuge
Index: kern/init_main.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/init_main.c,v
retrieving revision 1.134.2.6
diff -u -r1.134.2.6 init_main.c
--- kern/init_main.c    2001/06/15 09:37:55     1.134.2.6
+++ kern/init_main.c    2001/09/25 01:39:05
@@ -358,6 +358,7 @@
         */
        p->p_stats = &p->p_addr->u_stats;
        p->p_sigacts = &p->p_addr->u_sigacts;
+       p->p_addr->u_guard = U_GUARD_MAGIC;     /* bottom of kernel stack */
 
        /*
         * Charge root for one process.
Index: kern/kern_exit.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_exit.c,v
retrieving revision 1.92.2.5
diff -u -r1.92.2.5 kern_exit.c
--- kern/kern_exit.c    2001/07/27 14:06:01     1.92.2.5
+++ kern/kern_exit.c    2001/09/25 04:09:32
@@ -123,6 +123,16 @@
                    WTERMSIG(rv), WEXITSTATUS(rv));
                panic("Going nowhere without my init!");
        }
+       {
+               int *ua;
+               int *addrend = (int *)((char *)p->p_addr + UPAGES * PAGE_SIZE);
+               for (ua = &p->p_addr->u_guard + 1; ua < addrend; ++ua) {
+                   if (*ua != 0x11111111)
+                       break;
+               }
+               printf("process %d exit kstackuse %d\n",
+                   p->p_pid, (char *)addrend - (char *)ua);
+       }
 
        aio_proc_rundown(p);
 
Index: kern/kern_synch.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_synch.c,v
retrieving revision 1.87.2.3
diff -u -r1.87.2.3 kern_synch.c
--- kern/kern_synch.c   2000/12/31 22:10:45     1.87.2.3
+++ kern/kern_synch.c   2001/09/25 02:54:46
@@ -44,13 +44,17 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/proc.h>
+#include <sys/lock.h>
 #include <sys/kernel.h>
 #include <sys/signalvar.h>
 #include <sys/resourcevar.h>
 #include <sys/vmmeter.h>
 #include <sys/sysctl.h>
 #include <vm/vm.h>
+#include <vm/pmap.h>
+#include <vm/vm_map.h>
 #include <vm/vm_extern.h>
+#include <sys/user.h>
 #ifdef KTRACE
 #include <sys/uio.h>
 #include <sys/ktrace.h>
@@ -792,6 +796,13 @@
        register struct proc *p = curproc;      /* XXX */
        register struct rlimit *rlim;
        int x;
+
+       /*
+        * Check to see if the kernel stack underflowed (XXX)
+        */
+       if (p->p_addr->u_guard != U_GUARD_MAGIC) {
+               printf("Kernel stack underflow! %p %p %08x\n", p, p->p_addr, 
+p->p_addr->u_guard);
+       }
 
        /*
         * XXX this spl is almost unnecessary.  It is partly to allow for
Index: i386/i386/pmap.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/pmap.c,v
retrieving revision 1.250.2.10
diff -u -r1.250.2.10 pmap.c
--- i386/i386/pmap.c    2001/07/30 23:27:59     1.250.2.10
+++ i386/i386/pmap.c    2001/09/25 04:03:52
@@ -891,6 +891,7 @@
        }
        if (updateneeded)
                invltlb();
+       memset(up, 0x11, UPAGES * PAGE_SIZE);
 }
 
 /*
Index: i386/include/param.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/param.h,v
retrieving revision 1.54.2.5
diff -u -r1.54.2.5 param.h
--- i386/include/param.h        2001/09/15 00:50:36     1.54.2.5
+++ i386/include/param.h        2001/09/25 03:41:11
@@ -110,7 +110,7 @@
 #define MAXDUMPPGS     (DFLTPHYS/PAGE_SIZE)
 
 #define IOPAGES        2               /* pages of i/o permission bitmap */
-#define UPAGES 2               /* pages of u-area */
+#define UPAGES 4               /* pages of u-area */
 
 /*
  * Ceiling on amount of swblock kva space.
Index: vm/vm_glue.c
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_glue.c,v
retrieving revision 1.94.2.1
diff -u -r1.94.2.1 vm_glue.c
--- vm/vm_glue.c        2000/08/02 22:15:09     1.94.2.1
+++ vm/vm_glue.c        2001/09/25 03:52:01
@@ -265,6 +265,11 @@
            ((caddr_t) &up->u_stats.pstat_endcopy -
                (caddr_t) &up->u_stats.pstat_startcopy));
 
+       /*
+        * Kernel stack guard (detection only unfortunately)
+        */
+       up->u_guard = U_GUARD_MAGIC;
+       up->u_guard2 = U_GUARD_MAGIC;
 
        /*
         * cpu_fork will copy and update the pcb, set up the kernel stack,

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to