@@ -1144,9 +1144,10 @@ static void interrupt_test(struct svm_test *test)
{
long long start, loops;
- apic_write(APIC_LVTT, TIMER_VECTOR);
+ apic_setup_timer(TIMER_VECTOR, APIC_LVT_TIMER_PERIODIC);
sti();
- apic_write(APIC_TMICT, 1); //Timer Initial Count Register 0x380 one-shot
+ apic_start_timer(1);
+
for (loops = 0; loops < 10000000 && !timer_fired; loops++)
asm volatile ("nop");
@@ -1157,12 +1158,12 @@ static void interrupt_test(struct svm_test *test)
vmmcall();
}
- apic_write(APIC_TMICT, 0);
+ apic_stop_timer();
cli();
vmmcall();
timer_fired = false;
- apic_write(APIC_TMICT, 1);
+ apic_start_timer(1);
for (loops = 0; loops < 10000000 && !timer_fired; loops++)
asm volatile ("nop");
@@ -1174,12 +1175,12 @@ static void interrupt_test(struct svm_test *test)
}
sti();
- apic_write(APIC_TMICT, 0);
+ apic_stop_timer();
cli();
timer_fired = false;
start = rdtsc();
- apic_write(APIC_TMICT, 1000000);
+ apic_start_timer(1000000);
safe_halt();
report(rdtsc() - start > 10000 && timer_fired,
@@ -1190,13 +1191,13 @@ static void interrupt_test(struct svm_test *test)
vmmcall();
}
- apic_write(APIC_TMICT, 0);
+ apic_stop_timer();
cli();
vmmcall();
timer_fired = false;
start = rdtsc();
- apic_write(APIC_TMICT, 1000000);
+ apic_start_timer(1000000);
asm volatile ("hlt");
report(rdtsc() - start > 10000 && timer_fired,
@@ -1207,8 +1208,7 @@ static void interrupt_test(struct svm_test *test)
vmmcall();
}
- apic_write(APIC_TMICT, 0);
- cli();
+ apic_cleanup_timer();
}
static bool interrupt_finished(struct svm_test *test)
@@ -1686,10 +1686,8 @@ static void reg_corruption_prepare(struct svm_test *test)
handle_irq(TIMER_VECTOR, reg_corruption_isr);
/* set local APIC to inject external interrupts */
- apic_write(APIC_TMICT, 0);
- apic_write(APIC_TDCR, 0);
- apic_write(APIC_LVTT, TIMER_VECTOR | APIC_LVT_TIMER_PERIODIC);
- apic_write(APIC_TMICT, 1000);
+ apic_setup_timer(TIMER_VECTOR, APIC_LVT_TIMER_PERIODIC);
+ apic_start_timer(1000);
}
static void reg_corruption_test(struct svm_test *test)
@@ -1734,8 +1732,7 @@ static bool reg_corruption_finished(struct svm_test *test)
}
return false;
cleanup:
- apic_write(APIC_LVTT, APIC_LVT_TIMER_MASK);
- apic_write(APIC_TMICT, 0);
+ apic_cleanup_timer();
return true;
}
This simplified code and ensures that after a subtest used apic timer, it won't affect next subtests which are run after it. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> --- x86/svm_tests.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-)