aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arm/aarch32/include/kvm/kvm-arch.h1
-rw-r--r--arm/aarch64/include/kvm/kvm-arch.h1
-rw-r--r--arm/aarch64/include/kvm/kvm-config-arch.h2
-rw-r--r--arm/aarch64/kvm.c16
-rw-r--r--arm/include/arm-common/kvm-config-arch.h1
-rw-r--r--arm/kvm.c1
6 files changed, 22 insertions, 0 deletions
diff --git a/arm/aarch32/include/kvm/kvm-arch.h b/arm/aarch32/include/kvm/kvm-arch.h
index 467fb091..d4ed0566 100644
--- a/arm/aarch32/include/kvm/kvm-arch.h
+++ b/arm/aarch32/include/kvm/kvm-arch.h
@@ -7,6 +7,7 @@
struct kvm;
static inline void kvm__arch_enable_mte(struct kvm *kvm) {}
+static inline void kvm__arch_set_counter_offset(struct kvm *kvm) {}
#define MAX_PAGE_SIZE SZ_4K
diff --git a/arm/aarch64/include/kvm/kvm-arch.h b/arm/aarch64/include/kvm/kvm-arch.h
index 02d09a41..d3db3103 100644
--- a/arm/aarch64/include/kvm/kvm-arch.h
+++ b/arm/aarch64/include/kvm/kvm-arch.h
@@ -7,6 +7,7 @@ struct kvm;
unsigned long long kvm__arch_get_kern_offset(struct kvm *kvm, int fd);
int kvm__arch_get_ipa_limit(struct kvm *kvm);
void kvm__arch_enable_mte(struct kvm *kvm);
+void kvm__arch_set_counter_offset(struct kvm *kvm);
#define MAX_PAGE_SIZE SZ_64K
diff --git a/arm/aarch64/include/kvm/kvm-config-arch.h b/arm/aarch64/include/kvm/kvm-config-arch.h
index 306d7927..0ee3a59d 100644
--- a/arm/aarch64/include/kvm/kvm-config-arch.h
+++ b/arm/aarch64/include/kvm/kvm-config-arch.h
@@ -20,6 +20,8 @@ int vcpu_affinity_parser(const struct option *opt, const char *arg, int unset);
"Layout Randomization (KASLR)"), \
OPT_BOOLEAN('\0', "no-pvtime", &(cfg)->no_pvtime, "Disable" \
" stolen time"), \
+ OPT_U64('\0', "counter-offset", &(cfg)->counter_offset, \
+ "Specify the counter offset, defaulting to 0"), \
OPT_BOOLEAN('\0', "nested", &(cfg)->nested_virt, \
"Create guest with (nested) virt"), \
diff --git a/arm/aarch64/kvm.c b/arm/aarch64/kvm.c
index 54200c9e..245a51c1 100644
--- a/arm/aarch64/kvm.c
+++ b/arm/aarch64/kvm.c
@@ -160,3 +160,19 @@ void kvm__arch_enable_mte(struct kvm *kvm)
pr_debug("MTE capability enabled");
}
+
+void kvm__arch_set_counter_offset(struct kvm *kvm)
+{
+ struct kvm_arm_counter_offset offset = {
+ .counter_offset = kvm->cfg.arch.counter_offset,
+ };
+
+ if (!kvm->cfg.arch.counter_offset)
+ return;
+
+ if (!kvm__supports_extension(kvm, KVM_CAP_COUNTER_OFFSET))
+ die("No support for global counter offset");
+
+ if (ioctl(kvm->vm_fd, KVM_ARM_SET_COUNTER_OFFSET, &offset))
+ die_perror("KVM_ARM_SET_COUNTER_OFFSET");
+}
diff --git a/arm/include/arm-common/kvm-config-arch.h b/arm/include/arm-common/kvm-config-arch.h
index bcbf5379..d797a88e 100644
--- a/arm/include/arm-common/kvm-config-arch.h
+++ b/arm/include/arm-common/kvm-config-arch.h
@@ -14,6 +14,7 @@ struct kvm_config_arch {
u64 kaslr_seed;
enum irqchip_type irqchip;
u64 fw_addr;
+ u64 counter_offset;
bool no_pvtime;
};
diff --git a/arm/kvm.c b/arm/kvm.c
index 9f958232..87733399 100644
--- a/arm/kvm.c
+++ b/arm/kvm.c
@@ -94,6 +94,7 @@ void kvm__arch_init(struct kvm *kvm)
die("Failed to create virtual GIC");
kvm__arch_enable_mte(kvm);
+ kvm__arch_set_counter_offset(kvm);
}
#define FDT_ALIGN SZ_2M