--- libelwix/src/time.c 2013/03/07 16:24:32 1.2 +++ libelwix/src/time.c 2015/06/25 00:36:48 1.4.20.1 @@ -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.4.20.1 2015/06/25 00:36:48 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 +Copyright 2004 - 2015 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -260,4 +260,34 @@ 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; +#else + /* unsupported for this architecture, get time by ordinary way */ + struct timespec ts = { 0, 0LL }; + + clock_gettime(CLOCK_UPTIME_PRECISE, &ts); + return ((uint64_t) ts.tv_sec * 1000000000 + ts.tv_nsec); +#endif }