mirror of https://github.com/ipxe/ipxe.git
[librm] Add profiling self-tests for complete real_call and prot_call cycles
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/19/head
parent
a0da06c306
commit
be7f35d9c0
|
@ -45,6 +45,19 @@ static struct profiler p2r_profiler __profiler = { .name = "p2r" };
|
||||||
/** Real-to-protected mode transition profiler */
|
/** Real-to-protected mode transition profiler */
|
||||||
static struct profiler r2p_profiler __profiler = { .name = "r2p" };
|
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
|
* Perform real mode transition self-tests
|
||||||
*
|
*
|
||||||
|
@ -52,6 +65,8 @@ static struct profiler r2p_profiler __profiler = { .name = "r2p" };
|
||||||
static void librm_test_exec ( void ) {
|
static void librm_test_exec ( void ) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned long timestamp;
|
unsigned long timestamp;
|
||||||
|
unsigned long started;
|
||||||
|
unsigned long stopped;
|
||||||
unsigned int discard_d;
|
unsigned int discard_d;
|
||||||
|
|
||||||
/* Profile mode transitions. We want to profile each
|
/* Profile mode transitions. We want to profile each
|
||||||
|
@ -68,6 +83,29 @@ static void librm_test_exec ( void ) {
|
||||||
profile_stop ( &r2p_profiler );
|
profile_stop ( &r2p_profiler );
|
||||||
profile_stop_at ( &p2r_profiler, timestamp );
|
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 */
|
/** Real mode transition self-test */
|
||||||
|
|
Loading…
Reference in New Issue