--- libelwix/src/time.c 2013/03/07 16:24:32 1.2 +++ libelwix/src/time.c 2013/06/19 00:11:16 1.3 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: time.c,v 1.2 2013/03/07 16:24:32 misho Exp $ +* $Id: time.c,v 1.3 2013/06/19 00:11:16 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -260,4 +260,35 @@ time_Parse(const char *csTime) if ((tim = timegm(&tm)) == (time_t) -1) elwix_SetErr(EINVAL, "Invalid date/time format"); return tim; +} + +/* + * time_rdtsc() - Get TSC timer value from CPU + * + * return: TSC in nanoseconds + */ +uint64_t +time_rdtsc(void) +{ +#if defined(i386) || defined(__i386__) + /* i386 */ + uint32_t hi, lo; + + asm volatile("rdtsc" : "=d" (hi), "=a" (lo)); + return (((uint64_t) hi << 32) | (uint64_t) lo); +#elif defined(amd64) || defined(__amd64__) || \ + defined(x86_64) || defined(__x86_64__) + /* amd64 */ + uint64_t res; + + asm volatile("rdtsc" : "=a" (res)); + return res; +#elif + /* unsupported for this architecture, get time by ordinary way */ + struct timespec ts = { 0, 0LL }; + uint64_t res; + + clock_gettime(CLOCK_UPTIME_PRECISE, &ts); + return ((uint64_t) ts.tv_sec * 1000000000 + ts.tv_nsec); +#endif }