| 1 | /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only) |
| 2 | * |
| 3 | * wrapper/kvm-x86.h |
| 4 | * |
| 5 | * Copyright (C) 2022 Michael Jeanson <mjeanson@efficios.com> |
| 6 | */ |
| 7 | |
| 8 | #ifndef _LTTNG_WRAPPER_KVM_X86_H |
| 9 | #define _LTTNG_WRAPPER_KVM_X86_H |
| 10 | |
| 11 | #include <linux/kvm_host.h> |
| 12 | #include <lttng/kernel-version.h> |
| 13 | |
| 14 | #if LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,18,0) |
| 15 | |
| 16 | #ifdef CONFIG_KALLSYMS_ALL |
| 17 | #include <linux/kallsyms.h> |
| 18 | #include <wrapper/kallsyms.h> |
| 19 | |
| 20 | static struct kvm_x86_ops *kvm_x86_ops_sym; |
| 21 | |
| 22 | static inline |
| 23 | void lttng_kvm_x86_get_exit_info( |
| 24 | struct kvm_vcpu *vcpu, u32 *reason, |
| 25 | u64 *info1, u64 *info2, |
| 26 | u32 *exit_int_info, u32 *exit_int_info_err_code) |
| 27 | { |
| 28 | if (!kvm_x86_ops_sym) |
| 29 | kvm_x86_ops_sym = |
| 30 | (void *) kallsyms_lookup_dataptr("kvm_x86_ops"); |
| 31 | |
| 32 | if (kvm_x86_ops_sym) { |
| 33 | kvm_x86_ops_sym->get_exit_info(vcpu, reason, info1, info2, |
| 34 | exit_int_info, exit_int_info_err_code); |
| 35 | } else { |
| 36 | printk_once(KERN_WARNING "LTTng: kvm_x86_ops symbol lookup failed.\n"); |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | static inline |
| 41 | u64 lttng_kvm_x86_get_segment_base(struct kvm_vcpu *vcpu, int seg) |
| 42 | { |
| 43 | if (!kvm_x86_ops_sym) |
| 44 | kvm_x86_ops_sym = |
| 45 | (void *) kallsyms_lookup_dataptr("kvm_x86_ops"); |
| 46 | |
| 47 | if (kvm_x86_ops_sym) { |
| 48 | return kvm_x86_ops_sym->get_segment_base(vcpu, seg); |
| 49 | } else { |
| 50 | printk_once(KERN_WARNING "LTTng: kvm_x86_ops symbol lookup failed.\n"); |
| 51 | return 0; |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | /* |
| 56 | * Canary function to check for 'kvm_x86_ops' at compile time. |
| 57 | * |
| 58 | * From 'arch/x86/include/asm/kvm_host.h': |
| 59 | * |
| 60 | * extern struct kvm_x86_ops kvm_x86_ops;; |
| 61 | */ |
| 62 | static inline |
| 63 | unsigned int __canary__kvm_x86_ops(void) |
| 64 | { |
| 65 | return kvm_x86_ops.vm_size; |
| 66 | } |
| 67 | |
| 68 | #endif /* CONFIG_KALLSYMS_ALL */ |
| 69 | |
| 70 | #endif |
| 71 | |
| 72 | #endif /* _LTTNG_WRAPPER_KVM_X86_H */ |