cpuid.c 23.3 KB
Newer Older
Avi Kivity's avatar
Avi Kivity committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
 * Kernel-based Virtual Machine driver for Linux
 * cpuid support routines
 *
 * derived from arch/x86/kvm/x86.c
 *
 * Copyright 2011 Red Hat, Inc. and/or its affiliates.
 * Copyright IBM Corporation, 2008
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 *
 */

#include <linux/kvm_host.h>
16
#include <linux/export.h>
17
18
#include <linux/vmalloc.h>
#include <linux/uaccess.h>
19
20
#include <linux/sched/stat.h>

21
#include <asm/processor.h>
Avi Kivity's avatar
Avi Kivity committed
22
#include <asm/user.h>
23
#include <asm/fpu/xstate.h>
Avi Kivity's avatar
Avi Kivity committed
24
25
26
27
#include "cpuid.h"
#include "lapic.h"
#include "mmu.h"
#include "trace.h"
28
#include "pmu.h"
Avi Kivity's avatar
Avi Kivity committed
29

30
static u32 xstate_required_size(u64 xstate_bv, bool compacted)
31
32
33
34
{
	int feature_bit = 0;
	u32 ret = XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET;

Dave Hansen's avatar
Dave Hansen committed
35
	xstate_bv &= XFEATURE_MASK_EXTEND;
36
37
	while (xstate_bv) {
		if (xstate_bv & 0x1) {
38
		        u32 eax, ebx, ecx, edx, offset;
39
		        cpuid_count(0xD, feature_bit, &eax, &ebx, &ecx, &edx);
40
41
			offset = compacted ? ret : ebx;
			ret = max(ret, offset + eax);
42
43
44
45
46
47
48
49
50
		}

		xstate_bv >>= 1;
		feature_bit++;
	}

	return ret;
}

51
52
53
54
55
56
57
bool kvm_mpx_supported(void)
{
	return ((host_xcr0 & (XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR))
		 && kvm_x86_ops->mpx_supported());
}
EXPORT_SYMBOL_GPL(kvm_mpx_supported);

58
59
60
61
u64 kvm_supported_xcr0(void)
{
	u64 xcr0 = KVM_SUPPORTED_XCR0 & host_xcr0;

62
	if (!kvm_mpx_supported())
Dave Hansen's avatar
Dave Hansen committed
63
		xcr0 &= ~(XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR);
64
65
66
67

	return xcr0;
}

68
69
#define F(x) bit(X86_FEATURE_##x)

70
/* For scattered features from cpufeatures.h; we currently expose none */
71
72
#define KF(x) bit(KVM_CPUID_BIT_##x)

73
int kvm_update_cpuid(struct kvm_vcpu *vcpu)
Avi Kivity's avatar
Avi Kivity committed
74
75
76
77
78
79
{
	struct kvm_cpuid_entry2 *best;
	struct kvm_lapic *apic = vcpu->arch.apic;

	best = kvm_find_cpuid_entry(vcpu, 1, 0);
	if (!best)
80
		return 0;
Avi Kivity's avatar
Avi Kivity committed
81
82

	/* Update OSXSAVE bit */
83
	if (boot_cpu_has(X86_FEATURE_XSAVE) && best->function == 0x1) {
84
		best->ecx &= ~F(OSXSAVE);
Avi Kivity's avatar
Avi Kivity committed
85
		if (kvm_read_cr4_bits(vcpu, X86_CR4_OSXSAVE))
86
			best->ecx |= F(OSXSAVE);
Avi Kivity's avatar
Avi Kivity committed
87
88
	}

89
90
91
92
	best->edx &= ~F(APIC);
	if (vcpu->arch.apic_base & MSR_IA32_APICBASE_ENABLE)
		best->edx |= F(APIC);

Avi Kivity's avatar
Avi Kivity committed
93
	if (apic) {
94
		if (best->ecx & F(TSC_DEADLINE_TIMER))
Avi Kivity's avatar
Avi Kivity committed
95
96
97
98
			apic->lapic_timer.timer_mode_mask = 3 << 17;
		else
			apic->lapic_timer.timer_mode_mask = 1 << 17;
	}
99

100
101
102
103
104
105
106
107
108
109
	best = kvm_find_cpuid_entry(vcpu, 7, 0);
	if (best) {
		/* Update OSPKE bit */
		if (boot_cpu_has(X86_FEATURE_PKU) && best->function == 0x7) {
			best->ecx &= ~F(OSPKE);
			if (kvm_read_cr4_bits(vcpu, X86_CR4_PKE))
				best->ecx |= F(OSPKE);
		}
	}

110
	best = kvm_find_cpuid_entry(vcpu, 0xD, 0);
111
	if (!best) {
112
		vcpu->arch.guest_supported_xcr0 = 0;
113
114
		vcpu->arch.guest_xstate_size = XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET;
	} else {
115
116
		vcpu->arch.guest_supported_xcr0 =
			(best->eax | ((u64)best->edx << 32)) &
117
			kvm_supported_xcr0();
118
		vcpu->arch.guest_xstate_size = best->ebx =
119
			xstate_required_size(vcpu->arch.xcr0, false);
120
	}
121

122
123
124
125
	best = kvm_find_cpuid_entry(vcpu, 0xD, 1);
	if (best && (best->eax & (F(XSAVES) | F(XSAVEC))))
		best->ebx = xstate_required_size(vcpu->arch.xcr0, true);

126
	/*
127
128
	 * The existing code assumes virtual address is 48-bit or 57-bit in the
	 * canonical address checks; exit if it is ever changed.
129
130
	 */
	best = kvm_find_cpuid_entry(vcpu, 0x80000008, 0);
131
132
133
134
135
136
	if (best) {
		int vaddr_bits = (best->eax & 0xff00) >> 8;

		if (vaddr_bits != 48 && vaddr_bits != 57 && vaddr_bits != 0)
			return -EINVAL;
	}
137

138
139
	/* Update physical-address width */
	vcpu->arch.maxphyaddr = cpuid_query_maxphyaddr(vcpu);
140
	kvm_mmu_reset_context(vcpu);
141

142
	kvm_pmu_refresh(vcpu);
143
	return 0;
Avi Kivity's avatar
Avi Kivity committed
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
}

