*/
static void librm_test_exec ( void ) {
unsigned int i;
- unsigned long p2r_elapsed;
+ unsigned long timestamp;
+ unsigned int discard_d;
/* Profile mode transitions. We want to profile each
* direction of the transition separately, so perform an RDTSC
for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
profile_start ( &p2r_profiler );
__asm__ __volatile__ ( REAL_CODE ( "rdtsc\n\t" )
- : "=A" ( r2p_profiler.started ) : );
+ : "=a" ( timestamp ), "=d" ( discard_d )
+ : );
+ profile_start_at ( &r2p_profiler, timestamp );
profile_stop ( &r2p_profiler );
- p2r_elapsed = ( r2p_profiler.started - p2r_profiler.started );
- profile_update ( &p2r_profiler, p2r_elapsed );
+ profile_stop_at ( &p2r_profiler, timestamp );
}
}
FILE_LICENCE ( GPL2_OR_LATER );
-#include <stdint.h>
#include <bits/profile.h>
#include <ipxe/tables.h>
/** Name */
const char *name;
/** Start timestamp */
- uint64_t started;
+ unsigned long started;
+ /** Stop timestamp */
+ unsigned long stopped;
/** Number of samples */
unsigned int count;
/** Mean sample value (scaled) */
extern unsigned long profile_variance ( struct profiler *profiler );
extern unsigned long profile_stddev ( struct profiler *profiler );
+/**
+ * Start profiling
+ *
+ * @v profiler Profiler
+ * @v started Start timestamp
+ */
+static inline __attribute__ (( always_inline )) void
+profile_start_at ( struct profiler *profiler, unsigned long started ) {
+
+ /* If profiling is active then record start timestamp */
+ if ( PROFILING )
+ profiler->started = started;
+}
+
/**
* Start profiling
*
/* If profiling is active then record start timestamp */
if ( PROFILING )
- profiler->started = profile_timestamp();
+ profile_start_at ( profiler, profile_timestamp() );
}
/**
* Record profiling result
*
* @v profiler Profiler
+ * @v stopped Stop timestamp
*/
static inline __attribute__ (( always_inline )) void
-profile_stop ( struct profiler *profiler ) {
- uint64_t ended;
+profile_stop_at ( struct profiler *profiler, unsigned long stopped ) {
/* If profiling is active then record end timestamp and update stats */
if ( PROFILING ) {
- ended = profile_timestamp();
- profile_update ( profiler, ( ended - profiler->started ) );
+ profiler->stopped = stopped;
+ profile_update ( profiler, ( stopped - profiler->started ) );
}
}
+/**
+ * Record profiling result
+ *
+ * @v profiler Profiler
+ */
+static inline __attribute__ (( always_inline )) void
+profile_stop ( struct profiler *profiler ) {
+
+ /* If profiling is active then record end timestamp and update stats */
+ if ( PROFILING )
+ profile_stop_at ( profiler, profile_timestamp() );
+}
+
#endif /* _IPXE_PROFILE_H */