diff options
-rw-r--r-- | arm/aarch32/include/kvm/kvm-arch.h | 1 | ||||
-rw-r--r-- | arm/aarch64/include/kvm/kvm-arch.h | 1 | ||||
-rw-r--r-- | arm/aarch64/include/kvm/kvm-config-arch.h | 2 | ||||
-rw-r--r-- | arm/aarch64/kvm.c | 16 | ||||
-rw-r--r-- | arm/include/arm-common/kvm-config-arch.h | 1 | ||||
-rw-r--r-- | arm/kvm.c | 1 |
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; }; @@ -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 |