diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/kvm/arm_arch_timer.h | 24 | ||||
| -rw-r--r-- | include/linux/kvm_host.h | 12 | ||||
| -rw-r--r-- | include/uapi/linux/kvm.h | 5 | 
3 files changed, 30 insertions, 11 deletions
| diff --git a/include/kvm/arm_arch_timer.h b/include/kvm/arm_arch_timer.h index 681cf0c8b9df..7310841f4512 100644 --- a/include/kvm/arm_arch_timer.h +++ b/include/kvm/arm_arch_timer.h @@ -51,8 +51,6 @@ struct arch_timer_vm_data {  };  struct arch_timer_context { -	struct kvm_vcpu			*vcpu; -  	/* Emulated Timer (may be unused) */  	struct hrtimer			hrtimer;  	u64				ns_frac; @@ -71,6 +69,9 @@ struct arch_timer_context {  		bool			level;  	} irq; +	/* Who am I? */ +	enum kvm_arch_timers		timer_id; +  	/* Duplicated state from arch_timer.c for convenience */  	u32				host_timer_irq;  }; @@ -106,9 +107,6 @@ void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu);  void kvm_timer_init_vm(struct kvm *kvm); -u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid); -int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value); -  int kvm_arm_timer_set_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr);  int kvm_arm_timer_get_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr);  int kvm_arm_timer_has_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr); @@ -127,9 +125,9 @@ void kvm_timer_init_vhe(void);  #define vcpu_hvtimer(v)	(&(v)->arch.timer_cpu.timers[TIMER_HVTIMER])  #define vcpu_hptimer(v)	(&(v)->arch.timer_cpu.timers[TIMER_HPTIMER]) -#define arch_timer_ctx_index(ctx)	((ctx) - vcpu_timer((ctx)->vcpu)->timers) - -#define timer_vm_data(ctx)		(&(ctx)->vcpu->kvm->arch.timer_data) +#define arch_timer_ctx_index(ctx)	((ctx)->timer_id) +#define timer_context_to_vcpu(ctx)	container_of((ctx), struct kvm_vcpu, arch.timer_cpu.timers[(ctx)->timer_id]) +#define timer_vm_data(ctx)		(&(timer_context_to_vcpu(ctx)->kvm->arch.timer_data))  #define timer_irq(ctx)			(timer_vm_data(ctx)->ppi[arch_timer_ctx_index(ctx)])  u64 kvm_arm_timer_read_sysreg(struct kvm_vcpu *vcpu, @@ -178,4 +176,14 @@ static inline u64 timer_get_offset(struct arch_timer_context *ctxt)  	return offset;  } +static inline void timer_set_offset(struct arch_timer_context *ctxt, u64 offset) +{ +	if (!ctxt->offset.vm_offset) { +		WARN(offset, "timer %d\n", arch_timer_ctx_index(ctxt)); +		return; +	} + +	WRITE_ONCE(*ctxt->offset.vm_offset, offset); +} +  #endif diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index fa36e70df088..5bd76cf394fa 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -729,7 +729,17 @@ static inline bool kvm_arch_has_private_mem(struct kvm *kvm)  #endif  #ifdef CONFIG_KVM_GUEST_MEMFD -bool kvm_arch_supports_gmem_mmap(struct kvm *kvm); +bool kvm_arch_supports_gmem_init_shared(struct kvm *kvm); + +static inline u64 kvm_gmem_get_supported_flags(struct kvm *kvm) +{ +	u64 flags = GUEST_MEMFD_FLAG_MMAP; + +	if (!kvm || kvm_arch_supports_gmem_init_shared(kvm)) +		flags |= GUEST_MEMFD_FLAG_INIT_SHARED; + +	return flags; +}  #endif  #ifndef kvm_arch_has_readonly_mem diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 6efa98a57ec1..52f6000ab020 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -962,7 +962,7 @@ struct kvm_enable_cap {  #define KVM_CAP_ARM_EL2_E2H0 241  #define KVM_CAP_RISCV_MP_STATE_RESET 242  #define KVM_CAP_ARM_CACHEABLE_PFNMAP_SUPPORTED 243 -#define KVM_CAP_GUEST_MEMFD_MMAP 244 +#define KVM_CAP_GUEST_MEMFD_FLAGS 244  struct kvm_irq_routing_irqchip {  	__u32 irqchip; @@ -1599,7 +1599,8 @@ struct kvm_memory_attributes {  #define KVM_MEMORY_ATTRIBUTE_PRIVATE           (1ULL << 3)  #define KVM_CREATE_GUEST_MEMFD	_IOWR(KVMIO,  0xd4, struct kvm_create_guest_memfd) -#define GUEST_MEMFD_FLAG_MMAP	(1ULL << 0) +#define GUEST_MEMFD_FLAG_MMAP		(1ULL << 0) +#define GUEST_MEMFD_FLAG_INIT_SHARED	(1ULL << 1)  struct kvm_create_guest_memfd {  	__u64 size; | 
