]>
Commit | Line | Data |
---|---|---|
9be61fa4 OB |
1 | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
2 | From: Robert Hoo <robert.hu@linux.intel.com> | |
3 | Date: Mon, 15 Oct 2018 12:47:23 +0800 | |
4 | Subject: [PATCH 3/9] kvm: Add support to KVM_GET_MSR_FEATURE_INDEX_LIST and | |
5 | KVM_GET_MSRS system ioctl | |
6 | ||
7 | Add kvm_get_supported_feature_msrs() to get supported MSR feature index list. | |
8 | Add kvm_arch_get_supported_msr_feature() to get each MSR features value. | |
9 | ||
10 | Signed-off-by: Robert Hoo <robert.hu@linux.intel.com> | |
11 | Message-Id: <1539578845-37944-2-git-send-email-robert.hu@linux.intel.com> | |
12 | Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> | |
13 | Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> | |
14 | --- | |
15 | include/sysemu/kvm.h | 2 ++ | |
16 | target/i386/kvm.c | 80 ++++++++++++++++++++++++++++++++++++++++++++ | |
17 | 2 files changed, 82 insertions(+) | |
18 | ||
19 | diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h | |
20 | index 0b64b8e067..97d8d9d0d5 100644 | |
21 | --- a/include/sysemu/kvm.h | |
22 | +++ b/include/sysemu/kvm.h | |
23 | @@ -463,6 +463,8 @@ int kvm_vm_check_extension(KVMState *s, unsigned int extension); | |
24 | ||
25 | uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function, | |
26 | uint32_t index, int reg); | |
27 | +uint32_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index); | |
28 | + | |
29 | ||
30 | void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len); | |
31 | ||
32 | diff --git a/target/i386/kvm.c b/target/i386/kvm.c | |
33 | index 9313602d3d..cd45c79169 100644 | |
34 | --- a/target/i386/kvm.c | |
35 | +++ b/target/i386/kvm.c | |
36 | @@ -107,6 +107,7 @@ static int has_pit_state2; | |
37 | static bool has_msr_mcg_ext_ctl; | |
38 | ||
39 | static struct kvm_cpuid2 *cpuid_cache; | |
40 | +static struct kvm_msr_list *kvm_feature_msrs; | |
41 | ||
42 | int kvm_has_pit_state2(void) | |
43 | { | |
44 | @@ -420,6 +421,42 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function, | |
45 | return ret; | |
46 | } | |
47 | ||
48 | +uint32_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index) | |
49 | +{ | |
50 | + struct { | |
51 | + struct kvm_msrs info; | |
52 | + struct kvm_msr_entry entries[1]; | |
53 | + } msr_data; | |
54 | + uint32_t ret; | |
55 | + | |
56 | + if (kvm_feature_msrs == NULL) { /* Host doesn't support feature MSRs */ | |
57 | + return 0; | |
58 | + } | |
59 | + | |
60 | + /* Check if requested MSR is supported feature MSR */ | |
61 | + int i; | |
62 | + for (i = 0; i < kvm_feature_msrs->nmsrs; i++) | |
63 | + if (kvm_feature_msrs->indices[i] == index) { | |
64 | + break; | |
65 | + } | |
66 | + if (i == kvm_feature_msrs->nmsrs) { | |
67 | + return 0; /* if the feature MSR is not supported, simply return 0 */ | |
68 | + } | |
69 | + | |
70 | + msr_data.info.nmsrs = 1; | |
71 | + msr_data.entries[0].index = index; | |
72 | + | |
73 | + ret = kvm_ioctl(s, KVM_GET_MSRS, &msr_data); | |
74 | + if (ret != 1) { | |
75 | + error_report("KVM get MSR (index=0x%x) feature failed, %s", | |
76 | + index, strerror(-ret)); | |
77 | + exit(1); | |
78 | + } | |
79 | + | |
80 | + return msr_data.entries[0].data; | |
81 | +} | |
82 | + | |
83 | + | |
84 | typedef struct HWPoisonPage { | |
85 | ram_addr_t ram_addr; | |
86 | QLIST_ENTRY(HWPoisonPage) list; | |
87 | @@ -1239,6 +1276,47 @@ void kvm_arch_do_init_vcpu(X86CPU *cpu) | |
88 | } | |
89 | } | |
90 | ||
91 | +static int kvm_get_supported_feature_msrs(KVMState *s) | |
92 | +{ | |
93 | + int ret = 0; | |
94 | + | |
95 | + if (kvm_feature_msrs != NULL) { | |
96 | + return 0; | |
97 | + } | |
98 | + | |
99 | + if (!kvm_check_extension(s, KVM_CAP_GET_MSR_FEATURES)) { | |
100 | + return 0; | |
101 | + } | |
102 | + | |
103 | + struct kvm_msr_list msr_list; | |
104 | + | |
105 | + msr_list.nmsrs = 0; | |
106 | + ret = kvm_ioctl(s, KVM_GET_MSR_FEATURE_INDEX_LIST, &msr_list); | |
107 | + if (ret < 0 && ret != -E2BIG) { | |
108 | + error_report("Fetch KVM feature MSR list failed: %s", | |
109 | + strerror(-ret)); | |
110 | + return ret; | |
111 | + } | |
112 | + | |
113 | + assert(msr_list.nmsrs > 0); | |
114 | + kvm_feature_msrs = (struct kvm_msr_list *) \ | |
115 | + g_malloc0(sizeof(msr_list) + | |
116 | + msr_list.nmsrs * sizeof(msr_list.indices[0])); | |
117 | + | |
118 | + kvm_feature_msrs->nmsrs = msr_list.nmsrs; | |
119 | + ret = kvm_ioctl(s, KVM_GET_MSR_FEATURE_INDEX_LIST, kvm_feature_msrs); | |
120 | + | |
121 | + if (ret < 0) { | |
122 | + error_report("Fetch KVM feature MSR list failed: %s", | |
123 | + strerror(-ret)); | |
124 | + g_free(kvm_feature_msrs); | |
125 | + kvm_feature_msrs = NULL; | |
126 | + return ret; | |
127 | + } | |
128 | + | |
129 | + return 0; | |
130 | +} | |
131 | + | |
132 | static int kvm_get_supported_msrs(KVMState *s) | |
133 | { | |
134 | static int kvm_supported_msrs; | |
135 | @@ -1400,6 +1478,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s) | |
136 | return ret; | |
137 | } | |
138 | ||
139 | + kvm_get_supported_feature_msrs(s); | |
140 | + | |
141 | uname(&utsname); | |
142 | lm_capable_kernel = strcmp(utsname.machine, "x86_64") == 0; | |
143 | ||
144 | -- | |
145 | 2.20.1 | |
146 |