mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
KVM: LoongArch: selftests: Add time counter test case
With time counter test, it is to verify that time count starts from 0 and always grows up then. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#include <assert.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#include <asm/kvm.h>
|
||||
#include "kvm_util.h"
|
||||
#include "processor.h"
|
||||
#include "ucall_common.h"
|
||||
@@ -245,6 +246,11 @@ void vcpu_args_set(struct kvm_vcpu *vcpu, unsigned int num, ...)
|
||||
vcpu_regs_set(vcpu, ®s);
|
||||
}
|
||||
|
||||
static void loongarch_set_reg(struct kvm_vcpu *vcpu, uint64_t id, uint64_t val)
|
||||
{
|
||||
__vcpu_set_reg(vcpu, id, val);
|
||||
}
|
||||
|
||||
static void loongarch_get_csr(struct kvm_vcpu *vcpu, uint64_t id, void *addr)
|
||||
{
|
||||
uint64_t csrid;
|
||||
@@ -285,7 +291,10 @@ static void loongarch_vcpu_setup(struct kvm_vcpu *vcpu)
|
||||
loongarch_set_csr(vcpu, LOONGARCH_CSR_TCFG, 0);
|
||||
loongarch_set_csr(vcpu, LOONGARCH_CSR_ASID, 1);
|
||||
|
||||
/* time count start from 0 */
|
||||
val = 0;
|
||||
loongarch_set_reg(vcpu, KVM_REG_LOONGARCH_COUNTER, val);
|
||||
|
||||
width = vm->page_shift - 3;
|
||||
|
||||
switch (vm->pgtable_levels) {
|
||||
|
||||
@@ -136,10 +136,40 @@ static void guest_test_emulate_timer(uint32_t cpu)
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
static void guest_time_count_test(uint32_t cpu)
|
||||
{
|
||||
uint32_t config_iter;
|
||||
unsigned long start, end, prev, us;
|
||||
|
||||
/* Assuming that test case starts to run in 1 second */
|
||||
start = timer_get_cycles();
|
||||
us = msec_to_cycles(1000);
|
||||
__GUEST_ASSERT(start <= us,
|
||||
"start = 0x%lx, us = 0x%lx.\n",
|
||||
start, us);
|
||||
|
||||
us = msec_to_cycles(test_args.timer_period_ms);
|
||||
for (config_iter = 0; config_iter < test_args.nr_iter; config_iter++) {
|
||||
start = timer_get_cycles();
|
||||
end = start + us;
|
||||
/* test time count growing up always */
|
||||
while (start < end) {
|
||||
prev = start;
|
||||
start = timer_get_cycles();
|
||||
__GUEST_ASSERT(prev <= start,
|
||||
"prev = 0x%lx, start = 0x%lx.\n",
|
||||
prev, start);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void guest_code(void)
|
||||
{
|
||||
uint32_t cpu = guest_get_vcpuid();
|
||||
|
||||
/* must run at first */
|
||||
guest_time_count_test(cpu);
|
||||
|
||||
timer_irq_enable();
|
||||
local_irq_enable();
|
||||
guest_test_period_timer(cpu);
|
||||
|
||||
Reference in New Issue
Block a user