X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=linux%2Fpprof.h;h=cccbcbd5bcb88d16495d1d5d420ffc4d72d5d7b7;hb=8a4843859f03421855b7393a4f7dd5d1197561cb;hp=88a97e3e6474703d6ac45a4dcdaa275b809d34c8;hpb=997b2e4ff9773b32d81bb8e1faa17bb9c379f68b;p=libpicofe.git 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);