Index: kernel/arch/ppc32/include/barrier.h
===================================================================
--- kernel/arch/ppc32/include/barrier.h	(revision 62cd66fd071922cb87171eb7cbad1f5246149f7e)
+++ kernel/arch/ppc32/include/barrier.h	(revision 37596817bd25b85f6b01ed4b67b6a8ebdfccbdc1)
@@ -43,6 +43,40 @@
 #define write_barrier() asm volatile ("eieio" ::: "memory")
 
-#define smc_coherence(a)
-#define smc_coherence_block(a, l)
+/*
+ * The IMB sequence used here is valid for all possible cache models
+ * on uniprocessor. SMP might require a different sequence.
+ * See PowerPC Programming Environment for 32-Bit Microprocessors,
+ * chapter 5.1.5.2
+ */
+
+static inline void smc_coherence(void *addr)
+{
+	asm volatile (
+		"dcbst 0, %0\n"
+		"sync\n"
+		"icbi 0, %0\n"
+		"isync\n"
+		:: "r" (addr)
+	);
+}
+
+#define COHERENCE_INVAL_MIN	4
+
+static inline void smc_coherence_block(void *addr, unsigned long len)
+{
+	unsigned long i;
+
+	for (i = 0; i < len; i += COHERENCE_INVAL_MIN) {
+		asm volatile ("dcbst 0, %0\n" :: "r" (addr + i));
+	}
+
+	asm volatile ("sync");
+
+	for (i = 0; i < len; i += COHERENCE_INVAL_MIN) {
+		asm volatile ("icbi 0, %0\n" :: "r" (addr + i));
+	}
+
+	asm volatile ("isync");
+}
 
 #endif
Index: kernel/generic/src/mm/backend_elf.c
===================================================================
--- kernel/generic/src/mm/backend_elf.c	(revision 62cd66fd071922cb87171eb7cbad1f5246149f7e)
+++ kernel/generic/src/mm/backend_elf.c	(revision 37596817bd25b85f6b01ed4b67b6a8ebdfccbdc1)
@@ -154,5 +154,6 @@
 			    (void *) (base + i * FRAME_SIZE), FRAME_SIZE);
 			if (entry->p_flags & PF_X) {
-				smc_coherence_block(PA2KA(frame), FRAME_SIZE);
+				smc_coherence_block((void *) PA2KA(frame),
+				    FRAME_SIZE);
 			}
 			dirty = true;
@@ -194,6 +195,6 @@
 		    FRAME_SIZE - pad_lo - pad_hi);
 		if (entry->p_flags & PF_X) {
-			smc_coherence_block(PA2KA(frame) + pad_lo, FRAME_SIZE -
-			    pad_lo - pad_hi);
+			smc_coherence_block((void *) (PA2KA(frame) + pad_lo), 
+			    FRAME_SIZE - pad_lo - pad_hi);
 		}
 		memsetb((void *) PA2KA(frame), pad_lo, 0);
