diff --git a/ghc/includes/COptWraps.lh b/ghc/includes/COptWraps.lh
index baf217b6635f342110b82151eb35f469425e52a5..5b6d2d9a2e791981e913f6f654e15f2a58903dfa 100644
--- a/ghc/includes/COptWraps.lh
+++ b/ghc/includes/COptWraps.lh
@@ -588,8 +588,17 @@ gets whatever it's after.
 
 #define WRAPPER_SETUP(f,ignore1,ignore2)  SaveAllStgContext();
 
+/* we have to make sure the STG registers are restored. 
+GCC tries to restore the value the registers had in
+the beginning of the current call, which we don't want. 
+We defeat it by saving the registers in the stack again. :-( */
+
 #define WRAPPER_RETURN(x)  \
-    do {RestoreAllStgRegs(); if(x) JMP_(EnterNodeCode);} while(0);
+    do {RestoreAllStgRegs(); if(x) JMP_(EnterNodeCode);} while(0); \
+    __asm__ volatile (		\
+	"cal 1,136(1)\n" \
+        "\tstm 13,-76(1)\n" \
+	"\tstu 1,-136(1)");
 
 #define SEPARATE_WRAPPER_RESTORE    /* none */