Kthread poison checker
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 14 Sep 2013 20:36:49 +0000 (13:36 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Jan 2014 01:57:22 +0000 (17:57 -0800)
Drop this wherever you want to see if you have already clobbered your
current stack's canary.  It'll printk your message and panic.  If you
call this while you are still off your stack, you'll get a Bad Stacktop
panic.

kern/include/kthread.h
kern/src/kthread.c

index fb00a0f..79af307 100644 (file)
@@ -61,6 +61,8 @@ void kthread_init(void);
 void restart_kthread(struct kthread *kthread);
 void kthread_runnable(struct kthread *kthread);
 void kthread_yield(void);
+/* Debugging */
+void check_poison(char *msg);
 
 void sem_init(struct semaphore *sem, int signals);
 void sem_init_irqsave(struct semaphore *sem, int signals);
index 2e98441..76c20ed 100644 (file)
@@ -147,6 +147,16 @@ void kthread_yield(void)
        sem_down(sem);
 }
 
+void check_poison(char *msg)
+{
+#ifdef CONFIG_KTHREAD_POISON
+       if (*(uintptr_t*)ROUNDDOWN(get_stack_top() - 1, PGSIZE) != 0xdeadbeef) {
+               printk("\nBad kthread canary, msg: %s\n", msg);
+               panic("");
+       }
+#endif /* CONFIG_KTHREAD_POISON */
+}
+
 /* Semaphores, using kthreads directly */
 void sem_init(struct semaphore *sem, int signals)
 {