Luiz Capitulino | 235539b | 2016-09-07 14:47:23 -0400 | [diff] [blame] | 1 | /* |
| 2 | * Kernel-based Virtual Machine driver for Linux |
| 3 | * |
| 4 | * Copyright 2016 Red Hat, Inc. and/or its affiliates. |
| 5 | * |
| 6 | * This work is licensed under the terms of the GNU GPL, version 2. See |
| 7 | * the COPYING file in the top-level directory. |
| 8 | * |
| 9 | */ |
| 10 | #include <linux/kvm_host.h> |
Luiz Capitulino | 4f5758f | 2016-09-16 10:27:36 -0400 | [diff] [blame] | 11 | #include <linux/debugfs.h> |
Luiz Capitulino | 235539b | 2016-09-07 14:47:23 -0400 | [diff] [blame] | 12 | |
| 13 | bool kvm_arch_has_vcpu_debugfs(void) |
| 14 | { |
Luiz Capitulino | 4f5758f | 2016-09-16 10:27:36 -0400 | [diff] [blame] | 15 | return true; |
Luiz Capitulino | 235539b | 2016-09-07 14:47:23 -0400 | [diff] [blame] | 16 | } |
| 17 | |
Luiz Capitulino | 4f5758f | 2016-09-16 10:27:36 -0400 | [diff] [blame] | 18 | static int vcpu_get_tsc_offset(void *data, u64 *val) |
| 19 | { |
| 20 | struct kvm_vcpu *vcpu = (struct kvm_vcpu *) data; |
| 21 | *val = vcpu->arch.tsc_offset; |
| 22 | return 0; |
| 23 | } |
| 24 | |
| 25 | DEFINE_SIMPLE_ATTRIBUTE(vcpu_tsc_offset_fops, vcpu_get_tsc_offset, NULL, "%lld\n"); |
| 26 | |
| 27 | static int vcpu_get_tsc_scaling_ratio(void *data, u64 *val) |
| 28 | { |
| 29 | struct kvm_vcpu *vcpu = (struct kvm_vcpu *) data; |
| 30 | *val = vcpu->arch.tsc_scaling_ratio; |
| 31 | return 0; |
| 32 | } |
| 33 | |
| 34 | DEFINE_SIMPLE_ATTRIBUTE(vcpu_tsc_scaling_fops, vcpu_get_tsc_scaling_ratio, NULL, "%llu\n"); |
| 35 | |
| 36 | static int vcpu_get_tsc_scaling_frac_bits(void *data, u64 *val) |
| 37 | { |
| 38 | *val = kvm_tsc_scaling_ratio_frac_bits; |
| 39 | return 0; |
| 40 | } |
| 41 | |
| 42 | DEFINE_SIMPLE_ATTRIBUTE(vcpu_tsc_scaling_frac_fops, vcpu_get_tsc_scaling_frac_bits, NULL, "%llu\n"); |
| 43 | |
Luiz Capitulino | 235539b | 2016-09-07 14:47:23 -0400 | [diff] [blame] | 44 | int kvm_arch_create_vcpu_debugfs(struct kvm_vcpu *vcpu) |
| 45 | { |
Luiz Capitulino | 4f5758f | 2016-09-16 10:27:36 -0400 | [diff] [blame] | 46 | struct dentry *ret; |
| 47 | |
| 48 | ret = debugfs_create_file("tsc-offset", 0444, |
| 49 | vcpu->debugfs_dentry, |
| 50 | vcpu, &vcpu_tsc_offset_fops); |
| 51 | if (!ret) |
| 52 | return -ENOMEM; |
| 53 | |
| 54 | if (kvm_has_tsc_control) { |
| 55 | ret = debugfs_create_file("tsc-scaling-ratio", 0444, |
| 56 | vcpu->debugfs_dentry, |
| 57 | vcpu, &vcpu_tsc_scaling_fops); |
| 58 | if (!ret) |
| 59 | return -ENOMEM; |
| 60 | ret = debugfs_create_file("tsc-scaling-ratio-frac-bits", 0444, |
| 61 | vcpu->debugfs_dentry, |
| 62 | vcpu, &vcpu_tsc_scaling_frac_fops); |
| 63 | if (!ret) |
| 64 | return -ENOMEM; |
| 65 | |
| 66 | } |
| 67 | |
Luiz Capitulino | 235539b | 2016-09-07 14:47:23 -0400 | [diff] [blame] | 68 | return 0; |
| 69 | } |