[librm] Add profiling self-tests for complete real_call and prot_call cycles

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/19/head
Michael Brown 2014-05-03 12:29:08 +01:00
parent a0da06c306
commit be7f35d9c0
1 changed files with 38 additions and 0 deletions

View File

@ -45,6 +45,19 @@ static struct profiler p2r_profiler __profiler = { .name = "p2r" };
/** Real-to-protected mode transition profiler */
static struct profiler r2p_profiler __profiler = { .name = "r2p" };
/** Real-mode call profiler */
static struct profiler real_call_profiler __profiler = { .name = "real_call" };
/** Protected-mode call profiler */
static struct profiler prot_call_profiler __profiler = { .name = "prot_call" };
/**
* Dummy protected-mode function
*/
static void librm_test_prot_call ( void ) {
/* Do nothing */
}
/**
* Perform real mode transition self-tests
*
@ -52,6 +65,8 @@ static struct profiler r2p_profiler __profiler = { .name = "r2p" };
static void librm_test_exec ( void ) {
unsigned int i;
unsigned long timestamp;
unsigned long started;
unsigned long stopped;
unsigned int discard_d;
/* Profile mode transitions. We want to profile each
@ -68,6 +83,29 @@ static void librm_test_exec ( void ) {
profile_stop ( &r2p_profiler );
profile_stop_at ( &p2r_profiler, timestamp );
}
/* Profile complete real-mode call cycle */
for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
profile_start ( &real_call_profiler );
__asm__ __volatile__ ( REAL_CODE ( "" ) : : );
profile_stop ( &real_call_profiler );
}
/* Profile complete protected-mode call cycle */
for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
__asm__ __volatile__ ( REAL_CODE ( "rdtsc\n\t"
"movl %0, %2\n\t"
"pushl %3\n\t"
"pushw %%cs\n\t"
"call prot_call\n\t"
"addw $4, %%sp\n\t"
"rdtsc\n\t" )
: "=a" ( stopped ), "=d" ( discard_d ),
"=r" ( started )
: "i" ( librm_test_prot_call ) );
profile_start_at ( &prot_call_profiler, started );
profile_stop_at ( &prot_call_profiler, stopped );
}
}
/** Real mode transition self-test */