]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[librm] Add profiling self-tests for complete real_call and prot_call cycles
authorMichael Brown <mcb30@ipxe.org>
Sat, 3 May 2014 11:29:08 +0000 (12:29 +0100)
committerMichael Brown <mcb30@ipxe.org>
Sat, 3 May 2014 17:52:12 +0000 (18:52 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/i386/transitions/librm_test.c

index 8f5be42293d2be9b209c9f90a6ae3621d603da64..e07cfccdd9c61e2643d85be443bc4e6ce13e8e11 100644 (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 */