From 8a4843859f03421855b7393a4f7dd5d1197561cb Mon Sep 17 00:00:00 2001 From: notaz 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/platform@852 be3aeb3a-fb24-0410-a615-afba39da0efa --- linux/Makefile | 2 +- linux/pprof.h | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/linux/Makefile b/linux/Makefile index 3362a73..627c2e2 100644 --- a/linux/Makefile +++ b/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/linux/pprof.h b/linux/pprof.h index 88a97e3..cccbcbd 100644 --- a/linux/pprof.h +++ b/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.2