static int is_efer_nx(void)
{
	unsigned long long efer = 0;

	rdmsrl_safe(MSR_EFER, &efer);
	return efer & EFER_NX;
}

static void cpuid_fix_nx_cap(struct kvm_vcpu *vcpu)
{
	int i;
	struct kvm_cpuid_entry2 *e, *entry;

	entry = NULL;
	for (i = 0; i < vcpu->arch.cpuid_nent; ++i) {
		e = &vcpu->arch.cpuid_entries[i];
		if (e->function == 0x80000001) {
			entry = e;
			break;
		}
	}
167
168
	if (entry && (entry->edx & F(NX)) && !is_efer_nx()) {
		entry->edx &= ~F(NX);
Avi Kivity's avatar
Avi Kivity committed
169
170
171
172
		printk(KERN_INFO "kvm: guest NX capability removed\n");
	}
}

173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
int cpuid_query_maxphyaddr(struct kvm_vcpu *vcpu)
{
	struct kvm_cpuid_entry2 *best;

	best = kvm_find_cpuid_entry(vcpu, 0x80000000, 0);
	if (!best || best->eax < 0x80000008)
		goto not_found;
	best = kvm_find_cpuid_entry(vcpu, 0x80000008, 0);
	if (best)
		return best->eax & 0xff;
not_found:
	return 36;
}
EXPORT_SYMBOL_GPL(cpuid_query_maxphyaddr);

Avi Kivity's avatar
Avi Kivity committed
188
189
190
191
192
193
/* when an old userspace process fills a new kernel module */
int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu,
			     struct kvm_cpuid *cpuid,
			     struct kvm_cpuid_entry __user *entries)
{
	int r, i;
194
	struct kvm_cpuid_entry *cpuid_entries = NULL;
Avi Kivity's avatar
Avi Kivity committed
195
196
197
198
199

	r = -E2BIG;
	if (cpuid->nent > KVM_MAX_CPUID_ENTRIES)
		goto out;
	r = -ENOMEM;
200
201
202
203
204
205
206
207
208
209
	if (cpuid->nent) {
		cpuid_entries = vmalloc(sizeof(struct kvm_cpuid_entry) *
					cpuid->nent);
		if (!cpuid_entries)
			goto out;
		r = -EFAULT;
		if (copy_from_user(cpuid_entries, entries,
				   cpuid->nent * sizeof(struct kvm_cpuid_entry)))
			goto out;
	}
Avi Kivity's avatar
Avi Kivity committed
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
	for (i = 0; i < cpuid->nent; i++) {
		vcpu->arch.cpuid_entries[i].function = cpuid_entries[i].function;
		vcpu->arch.cpuid_entries[i].eax = cpuid_entries[i].eax;
		vcpu->arch.cpuid_entries[i].ebx = cpuid_entries[i].ebx;
		vcpu->arch.cpuid_entries[i].ecx = cpuid_entries[i].ecx;
		vcpu->arch.cpuid_entries[i].edx = cpuid_entries[i].edx;
		vcpu->arch.cpuid_entries[i].index = 0;
		vcpu->arch.cpuid_entries[i].flags = 0;
		vcpu->arch.cpuid_entries[i].padding[0] = 0;
		vcpu->arch.cpuid_entries[i].padding[1] = 0;
		vcpu->arch.cpuid_entries[i].padding[2] = 0;
	}
	vcpu->arch.cpuid_nent = cpuid->nent;
	cpuid_fix_nx_cap(vcpu);
	kvm_apic_set_version(vcpu);
	kvm_x86_ops->cpuid_update(vcpu);
226
	r = kvm_update_cpuid(vcpu);
Avi Kivity's avatar
Avi Kivity committed
227
228

out:
229
	vfree(cpuid_entries);
Avi Kivity's avatar
Avi Kivity committed
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
	return r;
}

int kvm_vcpu_ioctl_set_cpuid2(struct kvm_vcpu *vcpu,
			      struct kvm_cpuid2 *cpuid,
			      struct kvm_cpuid_entry2 __user *entries)
{
	int r;

