From be7f35d9c02550512e4d9cb49ff64b97a04b902a Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 3 May 2014 12:29:08 +0100 Subject: [PATCH] [librm] Add profiling self-tests for complete real_call and prot_call cycles Signed-off-by: Michael Brown --- src/arch/i386/transitions/librm_test.c | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/arch/i386/transitions/librm_test.c b/src/arch/i386/transitions/librm_test.c index 8f5be4229..e07cfccdd 100644 --- a/src/arch/i386/transitions/librm_test.c +++ b/src/arch/i386/transitions/librm_test.c @@ -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 */