|
@@ -45,6 +45,19 @@ static struct profiler p2r_profiler __profiler = { .name = "p2r" };
|
45
|
45
|
/** Real-to-protected mode transition profiler */
|
46
|
46
|
static struct profiler r2p_profiler __profiler = { .name = "r2p" };
|
47
|
47
|
|
|
48
|
+/** Real-mode call profiler */
|
|
49
|
+static struct profiler real_call_profiler __profiler = { .name = "real_call" };
|
|
50
|
+
|
|
51
|
+/** Protected-mode call profiler */
|
|
52
|
+static struct profiler prot_call_profiler __profiler = { .name = "prot_call" };
|
|
53
|
+
|
|
54
|
+/**
|
|
55
|
+ * Dummy protected-mode function
|
|
56
|
+ */
|
|
57
|
+static void librm_test_prot_call ( void ) {
|
|
58
|
+ /* Do nothing */
|
|
59
|
+}
|
|
60
|
+
|
48
|
61
|
/**
|
49
|
62
|
* Perform real mode transition self-tests
|
50
|
63
|
*
|
|
@@ -52,6 +65,8 @@ static struct profiler r2p_profiler __profiler = { .name = "r2p" };
|
52
|
65
|
static void librm_test_exec ( void ) {
|
53
|
66
|
unsigned int i;
|
54
|
67
|
unsigned long timestamp;
|
|
68
|
+ unsigned long started;
|
|
69
|
+ unsigned long stopped;
|
55
|
70
|
unsigned int discard_d;
|
56
|
71
|
|
57
|
72
|
/* Profile mode transitions. We want to profile each
|
|
@@ -68,6 +83,29 @@ static void librm_test_exec ( void ) {
|
68
|
83
|
profile_stop ( &r2p_profiler );
|
69
|
84
|
profile_stop_at ( &p2r_profiler, timestamp );
|
70
|
85
|
}
|
|
86
|
+
|
|
87
|
+ /* Profile complete real-mode call cycle */
|
|
88
|
+ for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
|
|
89
|
+ profile_start ( &real_call_profiler );
|
|
90
|
+ __asm__ __volatile__ ( REAL_CODE ( "" ) : : );
|
|
91
|
+ profile_stop ( &real_call_profiler );
|
|
92
|
+ }
|
|
93
|
+
|
|
94
|
+ /* Profile complete protected-mode call cycle */
|
|
95
|
+ for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
|
|
96
|
+ __asm__ __volatile__ ( REAL_CODE ( "rdtsc\n\t"
|
|
97
|
+ "movl %0, %2\n\t"
|
|
98
|
+ "pushl %3\n\t"
|
|
99
|
+ "pushw %%cs\n\t"
|
|
100
|
+ "call prot_call\n\t"
|
|
101
|
+ "addw $4, %%sp\n\t"
|
|
102
|
+ "rdtsc\n\t" )
|
|
103
|
+ : "=a" ( stopped ), "=d" ( discard_d ),
|
|
104
|
+ "=r" ( started )
|
|
105
|
+ : "i" ( librm_test_prot_call ) );
|
|
106
|
+ profile_start_at ( &prot_call_profiler, started );
|
|
107
|
+ profile_stop_at ( &prot_call_profiler, stopped );
|
|
108
|
+ }
|
71
|
109
|
}
|
72
|
110
|
|
73
|
111
|
/** Real mode transition self-test */
|