	r = -E2BIG;
	if (cpuid->nent > KVM_MAX_CPUID_ENTRIES)
		goto out;
	r = -EFAULT;
	if (copy_from_user(&vcpu->arch.cpuid_entries, entries,
			   cpuid->nent * sizeof(struct kvm_cpuid_entry2)))
		goto out;
	vcpu->arch.cpuid_nent = cpuid->nent;
	kvm_apic_set_version(vcpu);
	kvm_x86_ops->cpuid_update(vcpu);
249
	r = kvm_update_cpuid(vcpu);
Avi Kivity's avatar
Avi Kivity committed
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
out:
	return r;
}

int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu,
			      struct kvm_cpuid2 *cpuid,
			      struct kvm_cpuid_entry2 __user *entries)
{
	int r;

	r = -E2BIG;
	if (cpuid->nent < vcpu->arch.cpuid_nent)
		goto out;
	r = -EFAULT;
	if (copy_to_user(entries, &vcpu->arch.cpuid_entries,
			 vcpu->arch.cpuid_nent * sizeof(struct kvm_cpuid_entry2)))
		goto out;
	return 0;

out:
	cpuid->nent = vcpu->arch.cpuid_nent;
	return r;
}

static void cpuid_mask(u32 *word, int wordnum)
{
	*word &= boot_cpu_data.x86_capability[wordnum];
}

static void do_cpuid_1_ent(struct kvm_cpuid_entry2 *entry, u32 function,
			   u32 index)
{
	entry->function = function;
	entry->index = index;
	cpuid_count(entry->function, entry->index,
		    &entry->eax, &entry->ebx, &entry->ecx, &entry->edx);
	entry->flags = 0;
}

289
290
291
static int __do_cpuid_ent_emulated(struct kvm_cpuid_entry2 *entry,
				   u32 func, u32 index, int *nent, int maxnent)
{
Borislav Petkov's avatar
Borislav Petkov committed
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
	switch (func) {
	case 0:
		entry->eax = 1;		/* only one leaf currently */
		++*nent;
		break;
	case 1:
		entry->ecx = F(MOVBE);
		++*nent;
		break;
	default:
		break;
	}

	entry->function = func;
	entry->index = index;

308
309
310
311
312
	return 0;
}

static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
				 u32 index, int *nent, int maxnent)
