* [PATCH 0/3] KVM: x86: Add KVM_X86_SET_MSR_FILTE compat handler
@ 2022-10-17 18:45 Alexander Graf
2022-10-17 18:45 ` [PATCH 1/3] kvm: Add support for arch compat vm ioctls Alexander Graf
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Alexander Graf @ 2022-10-17 18:45 UTC (permalink / raw)
To: kvm
Cc: linux-kernel, x86, Paolo Bonzini, Sean Christopherson,
Andrew Randrianasulu, Thomas Huth
In commit 1a155254ff937 ("KVM: x86: Introduce MSR filtering") we
introduced a new ioctl to handle MSR filtering. However, this ioctl
passes a pointer to kernel space in an ioctl struct - which breaks in
32-on-64 bit compat situations.
This patch set introduces a compat mechanism for architecutre spacific
VM ioctls and implements an MSR_FILTER wrapper in it.
Alexander Graf (3):
kvm: Add support for arch compat vm ioctls
KVM: x86: Make filter arg for set_msr_filter()
KVM: x86: Add compat handler for KVM_X86_SET_MSR_FILTER
arch/x86/kvm/x86.c | 87 +++++++++++++++++++++++++++++++++-------
include/linux/kvm_host.h | 2 +
virt/kvm/kvm_main.c | 11 +++++
3 files changed, 86 insertions(+), 14 deletions(-)
--
2.37.1
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/3] kvm: Add support for arch compat vm ioctls
2022-10-17 18:45 [PATCH 0/3] KVM: x86: Add KVM_X86_SET_MSR_FILTE compat handler Alexander Graf
@ 2022-10-17 18:45 ` Alexander Graf
2022-10-17 18:45 ` [PATCH 2/3] KVM: x86: Make filter arg for set_msr_filter() Alexander Graf
2022-10-17 18:45 ` [PATCH 3/3] KVM: x86: Add compat handler for KVM_X86_SET_MSR_FILTER Alexander Graf
2 siblings, 0 replies; 4+ messages in thread
From: Alexander Graf @ 2022-10-17 18:45 UTC (permalink / raw)
To: kvm
Cc: linux-kernel, x86, Paolo Bonzini, Sean Christopherson,
Andrew Randrianasulu, Thomas Huth
We will introduce the first architecture specific compat vm ioctl in the
next patch. Add all necessary boilerplate to allow architectures to
override compat vm ioctls when necessary.
Signed-off-by: Alexander Graf <graf@amazon.com>
---
include/linux/kvm_host.h | 2 ++
virt/kvm/kvm_main.c | 11 +++++++++++
2 files changed, 13 insertions(+)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index f4519d3689e1..7a40f9bdc173 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1391,6 +1391,8 @@ int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
struct kvm_enable_cap *cap);
long kvm_arch_vm_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg);
+long kvm_arch_vm_compat_ioctl(struct file *filp, unsigned int ioctl,
+ unsigned long arg);
int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu);
int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu);
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 584a5bab3af3..4c5259828efd 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -4834,6 +4834,12 @@ struct compat_kvm_clear_dirty_log {
};
};
+long __weak kvm_arch_vm_compat_ioctl(struct file *filp, unsigned int ioctl,
+ unsigned long arg)
+{
+ return -ENOTTY;
+}
+
static long kvm_vm_compat_ioctl(struct file *filp,
unsigned int ioctl, unsigned long arg)
{
@@ -4842,6 +4848,11 @@ static long kvm_vm_compat_ioctl(struct file *filp,
if (kvm->mm != current->mm || kvm->vm_dead)
return -EIO;
+
+ r = kvm_arch_vm_compat_ioctl(filp, ioctl, arg);
+ if (r != -ENOTTY)
+ return r;
+
switch (ioctl) {
#ifdef CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT
case KVM_CLEAR_DIRTY_LOG: {
--
2.37.1
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/3] KVM: x86: Make filter arg for set_msr_filter()
2022-10-17 18:45 [PATCH 0/3] KVM: x86: Add KVM_X86_SET_MSR_FILTE compat handler Alexander Graf
2022-10-17 18:45 ` [PATCH 1/3] kvm: Add support for arch compat vm ioctls Alexander Graf
@ 2022-10-17 18:45 ` Alexander Graf
2022-10-17 18:45 ` [PATCH 3/3] KVM: x86: Add compat handler for KVM_X86_SET_MSR_FILTER Alexander Graf
2 siblings, 0 replies; 4+ messages in thread
From: Alexander Graf @ 2022-10-17 18:45 UTC (permalink / raw)
To: kvm
Cc: linux-kernel, x86, Paolo Bonzini, Sean Christopherson,
Andrew Randrianasulu, Thomas Huth
In the next patch we want to introduce a second caller to
set_msr_filter() which constructs its own filter list on the stack.
Refactor the original function so it takes it as argument instead of
reading it through copy_from_user().
Signed-off-by: Alexander Graf <graf@amazon.com>
---
arch/x86/kvm/x86.c | 31 +++++++++++++++++--------------
1 file changed, 17 insertions(+), 14 deletions(-)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index b0c47b41c264..19f060ce577f 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -6399,26 +6399,22 @@ static int kvm_add_msr_filter(struct kvm_x86_msr_filter *msr_filter,
return 0;
}
-static int kvm_vm_ioctl_set_msr_filter(struct kvm *kvm, void __user *argp)
+static int kvm_vm_ioctl_set_msr_filter(struct kvm *kvm,
+ struct kvm_msr_filter *filter)
{
- struct kvm_msr_filter __user *user_msr_filter = argp;
struct kvm_x86_msr_filter *new_filter, *old_filter;
- struct kvm_msr_filter filter;
bool default_allow;
bool empty = true;
int r = 0;
u32 i;
- if (copy_from_user(&filter, user_msr_filter, sizeof(filter)))
- return -EFAULT;
-
- if (filter.flags & ~KVM_MSR_FILTER_DEFAULT_DENY)
+ if (filter->flags & ~KVM_MSR_FILTER_DEFAULT_DENY)
return -EINVAL;
- for (i = 0; i < ARRAY_SIZE(filter.ranges); i++)
- empty &= !filter.ranges[i].nmsrs;
+ for (i = 0; i < ARRAY_SIZE(filter->ranges); i++)
+ empty &= !filter->ranges[i].nmsrs;
- default_allow = !(filter.flags & KVM_MSR_FILTER_DEFAULT_DENY);
+ default_allow = !(filter->flags & KVM_MSR_FILTER_DEFAULT_DENY);
if (empty && !default_allow)
return -EINVAL;
@@ -6426,8 +6422,8 @@ static int kvm_vm_ioctl_set_msr_filter(struct kvm *kvm, void __user *argp)
if (!new_filter)
return -ENOMEM;
- for (i = 0; i < ARRAY_SIZE(filter.ranges); i++) {
- r = kvm_add_msr_filter(new_filter, &filter.ranges[i]);
+ for (i = 0; i < ARRAY_SIZE(filter->ranges); i++) {
+ r = kvm_add_msr_filter(new_filter, &filter->ranges[i]);
if (r) {
kvm_free_msr_filter(new_filter);
return r;
@@ -6872,9 +6868,16 @@ long kvm_arch_vm_ioctl(struct file *filp,
case KVM_SET_PMU_EVENT_FILTER:
r = kvm_vm_ioctl_set_pmu_event_filter(kvm, argp);
break;
- case KVM_X86_SET_MSR_FILTER:
- r = kvm_vm_ioctl_set_msr_filter(kvm, argp);
+ case KVM_X86_SET_MSR_FILTER: {
+ struct kvm_msr_filter __user *user_msr_filter = argp;
+ struct kvm_msr_filter filter;
+
+ if (copy_from_user(&filter, user_msr_filter, sizeof(filter)))
+ return -EFAULT;
+
+ r = kvm_vm_ioctl_set_msr_filter(kvm, &filter);
break;
+ }
default:
r = -ENOTTY;
}
--
2.37.1
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 3/3] KVM: x86: Add compat handler for KVM_X86_SET_MSR_FILTER
2022-10-17 18:45 [PATCH 0/3] KVM: x86: Add KVM_X86_SET_MSR_FILTE compat handler Alexander Graf
2022-10-17 18:45 ` [PATCH 1/3] kvm: Add support for arch compat vm ioctls Alexander Graf
2022-10-17 18:45 ` [PATCH 2/3] KVM: x86: Make filter arg for set_msr_filter() Alexander Graf
@ 2022-10-17 18:45 ` Alexander Graf
2 siblings, 0 replies; 4+ messages in thread
From: Alexander Graf @ 2022-10-17 18:45 UTC (permalink / raw)
To: kvm
Cc: linux-kernel, x86, Paolo Bonzini, Sean Christopherson,
Andrew Randrianasulu, Thomas Huth
The KVM_X86_SET_MSR_FILTER ioctls contains a pointer in the passed in
struct which means it has a different struct size depending on whether
it gets called from 32bit or 64bit code.
This patch introduces compat code that converts from the 32bit struct to
its 64bit counterpart which then gets used going forward internally.
With this applied, 32bit QEMU can successfully set MSR bitmaps when
running on 64bit kernels.
Reported-by: Andrew Randrianasulu <randrianasulu@gmail.com>
Fixes: 1a155254ff937 ("KVM: x86: Introduce MSR filtering")
Signed-off-by: Alexander Graf <graf@amazon.com>
---
arch/x86/kvm/x86.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 19f060ce577f..20b5d25ba265 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -6446,6 +6446,62 @@ static int kvm_vm_ioctl_set_msr_filter(struct kvm *kvm,
return 0;
}
+#ifdef CONFIG_KVM_COMPAT
+/* for KVM_X86_SET_MSR_FILTER */
+struct kvm_msr_filter_range_compat {
+ __u32 flags;
+ __u32 nmsrs;
+ __u32 base;
+ __u32 bitmap;
+};
+
+struct kvm_msr_filter_compat {
+ __u32 flags;
+ struct kvm_msr_filter_range_compat ranges[KVM_MSR_FILTER_MAX_RANGES];
+};
+
+#define KVM_X86_SET_MSR_FILTER_COMPAT _IOW(KVMIO, 0xc6, struct kvm_msr_filter_compat)
+
+long kvm_arch_vm_compat_ioctl(struct file *filp, unsigned int ioctl,
+ unsigned long arg)
+{
+ void __user *argp = (void __user *)arg;
+ struct kvm *kvm = filp->private_data;
+ long r = -ENOTTY;
+
+ switch (ioctl) {
+ case KVM_X86_SET_MSR_FILTER_COMPAT: {
+ struct kvm_msr_filter __user *user_msr_filter = argp;
+ struct kvm_msr_filter_compat filter_compat;
+ struct kvm_msr_filter filter;
+ int i;
+
+ if (copy_from_user(&filter_compat, user_msr_filter,
+ sizeof(filter_compat)))
+ return -EFAULT;
+
+ filter.flags = filter_compat.flags;
+ for (i = 0; i < ARRAY_SIZE(filter.ranges); i++) {
+ struct kvm_msr_filter_range_compat *cr;
+
+ cr = &filter_compat.ranges[i];
+ filter.ranges[i] = (struct kvm_msr_filter_range) {
+ .flags = cr->flags,
+ .nmsrs = cr->nmsrs,
+ .base = cr->base,
+ .bitmap = (__u8 *)(ulong)cr->bitmap,
+ };
+ }
+
+ r = kvm_vm_ioctl_set_msr_filter(kvm, &filter);
+ break;
+ }
+ }
+
+ return r;
+}
+#endif
+
#ifdef CONFIG_HAVE_KVM_PM_NOTIFIER
static int kvm_arch_suspend_notifier(struct kvm *kvm)
{
--
2.37.1
Amazon Development Center Germany GmbH
Krausenstr. 38
10117 Berlin
Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Sitz: Berlin
Ust-ID: DE 289 237 879
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-10-17 18:46 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-17 18:45 [PATCH 0/3] KVM: x86: Add KVM_X86_SET_MSR_FILTE compat handler Alexander Graf
2022-10-17 18:45 ` [PATCH 1/3] kvm: Add support for arch compat vm ioctls Alexander Graf
2022-10-17 18:45 ` [PATCH 2/3] KVM: x86: Make filter arg for set_msr_filter() Alexander Graf
2022-10-17 18:45 ` [PATCH 3/3] KVM: x86: Add compat handler for KVM_X86_SET_MSR_FILTER Alexander Graf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox