From 25eb407c56c95255fc1b88afe084bd5ae393193d Mon Sep 17 00:00:00 2001
From: notaz <notasas@gmail.com>
Date: Sat, 2 Jan 2010 22:25:55 +0000
Subject: [PATCH] pprof: workaround for MMSP2 timer glitch, add draw2

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@852 be3aeb3a-fb24-0410-a615-afba39da0efa
---
 pico/draw2.c            |  7 ++++++-
 platform/linux/Makefile |  2 +-
 platform/linux/pprof.h  | 19 ++++++++++++++++---
 3 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/pico/draw2.c b/pico/draw2.c
index b2e6a710..575f6f7d 100644
--- a/pico/draw2.c
+++ b/pico/draw2.c
@@ -613,11 +613,16 @@ static void DrawDisplayFull(void)
 
 PICO_INTERNAL void PicoFrameFull()
 {
+	pprof_start(draw);
+
 	// prepare cram?
 	if (PicoPrepareCram) PicoPrepareCram();
 
 	// Draw screen:
 	BackFillFull(Pico.video.reg[7]);
-	if (Pico.video.reg[1]&0x40) DrawDisplayFull();
+	if (Pico.video.reg[1] & 0x40)
+		DrawDisplayFull();
+
+	pprof_end(draw);
 }
 
diff --git a/platform/linux/Makefile b/platform/linux/Makefile
index 3362a738..627c2e21 100644
--- a/platform/linux/Makefile
+++ b/platform/linux/Makefile
@@ -89,7 +89,7 @@ PicoDrive : $(OBJS)
 	$(CC) $(CFLAGS) $^ $(LDFLAGS) -Wl,-Map=PicoDrive.map -o $@
 
 pprof: pprof.c
-	$(CROSS)gcc -O2 -ggdb -DPPROF -DPPROF_TOOL -I../../ -I. $^ -o $@ -lrt
+	$(CROSS)gcc -O2 -ggdb -DPPROF -DPPROF_TOOL -I../../ -I. $^ -o $@
 
 %.o : %.asm
 	@echo ">>>" $<
diff --git a/platform/linux/pprof.h b/platform/linux/pprof.h
index 88a97e3e..cccbcbd5 100644
--- a/platform/linux/pprof.h
+++ b/platform/linux/pprof.h
@@ -28,11 +28,14 @@ static __attribute__((always_inline)) inline unsigned int pprof_get_one(void)
   __asm__ __volatile__ ("rdtsc" : "=A" (ret));
   return (unsigned int)ret;
 }
+#define unglitch_timer(x)
 
 #elif defined(__GP2X__)
-// XXX: MMSP2 only
+// XXX: MMSP2 only, timer sometimes seems to return lower vals?
 extern volatile unsigned long *gp2x_memregl;
 #define pprof_get_one() (unsigned int)gp2x_memregl[0x0a00 >> 2]
+#define unglitch_timer(di) \
+  if ((signed int)(di) < 0) di = 0
 
 #else
 #error no timer
@@ -40,12 +43,22 @@ extern volatile unsigned long *gp2x_memregl;
 
 #define pprof_start(point) { \
     unsigned int pp_start_##point = pprof_get_one()
+
 #define pprof_end(point) \
-    pp_counters->counter[pp_##point] += pprof_get_one() - pp_start_##point; \
+    { \
+      unsigned int di = pprof_get_one() - pp_start_##point; \
+      unglitch_timer(di); \
+      pp_counters->counter[pp_##point] += di; \
+    } \
   }
+
 // subtract for recursive stuff
 #define pprof_end_sub(point) \
-    pp_counters->counter[pp_##point] -= pprof_get_one() - pp_start_##point; \
+    { \
+      unsigned int di = pprof_get_one() - pp_start_##point; \
+      unglitch_timer(di); \
+      pp_counters->counter[pp_##point] -= di; \
+    } \
   }
 
 extern void pprof_init(void);
-- 
2.39.5