Avi Kivity's avatar
Avi Kivity committed
313
{
314
	int r;
Avi Kivity's avatar
Avi Kivity committed
315
316
317
318
319
320
321
322
323
324
	unsigned f_nx = is_efer_nx() ? F(NX) : 0;
#ifdef CONFIG_X86_64
	unsigned f_gbpages = (kvm_x86_ops->get_lpage_level() == PT_PDPE_LEVEL)
				? F(GBPAGES) : 0;
	unsigned f_lm = F(LM);
#else
	unsigned f_gbpages = 0;
	unsigned f_lm = 0;
#endif
	unsigned f_rdtscp = kvm_x86_ops->rdtscp_supported() ? F(RDTSCP) : 0;
325
	unsigned f_invpcid = kvm_x86_ops->invpcid_supported() ? F(INVPCID) : 0;
326
	unsigned f_mpx = kvm_mpx_supported() ? F(MPX) : 0;
327
	unsigned f_xsaves = kvm_x86_ops->xsaves_supported() ? F(XSAVES) : 0;
Avi Kivity's avatar
Avi Kivity committed
328
329

	/* cpuid 1.edx */
330
	const u32 kvm_cpuid_1_edx_x86_features =
Avi Kivity's avatar
Avi Kivity committed
331
332
333
334
		F(FPU) | F(VME) | F(DE) | F(PSE) |
		F(TSC) | F(MSR) | F(PAE) | F(MCE) |
		F(CX8) | F(APIC) | 0 /* Reserved */ | F(SEP) |
		F(MTRR) | F(PGE) | F(MCA) | F(CMOV) |
335
		F(PAT) | F(PSE36) | 0 /* PSN */ | F(CLFLUSH) |
Avi Kivity's avatar
Avi Kivity committed
336
337
338
339
		0 /* Reserved, DS, ACPI */ | F(MMX) |
		F(FXSR) | F(XMM) | F(XMM2) | F(SELFSNOOP) |
		0 /* HTT, TM, Reserved, PBE */;
	/* cpuid 0x80000001.edx */
340
	const u32 kvm_cpuid_8000_0001_edx_x86_features =
Avi Kivity's avatar
Avi Kivity committed
341
342
343
344
345
346
347
348
349
		F(FPU) | F(VME) | F(DE) | F(PSE) |
		F(TSC) | F(MSR) | F(PAE) | F(MCE) |
		F(CX8) | F(APIC) | 0 /* Reserved */ | F(SYSCALL) |
		F(MTRR) | F(PGE) | F(MCA) | F(CMOV) |
		F(PAT) | F(PSE36) | 0 /* Reserved */ |
		f_nx | 0 /* Reserved */ | F(MMXEXT) | F(MMX) |
		F(FXSR) | F(FXSR_OPT) | f_gbpages | f_rdtscp |
		0 /* Reserved */ | f_lm | F(3DNOWEXT) | F(3DNOW);
	/* cpuid 1.ecx */
350
	const u32 kvm_cpuid_1_ecx_x86_features =
351
352
		/* NOTE: MONITOR (and MWAIT) are emulated as NOP,
		 * but *not* advertised to guests via CPUID ! */
Avi Kivity's avatar
Avi Kivity committed
353
354
355
		F(XMM3) | F(PCLMULQDQ) | 0 /* DTES64, MONITOR */ |
		0 /* DS-CPL, VMX, SMX, EST */ |
		0 /* TM2 */ | F(SSSE3) | 0 /* CNXT-ID */ | 0 /* Reserved */ |
356
		F(FMA) | F(CX16) | 0 /* xTPR Update, PDCM */ |
357
		F(PCID) | 0 /* Reserved, DCA */ | F(XMM4_1) |
Avi Kivity's avatar
Avi Kivity committed
358
359
360
361
		F(XMM4_2) | F(X2APIC) | F(MOVBE) | F(POPCNT) |
		0 /* Reserved*/ | F(AES) | F(XSAVE) | 0 /* OSXSAVE */ | F(AVX) |
		F(F16C) | F(RDRAND);
	/* cpuid 0x80000001.ecx */
362
	const u32 kvm_cpuid_8000_0001_ecx_x86_features =
Avi Kivity's avatar
Avi Kivity committed
363
364
		F(LAHF_LM) | F(CMP_LEGACY) | 0 /*SVM*/ | 0 /* ExtApicSpace */ |
		F(CR8_LEGACY) | F(ABM) | F(SSE4A) | F(MISALIGNSSE) |
365
		F(3DNOWPREFETCH) | F(OSVW) | 0 /* IBS */ | F(XOP) |
Avi Kivity's avatar
Avi Kivity committed
366
367
368
		0 /* SKINIT, WDT, LWP */ | F(FMA4) | F(TBM);

	/* cpuid 0xC0000001.edx */
369
	const u32 kvm_cpuid_C000_0001_edx_x86_features =
Avi Kivity's avatar
Avi Kivity committed
370
371
372
373
374
		F(XSTORE) | F(XSTORE_EN) | F(XCRYPT) | F(XCRYPT_EN) |
		F(ACE2) | F(ACE2_EN) | F(PHE) | F(PHE_EN) |
		F(PMM) | F(PMM_EN);

	/* cpuid 7.0.ebx */
375
	const u32 kvm_cpuid_7_0_ebx_x86_features =
376
		F(FSGSBASE) | F(BMI1) | F(HLE) | F(AVX2) | F(SMEP) |
377
		F(BMI2) | F(ERMS) | f_invpcid | F(RTM) | f_mpx | F(RDSEED) |
378
379
380
		F(ADX) | F(SMAP) | F(AVX512IFMA) | F(AVX512F) | F(AVX512PF) |
		F(AVX512ER) | F(AVX512CD) | F(CLFLUSHOPT) | F(CLWB) | F(AVX512DQ) |
		F(SHA_NI) | F(AVX512BW) | F(AVX512VL);
Avi Kivity's avatar
Avi Kivity committed
381

Paolo Bonzini's avatar
Paolo Bonzini committed
382
	/* cpuid 0xD.1.eax */
383
	const u32 kvm_cpuid_D_1_eax_x86_features =
384
		F(XSAVEOPT) | F(XSAVEC) | F(XGETBV1) | f_xsaves;
Paolo Bonzini's avatar
Paolo Bonzini committed
385

386
	/* cpuid 7.0.ecx*/
387
	const u32 kvm_cpuid_7_0_ecx_x86_features =
388
389
		F(AVX512VBMI) | F(LA57) | F(PKU) |
		0 /*OSPKE*/ | F(AVX512_VPOPCNTDQ);
390

391
392
	/* cpuid 7.0.edx*/
	const u32 kvm_cpuid_7_0_edx_x86_features =
393
		F(AVX512_4VNNIW) | F(AVX512_4FMAPS);
394

Avi Kivity's avatar
Avi Kivity committed
395
396
	/* all calls to cpuid_count() should be made on the same cpu */
	get_cpu();
397
398
399
400
401
402

	r = -E2BIG;

	if (*nent >= maxnent)
		goto out;

Avi Kivity's avatar
Avi Kivity committed
403
404
405
406
407
408
409
410
	do_cpuid_1_ent(entry, function, index);
	++*nent;

	switch (function) {
	case 0:
		entry->eax = min(entry->eax, (u32)0xd);
		break;
	case 1:
411
412
413
414
		entry->edx &= kvm_cpuid_1_edx_x86_features;
		cpuid_mask(&entry->edx, CPUID_1_EDX);
		entry->ecx &= kvm_cpuid_1_ecx_x86_features;
		cpuid_mask(&entry->ecx, CPUID_1_ECX);
Avi Kivity's avatar
Avi Kivity committed
415
416
417
418
419
420
421
422
423
424
425
426
427
		/* we support x2apic emulation even if host does not support
		 * it since we emulate x2apic in software */
		entry->ecx |= F(X2APIC);
		break;
	/* function 2 entries are STATEFUL. That is, repeated cpuid commands
	 * may return different values. This forces us to get_cpu() before
	 * issuing the first command, and also to emulate this annoying behavior
	 * in kvm_emulate_cpuid() using KVM_CPUID_FLAG_STATE_READ_NEXT */
	case 2: {
		int t, times = entry->eax & 0xff;

		entry->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
		entry->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT;
428
429
430
431
		for (t = 1; t < times; ++t) {
			if (*nent >= maxnent)
				goto out;

Avi Kivity's avatar
Avi Kivity committed
432
433
434
435
436
437
438
439
440
441
442
443
			do_cpuid_1_ent(&entry[t], function, 0);
			entry[t].flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
			++*nent;
		}
		break;
	}
	/* function 4 has additional index. */
	case 4: {
		int i, cache_type;

		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
		/* read more entries until cache_type is zero */
444
445
446
447
		for (i = 1; ; ++i) {
			if (*nent >= maxnent)
				goto out;

Avi Kivity's avatar
Avi Kivity committed
448
449
450
451
452
453
454
455
456
457
			cache_type = entry[i - 1].eax & 0x1f;
			if (!cache_type)
				break;
			do_cpuid_1_ent(&entry[i], function, i);
			entry[i].flags |=
			       KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
			++*nent;
		}
		break;
	}
Jan Kiszka's avatar
Jan Kiszka committed
458
459
460
461
462
463
	case 6: /* Thermal management */
		entry->eax = 0x4; /* allow ARAT */
		entry->ebx = 0;
		entry->ecx = 0;
		entry->edx = 0;
		break;
Avi Kivity's avatar
Avi Kivity committed
464
465
	case 7: {
		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
Guo Chao's avatar
Guo Chao committed
466
		/* Mask ebx against host capability word 9 */
Avi Kivity's avatar
Avi Kivity committed
467
		if (index == 0) {
468
469
			entry->ebx &= kvm_cpuid_7_0_ebx_x86_features;
			cpuid_mask(&entry->ebx, CPUID_7_0_EBX);
470
471
			// TSC_ADJUST is emulated
			entry->ebx |= F(TSC_ADJUST);
472
473
474
			entry->ecx &= kvm_cpuid_7_0_ecx_x86_features;
			cpuid_mask(&entry->ecx, CPUID_7_ECX);
			/* PKU is not yet implemented for shadow paging. */
475
			if (!tdp_enabled || !boot_cpu_has(X86_FEATURE_OSPKE))
476
				entry->ecx &= ~F(PKU);
477
			entry->edx &= kvm_cpuid_7_0_edx_x86_features;
478
			cpuid_mask(&entry->edx, CPUID_7_EDX);
479
		} else {
Avi Kivity's avatar
Avi Kivity committed
480
			entry->ebx = 0;
481
			entry->ecx = 0;
482
			entry->edx = 0;
483
		}
Avi Kivity's avatar
Avi Kivity committed
484
485
486
487
488
		entry->eax = 0;
		break;
	}
	case 9:
		break;
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
	case 0xa: { /* Architectural Performance Monitoring */
		struct x86_pmu_capability cap;
		union cpuid10_eax eax;
		union cpuid10_edx edx;

		perf_get_x86_pmu_capability(&cap);

		/*
		 * Only support guest architectural pmu on a host
		 * with architectural pmu.
		 */
		if (!cap.version)
			memset(&cap, 0, sizeof(cap));

		eax.split.version_id = min(cap.version, 2);
		eax.split.num_counters = cap.num_counters_gp;
		eax.split.bit_width = cap.bit_width_gp;
		eax.split.mask_length = cap.events_mask_len;

		edx.split.num_counters_fixed = cap.num_counters_fixed;
		edx.split.bit_width_fixed = cap.bit_width_fixed;
		edx.split.reserved = 0;

		entry->eax = eax.full;
		entry->ebx = cap.events_mask;
		entry->ecx = 0;
		entry->edx = edx.full;
		break;
	}
Avi Kivity's avatar
Avi Kivity committed
518
519
520
521
522
523
	/* function 0xb has additional index. */
	case 0xb: {
		int i, level_type;

		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
		/* read more entries until level_type is zero */
524
525
526
527
		for (i = 1; ; ++i) {
			if (*nent >= maxnent)
				goto out;

Avi Kivity's avatar
Avi Kivity committed
528
529
530
531
532
533
534
535
536
537
538
539
			level_type = entry[i - 1].ecx & 0xff00;
			if (!level_type)
				break;
			do_cpuid_1_ent(&entry[i], function, i);
			entry[i].flags |=
			       KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
			++*nent;
		}
		break;
	}
	case 0xd: {
		int idx, i;
540
		u64 supported = kvm_supported_xcr0();
Avi Kivity's avatar
Avi Kivity committed
541

542
		entry->eax &= supported;
543
544
		entry->ebx = xstate_required_size(supported, false);
		entry->ecx = entry->ebx;
545
		entry->edx &= supported >> 32;
Avi Kivity's avatar
Avi Kivity committed
546
		entry->flags |= KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
Paolo Bonzini's avatar
Paolo Bonzini committed
547
548
549
		if (!supported)
			break;

550
		for (idx = 1, i = 1; idx < 64; ++idx) {
551
			u64 mask = ((u64)1 << idx);
552
553
554
			if (*nent >= maxnent)
				goto out;

Avi Kivity's avatar
Avi Kivity committed
555
			do_cpuid_1_ent(&entry[i], function, idx);
556
			if (idx == 1) {
557
				entry[i].eax &= kvm_cpuid_D_1_eax_x86_features;
558
				cpuid_mask(&entry[i].eax, CPUID_D_1_EAX);
559
560
561
562
563
				entry[i].ebx = 0;
				if (entry[i].eax & (F(XSAVES)|F(XSAVEC)))
					entry[i].ebx =
						xstate_required_size(supported,
								     true);
564
565
566
567
568
569
570
571
			} else {
				if (entry[i].eax == 0 || !(supported & mask))
					continue;
				if (WARN_ON_ONCE(entry[i].ecx & 1))
					continue;
			}
			entry[i].ecx = 0;
			entry[i].edx = 0;
Avi Kivity's avatar
Avi Kivity committed
572
573
574
575
576
577
578
579
			entry[i].flags |=
			       KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
			++*nent;
			++i;
		}
		break;
	}
	case KVM_CPUID_SIGNATURE: {
580
581
		static const char signature[12] = "KVMKVMKVM\0\0";
		const u32 *sigptr = (const u32 *)signature;
582
		entry->eax = KVM_CPUID_FEATURES;
Avi Kivity's avatar
Avi Kivity committed
583
584
585
586
587
588
589
590
591
592
		entry->ebx = sigptr[0];
		entry->ecx = sigptr[1];
		entry->edx = sigptr[2];
		break;
	}
	case KVM_CPUID_FEATURES:
		entry->eax = (1 << KVM_FEATURE_CLOCKSOURCE) |
			     (1 << KVM_FEATURE_NOP_IO_DELAY) |
			     (1 << KVM_FEATURE_CLOCKSOURCE2) |
			     (1 << KVM_FEATURE_ASYNC_PF) |
593
			     (1 << KVM_FEATURE_PV_EOI) |
594
595
			     (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT) |
			     (1 << KVM_FEATURE_PV_UNHALT);
Avi Kivity's avatar
Avi Kivity committed
596
597
598
599
600
601
602
603
604
605
606
607

		if (sched_info_on())
			entry->eax |= (1 << KVM_FEATURE_STEAL_TIME);

		entry->ebx = 0;
		entry->ecx = 0;
		entry->edx = 0;
		break;
	case 0x80000000:
		entry->eax = min(entry->eax, 0x8000001a);
		break;
	case 0x80000001:
608
609
610
611
		entry->edx &= kvm_cpuid_8000_0001_edx_x86_features;
		cpuid_mask(&entry->edx, CPUID_8000_0001_EDX);
		entry->ecx &= kvm_cpuid_8000_0001_ecx_x86_features;
		cpuid_mask(&entry->ecx, CPUID_8000_0001_ECX);
Avi Kivity's avatar
Avi Kivity committed
612
		break;
613
614
615
616
617
618
619
	case 0x80000007: /* Advanced power management */
		/* invariant TSC is CPUID.80000007H:EDX[8] */
		entry->edx &= (1 << 8);
		/* mask against host */
		entry->edx &= boot_cpu_data.x86_power;
		entry->eax = entry->ebx = entry->ecx = 0;
		break;
Avi Kivity's avatar
Avi Kivity committed
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
	case 0x80000008: {
		unsigned g_phys_as = (entry->eax >> 16) & 0xff;
		unsigned virt_as = max((entry->eax >> 8) & 0xff, 48U);
		unsigned phys_as = entry->eax & 0xff;

		if (!g_phys_as)
			g_phys_as = phys_as;
		entry->eax = g_phys_as | (virt_as << 8);
		entry->ebx = entry->edx = 0;
		break;
	}
	case 0x80000019:
		entry->ecx = entry->edx = 0;
		break;
	case 0x8000001a:
		break;
	case 0x8000001d:
		break;
	/*Add support for Centaur's CPUID instruction*/
	case 0xC0000000:
		/*Just support up to 0xC0000004 now*/
		entry->eax = min(entry->eax, 0xC0000004);
		break;
	case 0xC0000001:
644
645
		entry->edx &= kvm_cpuid_C000_0001_edx_x86_features;
		cpuid_mask(&entry->edx, CPUID_C000_0001_EDX);
Avi Kivity's avatar
Avi Kivity committed
646
647
648
649
650
651
652
653
654
655
656
657
658
		break;
	case 3: /* Processor serial number */
	case 5: /* MONITOR/MWAIT */
	case 0xC0000002:
	case 0xC0000003:
	case 0xC0000004:
	default:
		entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
		break;
	}

	kvm_x86_ops->set_supported_cpuid(function, entry);

659
660
661
	r = 0;

out:
Avi Kivity's avatar
Avi Kivity committed
662
	put_cpu();
663
664

	return r;
Avi Kivity's avatar
Avi Kivity committed
665
666
}

