mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-07 14:19:35 +00:00
KVM: x86/xen: Add KVM_XEN_INVALID_GPA and KVM_XEN_INVALID_GFN to uapi
These are (uint64_t)-1 magic values are a userspace ABI, allowing the shared info pages and other enlightenments to be disabled. This isn't a Xen ABI because Xen doesn't let the guest turn these off except with the full SHUTDOWN_soft_reset mechanism. Under KVM, the userspace VMM is expected to handle soft reset, and tear down the kernel parts of the enlightenments accordingly. Suggested-by: Sean Christopherson <seanjc@google.com> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Message-Id: <20221226120320.1125390-5-dwmw2@infradead.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
1c14faa508
commit
b0305c1e0e
@ -41,7 +41,7 @@ static int kvm_xen_shared_info_init(struct kvm *kvm, gfn_t gfn)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
int idx = srcu_read_lock(&kvm->srcu);
|
int idx = srcu_read_lock(&kvm->srcu);
|
||||||
|
|
||||||
if (gfn == GPA_INVALID) {
|
if (gfn == KVM_XEN_INVALID_GFN) {
|
||||||
kvm_gpc_deactivate(gpc);
|
kvm_gpc_deactivate(gpc);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -659,7 +659,7 @@ int kvm_xen_hvm_get_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
|
|||||||
if (kvm->arch.xen.shinfo_cache.active)
|
if (kvm->arch.xen.shinfo_cache.active)
|
||||||
data->u.shared_info.gfn = gpa_to_gfn(kvm->arch.xen.shinfo_cache.gpa);
|
data->u.shared_info.gfn = gpa_to_gfn(kvm->arch.xen.shinfo_cache.gpa);
|
||||||
else
|
else
|
||||||
data->u.shared_info.gfn = GPA_INVALID;
|
data->u.shared_info.gfn = KVM_XEN_INVALID_GFN;
|
||||||
r = 0;
|
r = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -705,7 +705,7 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
|
|||||||
BUILD_BUG_ON(offsetof(struct vcpu_info, time) !=
|
BUILD_BUG_ON(offsetof(struct vcpu_info, time) !=
|
||||||
offsetof(struct compat_vcpu_info, time));
|
offsetof(struct compat_vcpu_info, time));
|
||||||
|
|
||||||
if (data->u.gpa == GPA_INVALID) {
|
if (data->u.gpa == KVM_XEN_INVALID_GPA) {
|
||||||
kvm_gpc_deactivate(&vcpu->arch.xen.vcpu_info_cache);
|
kvm_gpc_deactivate(&vcpu->arch.xen.vcpu_info_cache);
|
||||||
r = 0;
|
r = 0;
|
||||||
break;
|
break;
|
||||||
@ -719,7 +719,7 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO:
|
case KVM_XEN_VCPU_ATTR_TYPE_VCPU_TIME_INFO:
|
||||||
if (data->u.gpa == GPA_INVALID) {
|
if (data->u.gpa == KVM_XEN_INVALID_GPA) {
|
||||||
kvm_gpc_deactivate(&vcpu->arch.xen.vcpu_time_info_cache);
|
kvm_gpc_deactivate(&vcpu->arch.xen.vcpu_time_info_cache);
|
||||||
r = 0;
|
r = 0;
|
||||||
break;
|
break;
|
||||||
@ -739,7 +739,7 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
|
|||||||
r = -EOPNOTSUPP;
|
r = -EOPNOTSUPP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (data->u.gpa == GPA_INVALID) {
|
if (data->u.gpa == KVM_XEN_INVALID_GPA) {
|
||||||
r = 0;
|
r = 0;
|
||||||
deactivate_out:
|
deactivate_out:
|
||||||
kvm_gpc_deactivate(&vcpu->arch.xen.runstate_cache);
|
kvm_gpc_deactivate(&vcpu->arch.xen.runstate_cache);
|
||||||
@ -937,7 +937,7 @@ int kvm_xen_vcpu_get_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
|
|||||||
if (vcpu->arch.xen.vcpu_info_cache.active)
|
if (vcpu->arch.xen.vcpu_info_cache.active)
|
||||||
data->u.gpa = vcpu->arch.xen.vcpu_info_cache.gpa;
|
data->u.gpa = vcpu->arch.xen.vcpu_info_cache.gpa;
|
||||||
else
|
else
|
||||||
data->u.gpa = GPA_INVALID;
|
data->u.gpa = KVM_XEN_INVALID_GPA;
|
||||||
r = 0;
|
r = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -945,7 +945,7 @@ int kvm_xen_vcpu_get_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
|
|||||||
if (vcpu->arch.xen.vcpu_time_info_cache.active)
|
if (vcpu->arch.xen.vcpu_time_info_cache.active)
|
||||||
data->u.gpa = vcpu->arch.xen.vcpu_time_info_cache.gpa;
|
data->u.gpa = vcpu->arch.xen.vcpu_time_info_cache.gpa;
|
||||||
else
|
else
|
||||||
data->u.gpa = GPA_INVALID;
|
data->u.gpa = KVM_XEN_INVALID_GPA;
|
||||||
r = 0;
|
r = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1767,6 +1767,7 @@ struct kvm_xen_hvm_attr {
|
|||||||
__u8 runstate_update_flag;
|
__u8 runstate_update_flag;
|
||||||
struct {
|
struct {
|
||||||
__u64 gfn;
|
__u64 gfn;
|
||||||
|
#define KVM_XEN_INVALID_GFN ((__u64)-1)
|
||||||
} shared_info;
|
} shared_info;
|
||||||
struct {
|
struct {
|
||||||
__u32 send_port;
|
__u32 send_port;
|
||||||
@ -1798,6 +1799,7 @@ struct kvm_xen_hvm_attr {
|
|||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO */
|
/* Available with KVM_CAP_XEN_HVM / KVM_XEN_HVM_CONFIG_SHARED_INFO */
|
||||||
#define KVM_XEN_ATTR_TYPE_LONG_MODE 0x0
|
#define KVM_XEN_ATTR_TYPE_LONG_MODE 0x0
|
||||||
#define KVM_XEN_ATTR_TYPE_SHARED_INFO 0x1
|
#define KVM_XEN_ATTR_TYPE_SHARED_INFO 0x1
|
||||||
@ -1823,6 +1825,7 @@ struct kvm_xen_vcpu_attr {
|
|||||||
__u16 pad[3];
|
__u16 pad[3];
|
||||||
union {
|
union {
|
||||||
__u64 gpa;
|
__u64 gpa;
|
||||||
|
#define KVM_XEN_INVALID_GPA ((__u64)-1)
|
||||||
__u64 pad[8];
|
__u64 pad[8];
|
||||||
struct {
|
struct {
|
||||||
__u64 state;
|
__u64 state;
|
||||||
|
Loading…
Reference in New Issue
Block a user