Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Sep 2001 21:26:07 -0700 (PDT)
From:      Matt Dillon <dillon@earth.backplane.com>
To:        Peter Wemm <peter@wemm.org>
Cc:        Ian Dowse <iedowse@maths.tcd.ie>, Julian Elischer <julian@elischer.org>, hackers@FreeBSD.ORG
Subject:   Patch to test kstack usage.
Message-ID:  <200109250426.f8P4Q7a99088@earth.backplane.com>

next in thread | raw e-mail | index | archive | help
    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 majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200109250426.f8P4Q7a99088>