667
668
669
670
671
672
673
674
675
static int do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 func,
			u32 idx, int *nent, int maxnent, unsigned int type)
{
	if (type == KVM_GET_EMULATED_CPUID)
		return __do_cpuid_ent_emulated(entry, func, idx, nent, maxnent);

	return __do_cpuid_ent(entry, func, idx, nent, maxnent);
}

Avi Kivity's avatar
Avi Kivity committed
676
677
#undef F

678
679
680
681
struct kvm_cpuid_param {
	u32 func;
	u32 idx;
	bool has_leaf_count;
682
	bool (*qualifier)(const struct kvm_cpuid_param *param);
683
684
};

685
static bool is_centaur_cpu(const struct kvm_cpuid_param *param)
686
687
688
689
{
	return boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR;
}

690
691
692
693
static bool sanity_check_entries(struct kvm_cpuid_entry2 __user *entries,
				 __u32 num_entries, unsigned int ioctl_type)
{
	int i;
694
	__u32 pad[3];
695
696
697
698
699
700
701
702
703
704
705
706
707

	if (ioctl_type != KVM_GET_EMULATED_CPUID)
		return false;

	/*
	 * We want to make sure that ->padding is being passed clean from
	 * userspace in case we want to use it for something in the future.
	 *
	 * Sadly, this wasn't enforced for KVM_GET_SUPPORTED_CPUID and so we
	 * have to give ourselves satisfied only with the emulated side. /me
	 * sheds a tear.
	 */
	for (i = 0; i < num_entries; i++) {
708
709
710
711
		if (copy_from_user(pad, entries[i].padding, sizeof(pad)))
			return true;

		if (pad[0] || pad[1] || pad[2])
712
713
714
715
716
717
718
719
			return true;
	}
	return false;
}

