summaryrefslogtreecommitdiffstats
path: root/patch.diff
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2022-07-06 13:59:50 +0200
committerLouis Burda <quent.burda@gmail.com>2022-07-06 13:59:50 +0200
commitb98fabdf4b91a6093b3d91f15cb55b21ab89c0f3 (patch)
tree2f8da414f153c9c586c7ec2919eac0fbff83712c /patch.diff
parentcee2126b8f316677ebee57e19fe7d50d09c066d1 (diff)
downloadcachepc-b98fabdf4b91a6093b3d91f15cb55b21ab89c0f3.tar.gz
cachepc-b98fabdf4b91a6093b3d91f15cb55b21ab89c0f3.zip
Add proc device for communicating counts with userspace
Diffstat (limited to 'patch.diff')
-rw-r--r--patch.diff101
1 files changed, 96 insertions, 5 deletions
diff --git a/patch.diff b/patch.diff
index 6dca972..7358e7d 100644
--- a/patch.diff
+++ b/patch.diff
@@ -13,7 +13,7 @@ index b804444e16d4..1f7d3b15cf4a 100644
obj-$(CONFIG_KVM) += kvm.o
obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
-index 7b3cfbe8f7e3..cd5cb4320a17 100644
+index 7b3cfbe8f7e3..12c5ff2447a0 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -2,6 +2,8 @@
@@ -46,14 +46,105 @@ index 7b3cfbe8f7e3..cd5cb4320a17 100644
if (sev_es_guest(svm->vcpu.kvm)) {
__svm_sev_es_vcpu_run(svm->vmcb_pa);
} else {
-- __svm_vcpu_run(svm->vmcb_pa, (unsigned long *)&svm->vcpu.arch.regs);
+ curr_head = cachepc_prime(curr_head);
-+ __svm_vcpu_run(svm->vmcb_pa, (unsigned long *)&svm->vcpu.arch.regs);
+ __svm_vcpu_run(svm->vmcb_pa, (unsigned long *)&svm->vcpu.arch.regs);
+ next_head = cachepc_probe(curr_head);
-+ //cachepc_save_msrmt(curr_head, "/tmp/msrmt", run_index);
-+ cachepc_print_msrmt(curr_head);
++ //cachepc_save_msrmts(curr_head, "/tmp/msrmt", run_index);
++ cachepc_print_msrmts(curr_head);
+ curr_head = next_head;
+ run_index += 1;
#ifdef CONFIG_X86_64
native_wrmsrl(MSR_GS_BASE, svm->host.gs_base);
+diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
+index 7f2e2a09ebbd..762eb35f19e5 100644
+--- a/include/linux/kvm_host.h
++++ b/include/linux/kvm_host.h
+@@ -35,6 +35,10 @@
+
+ #include <asm/kvm_host.h>
+
++extern struct proc_dir_entry *cachepc_msrmts_file;
++extern uint8_t cachepc_msrmts[1 << 20];
++extern uint64_t cachepc_msrmts_count;
++
+ #ifndef KVM_MAX_VCPU_ID
+ #define KVM_MAX_VCPU_ID KVM_MAX_VCPUS
+ #endif
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 2541a17ff1c4..5f001419362b 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -51,6 +51,7 @@
+ #include <linux/io.h>
+ #include <linux/lockdep.h>
+ #include <linux/kthread.h>
++#include <linux/proc_fs.h>
+
+ #include <asm/processor.h>
+ #include <asm/ioctl.h>
+@@ -143,6 +144,10 @@ static void hardware_disable_all(void);
+
+ static void kvm_io_bus_destroy(struct kvm_io_bus *bus);
+
++struct proc_dir_entry *cachepc_msrmts_file;
++uint8_t cachepc_msrmts[1 << 20];
++uint64_t cachepc_msrmts_count;
++
+ __visible bool kvm_rebooting;
+ EXPORT_SYMBOL_GPL(kvm_rebooting);
+
+@@ -4765,10 +4770,29 @@ static void check_processor_compat(void *data)
+ *c->ret = kvm_arch_check_processor_compat(c->opaque);
+ }
+
++ssize_t
++kvm_cachepc_read(struct file *file, char *buf, size_t buflen, loff_t *off)
++{
++ size_t len;
++
++ printk(KERN_INFO "Reading cachepc proc file\n");
++
++ if (*off >= cachepc_msrmts_count)
++ return 0;
++
++ len = cachepc_msrmts_count - *off;
++ if (len > buflen) len = buflen;
++
++ memcpy(buf, cachepc_msrmts + *off, len);
++
++ return len;
++}
++
+ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
+ struct module *module)
+ {
+ struct kvm_cpu_compat_check c;
++ struct proc_ops proc_ops;
+ int r;
+ int cpu;
+
+@@ -4848,6 +4872,15 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
+ r = kvm_vfio_ops_init();
+ WARN_ON(r);
+
++ cachepc_msrmts_count = 0;
++
++ memset(&proc_ops, 0, sizeof(proc_ops));
++ proc_ops.proc_read = kvm_cachepc_read;
++
++ cachepc_msrmts_file = proc_create("cachepc", 0644, NULL, &proc_ops);
++ BUG_ON(cachepc_msrmts_file == NULL);
++
++
+ return 0;
+
+ out_unreg:
+@@ -4872,6 +4905,7 @@ EXPORT_SYMBOL_GPL(kvm_init);
+
+ void kvm_exit(void)
+ {
++ remove_proc_entry("cachepc", cachepc_msrmts_file);
+ debugfs_remove_recursive(kvm_debugfs_dir);
+ misc_deregister(&kvm_dev);
+ kmem_cache_destroy(kvm_vcpu_cache);