Index: kernel/generic/src/preempt/preemption.c
===================================================================
--- kernel/generic/src/preempt/preemption.c	(revision 1066041e4e1803c9b6506af8a869b03669a25957)
+++ kernel/generic/src/preempt/preemption.c	(revision 2e16033115d5c1a9a9095d87b471d2db4bf1dc88)
@@ -40,4 +40,11 @@
 
 
+/** Determines if we are executing an exception/interrupt handler. */
+static bool in_exc_handler(void)
+{
+	/* Err on the safe side until all exception processing code is audited. */
+	return true;
+}
+
 /** Preemption was enabled. Calls scheduler(). */
 void preemption_enabled_scheduler(void)
@@ -54,7 +61,9 @@
 	 * to suppress preemption continues to work.
 	 */
-	if (!interrupts_disabled()) {
+	if (!interrupts_disabled() && !in_exc_handler()) {
+		preemption_clear_needed();
+		/* We may be preempted here, so we'll scheduler() again. Too bad. */
 		scheduler();
-	}
+	} 
 }
 