int kvm_dev_ioctl_get_cpuid(struct kvm_cpuid2 *cpuid,
			    struct kvm_cpuid_entry2 __user *entries,
			    unsigned int type)
Avi Kivity's avatar
Avi Kivity committed
720
721
{
	struct kvm_cpuid_entry2 *cpuid_entries;
722
	int limit, nent = 0, r = -E2BIG, i;
Avi Kivity's avatar
Avi Kivity committed
723
	u32 func;
724
	static const struct kvm_cpuid_param param[] = {
725
726
727
728
729
730
		{ .func = 0, .has_leaf_count = true },
		{ .func = 0x80000000, .has_leaf_count = true },
		{ .func = 0xC0000000, .qualifier = is_centaur_cpu, .has_leaf_count = true },
		{ .func = KVM_CPUID_SIGNATURE },
		{ .func = KVM_CPUID_FEATURES },
	};
Avi Kivity's avatar
Avi Kivity committed
731
732
733
734
735

	if (cpuid->nent < 1)
		goto out;
	if (cpuid->nent > KVM_MAX_CPUID_ENTRIES)
		cpuid->nent = KVM_MAX_CPUID_ENTRIES;
736
737
738
739

	if (sanity_check_entries(entries, cpuid->nent, type))
		return -EINVAL;

Avi Kivity's avatar
Avi Kivity committed
740
	r = -ENOMEM;
Borislav Petkov's avatar
Borislav Petkov committed
741
	cpuid_entries = vzalloc(sizeof(struct kvm_cpuid_entry2) * cpuid->nent);
Avi Kivity's avatar
Avi Kivity committed
742
743
744
	if (!cpuid_entries)
		goto out;

745
746
	r = 0;
	for (i = 0; i < ARRAY_SIZE(param); i++) {
747
		const struct kvm_cpuid_param *ent = &param[i];
Avi Kivity's avatar
Avi Kivity committed
748

749
750
		if (ent->qualifier && !ent->qualifier(ent))
			continue;
Avi Kivity's avatar
Avi Kivity committed
751

752
		r = do_cpuid_ent(&cpuid_entries[nent], ent->func, ent->idx,
753
				&nent, cpuid->nent, type);
Avi Kivity's avatar
Avi Kivity committed
754

755
		if (r)
Avi Kivity's avatar
Avi Kivity committed
756
757
			goto out_free;

758
759
760
		if (!ent->has_leaf_count)
			continue;

Avi Kivity's avatar
Avi Kivity committed
761
		limit = cpuid_entries[nent - 1].eax;
762
763
		for (func = ent->func + 1; func <= limit && nent < cpuid->nent && r == 0; ++func)
			r = do_cpuid_ent(&cpuid_entries[nent], func, ent->idx,
764
				     &nent, cpuid->nent, type);
Avi Kivity's avatar
Avi Kivity committed
765

766
		if (r)
Avi Kivity's avatar
Avi Kivity committed
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
			goto out_free;
	}

	r = -EFAULT;
	if (copy_to_user(entries, cpuid_entries,
			 nent * sizeof(struct kvm_cpuid_entry2)))
		goto out_free;
	cpuid->nent = nent;
	r = 0;

out_free:
	vfree(cpuid_entries);
out:
	return r;
}

