diff --git a/smp/callback002/Main.hs b/smp/callback002/Main.hs
new file mode 100644
index 0000000000000000000000000000000000000000..d0ad9c9895b42c609a3783096af9113154420744
--- /dev/null
+++ b/smp/callback002/Main.hs
@@ -0,0 +1,28 @@
+{-# OPTIONS_GHC -fffi #-}
+-- Measure raw callback performance.
+
+module Main where
+
+import Control.Concurrent
+import Control.Monad
+import Foreign
+import Foreign.C
+import Data.IORef
+import System.Environment
+import System.IO
+
+main = do
+  [s] <- getArgs
+  poke pcount (fromIntegral (read s))
+  callC =<< mkFunc (return ())
+
+type FUNC  =  IO ()
+
+foreign import ccall "&count" pcount :: Ptr CInt
+
+foreign import ccall unsafe "wrapper"
+   mkFunc :: FUNC -> IO (FunPtr FUNC)
+
+foreign import ccall threadsafe "cbits.h callC"
+   callC:: FunPtr FUNC -> IO ()
+
diff --git a/smp/callback002/Makefile b/smp/callback002/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..5ad0b5c2722bedbb42adf2ec77c074e8f630f70f
--- /dev/null
+++ b/smp/callback002/Makefile
@@ -0,0 +1,10 @@
+TOP = ../..
+include $(TOP)/mk/boilerplate.mk
+
+FAST_OPTS = 300000
+NORM_OPTS = 3000000
+SLOW_OPTS = 30000000
+
+OBJS += Main_stub.o
+
+include $(TOP)/mk/target.mk
diff --git a/smp/callback002/cbits.c b/smp/callback002/cbits.c
new file mode 100644
index 0000000000000000000000000000000000000000..47ac47f10116fa057a42fa9498ebb0ee1fde151a
--- /dev/null
+++ b/smp/callback002/cbits.c
@@ -0,0 +1,8 @@
+#include "cbits.h"
+
+int count;
+
+void callC( FUNC* f) {
+   int i;
+   for(i=0;i<count;i++) f();
+}
diff --git a/smp/callback002/cbits.h b/smp/callback002/cbits.h
new file mode 100644
index 0000000000000000000000000000000000000000..d0d8517ca5f9af90dd067d40ada27f0b37aa9348
--- /dev/null
+++ b/smp/callback002/cbits.h
@@ -0,0 +1,3 @@
+typedef void FUNC();
+
+void callC( FUNC* f);