00001 /* 00002 Copyright (C) 2001 Paul Davis 00003 Code derived from various headers from the Linux kernel 00004 00005 This program is free software; you can redistribute it and/or modify 00006 it under the terms of the GNU General Public License as published by 00007 the Free Software Foundation; either version 2 of the License, or 00008 (at your option) any later version. 00009 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 00019 $Id: cycles.h,v 1.4.2.1 2006/06/20 14:44:00 letz Exp $ 00020 */ 00021 00022 #ifndef __jack_cycles_h__ 00023 #define __jack_cycles_h__ 00024 00025 /* 00026 * Standard way to access the cycle counter on i586+ CPUs. 00027 * Currently only used on SMP. 00028 * 00029 * If you really have a SMP machine with i486 chips or older, 00030 * compile for that, and this will just always return zero. 00031 * That's ok, it just means that the nicer scheduling heuristics 00032 * won't work for you. 00033 * 00034 * We only use the low 32 bits, and we'd simply better make sure 00035 * that we reschedule before that wraps. Scheduling at least every 00036 * four billion cycles just basically sounds like a good idea, 00037 * regardless of how fast the machine is. 00038 */ 00039 00040 #ifdef __linux__ 00041 00042 #ifdef __PPC__ 00043 00044 /* PowerPC */ 00045 00046 #define CPU_FTR_601 0x00000100 00047 00048 typedef unsigned long cycles_t; 00049 00050 /* For the "cycle" counter we use the timebase lower half. */ 00051 00052 extern cycles_t cacheflush_time; 00053 00054 static inline cycles_t get_cycles(void) 00055 { 00056 cycles_t ret = 0; 00057 00058 __asm__ __volatile__( 00059 "98: mftb %0\n" 00060 "99:\n" 00061 ".section __ftr_fixup,\"a\"\n" 00062 " .long %1\n" 00063 " .long 0\n" 00064 " .long 98b\n" 00065 " .long 99b\n" 00066 ".previous" 00067 : "=r" (ret) : "i" (CPU_FTR_601)); 00068 return ret; 00069 } 00070 00071 #endif 00072 00073 #ifdef __i386__ 00074 00075 typedef unsigned long long cycles_t; 00076 00077 extern cycles_t cacheflush_time; 00078 00079 #define rdtscll(val) \ 00080 __asm__ __volatile__("rdtsc" : "=A" (val)) 00081 00082 static inline cycles_t get_cycles (void) 00083 { 00084 unsigned long long ret; 00085 00086 rdtscll(ret); 00087 return ret; 00088 } 00089 00090 #endif 00091 00092 #endif 00093 00094 #endif /* __jack_cycles_h__ */