static int move_to_next_stateful_cpuid_entry(struct kvm_vcpu *vcpu, int i)
{
	struct kvm_cpuid_entry2 *e = &vcpu->arch.cpuid_entries[i];
786
787
788
	struct kvm_cpuid_entry2 *ej;
	int j = i;
	int nent = vcpu->arch.cpuid_nent;
Avi Kivity's avatar
Avi Kivity committed
789
790
791

	e->flags &= ~KVM_CPUID_FLAG_STATE_READ_NEXT;
	/* when no next entry is found, the current entry[i] is reselected */
792
793
794
795
796
797
798
799
	do {
		j = (j + 1) % nent;
		ej = &vcpu->arch.cpuid_entries[j];
	} while (ej->function != e->function);

	ej->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT;

	return j;
Avi Kivity's avatar
Avi Kivity committed
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
}

/* find an entry with matching function, matching index (if needed), and that
 * should be read next (if it's stateful) */
static int is_matching_cpuid_entry(struct kvm_cpuid_entry2 *e,
	u32 function, u32 index)
{
	if (e->function != function)
		return 0;
	if ((e->flags & KVM_CPUID_FLAG_SIGNIFCANT_INDEX) && e->index != index)
		return 0;
	if ((e->flags & KVM_CPUID_FLAG_STATEFUL_FUNC) &&
	    !(e->flags & KVM_CPUID_FLAG_STATE_READ_NEXT))
		return 0;
	return 1;
}

struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu,
					      u32 function, u32 index)
{
	int i;
	struct kvm_cpuid_entry2 *best = NULL;

	for (i = 0; i < vcpu->arch.cpuid_nent; ++i) {
		struct kvm_cpuid_entry2 *e;

		e = &vcpu->arch.cpuid_entries[i];
		if (is_matching_cpuid_entry(e, function, index)) {
			if (e->flags & KVM_CPUID_FLAG_STATEFUL_FUNC)
				move_to_next_stateful_cpuid_entry(vcpu, i);
			best = e;
			break;
		}
	}
	return best;
}
EXPORT_SYMBOL_GPL(kvm_find_cpuid_entry);

/*
 * If no match is found, check whether we exceed the vCPU's limit
 * and return the content of the highest valid _standard_ leaf instead.
 * This is to satisfy the CPUID specification.
 */
static struct kvm_cpuid_entry2* check_cpuid_limit(struct kvm_vcpu *vcpu,
                                                  u32 function, u32 index)
{
	struct kvm_cpuid_entry2 *maxlevel;

	maxlevel = kvm_find_cpuid_entry(vcpu, function & 0x80000000, 0);
	if (!maxlevel || maxlevel->eax >= function)
		return NULL;
	if (function & 0x80000000) {
		maxlevel = kvm_find_cpuid_entry(vcpu, 0, 0);
		if (!maxlevel)
			return NULL;
	}
	return kvm_find_cpuid_entry(vcpu, maxlevel->eax, index);
}

859
860
bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx,
	       u32 *ecx, u32 *edx, bool check_limit)
Avi Kivity's avatar
Avi Kivity committed
861
{
862
	u32 function = *eax, index = *ecx;
Avi Kivity's avatar
Avi Kivity committed
863
	struct kvm_cpuid_entry2 *best;
864
	bool entry_found = true;
Avi Kivity's avatar
Avi Kivity committed
865
866
867

	best = kvm_find_cpuid_entry(vcpu, function, index);

868
869
870
871
872
	if (!best) {
		entry_found = false;
		if (!check_limit)
			goto out;

Avi Kivity's avatar
Avi Kivity committed
873
		best = check_cpuid_limit(vcpu, function, index);
874
	}
Avi Kivity's avatar
Avi Kivity committed
875

876
out:
Avi Kivity's avatar
Avi Kivity committed
877
	if (best) {
878
879
880
881
882
883
		*eax = best->eax;
		*ebx = best->ebx;
		*ecx = best->ecx;
		*edx = best->edx;
	} else
		*eax = *ebx = *ecx = *edx = 0;
884
885
	trace_kvm_cpuid(function, *eax, *ebx, *ecx, *edx, entry_found);
	return entry_found;
886
}
887
EXPORT_SYMBOL_GPL(kvm_cpuid);
888

889
int kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
890
{
891
	u32 eax, ebx, ecx, edx;
892

893
894
895
	if (cpuid_fault_enabled(vcpu) && !kvm_require_cpl(vcpu, 0))
		return 1;

896
	eax = kvm_register_read(vcpu, VCPU_REGS_RAX);
897
	ecx = kvm_register_read(vcpu, VCPU_REGS_RCX);
898
	kvm_cpuid(vcpu, &eax, &ebx, &ecx, &edx, true);
899
900
901
902
	kvm_register_write(vcpu, VCPU_REGS_RAX, eax);
	kvm_register_write(vcpu, VCPU_REGS_RBX, ebx);
	kvm_register_write(vcpu, VCPU_REGS_RCX, ecx);
	kvm_register_write(vcpu, VCPU_REGS_RDX, edx);
903
	return kvm_skip_emulated_instruction(vcpu);
Avi Kivity's avatar
Avi Kivity committed
904
905
}
EXPORT_SYMBOL_GPL(kvm_emulate_cpuid);