Deleted Added
full compact
x86.c (280839) x86.c (284900)
1/*-
2 * Copyright (c) 2011 NetApp, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 2011 NetApp, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: stable/10/sys/amd64/vmm/x86.c 280839 2015-03-30 07:11:49Z mav $
26 * $FreeBSD: stable/10/sys/amd64/vmm/x86.c 284900 2015-06-28 03:22:26Z neel $
27 */
28
29#include <sys/cdefs.h>
27 */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: stable/10/sys/amd64/vmm/x86.c 280839 2015-03-30 07:11:49Z mav $");
30__FBSDID("$FreeBSD: stable/10/sys/amd64/vmm/x86.c 284900 2015-06-28 03:22:26Z neel $");
31
32#include <sys/param.h>
33#include <sys/pcpu.h>
34#include <sys/systm.h>
31
32#include <sys/param.h>
33#include <sys/pcpu.h>
34#include <sys/systm.h>
35#include <sys/cpuset.h>
36#include <sys/sysctl.h>
37
38#include <machine/clock.h>
39#include <machine/cpufunc.h>
40#include <machine/md_var.h>
41#include <machine/segments.h>
42#include <machine/specialreg.h>
43

--- 182 unchanged lines hidden (view full) ---

226
227 /*
228 * Override the APIC ID only in ebx
229 */
230 regs[1] &= ~(CPUID_LOCAL_APIC_ID);
231 regs[1] |= (vcpu_id << CPUID_0000_0001_APICID_SHIFT);
232
233 /*
35#include <sys/sysctl.h>
36
37#include <machine/clock.h>
38#include <machine/cpufunc.h>
39#include <machine/md_var.h>
40#include <machine/segments.h>
41#include <machine/specialreg.h>
42

--- 182 unchanged lines hidden (view full) ---

225
226 /*
227 * Override the APIC ID only in ebx
228 */
229 regs[1] &= ~(CPUID_LOCAL_APIC_ID);
230 regs[1] |= (vcpu_id << CPUID_0000_0001_APICID_SHIFT);
231
232 /*
234 * Don't expose VMX, SpeedStep or TME capability.
233 * Don't expose VMX, SpeedStep, TME or SMX capability.
235 * Advertise x2APIC capability and Hypervisor guest.
236 */
237 regs[2] &= ~(CPUID2_VMX | CPUID2_EST | CPUID2_TM2);
234 * Advertise x2APIC capability and Hypervisor guest.
235 */
236 regs[2] &= ~(CPUID2_VMX | CPUID2_EST | CPUID2_TM2);
237 regs[2] &= ~(CPUID2_SMX);
238
239 regs[2] |= CPUID2_HV;
240
241 if (x2apic_state != X2APIC_DISABLED)
242 regs[2] |= CPUID2_X2APIC;
243 else
244 regs[2] &= ~CPUID2_X2APIC;
245

--- 35 unchanged lines hidden (view full) ---

281 * No TSC deadline support in the APIC yet
282 */
283 regs[2] &= ~CPUID2_TSCDLT;
284
285 /*
286 * Hide thermal monitoring
287 */
288 regs[3] &= ~(CPUID_ACPI | CPUID_TM);
238
239 regs[2] |= CPUID2_HV;
240
241 if (x2apic_state != X2APIC_DISABLED)
242 regs[2] |= CPUID2_X2APIC;
243 else
244 regs[2] &= ~CPUID2_X2APIC;
245

--- 35 unchanged lines hidden (view full) ---

281 * No TSC deadline support in the APIC yet
282 */
283 regs[2] &= ~CPUID2_TSCDLT;
284
285 /*
286 * Hide thermal monitoring
287 */
288 regs[3] &= ~(CPUID_ACPI | CPUID_TM);
289
289
290 /*
290 /*
291 * Machine check handling is done in the host.
292 * Hide MTRR capability.
291 * Hide the debug store capability.
293 */
292 */
294 regs[3] &= ~(CPUID_MCA | CPUID_MCE | CPUID_MTRR);
295
296 /*
297 * Hide the debug store capability.
298 */
299 regs[3] &= ~CPUID_DS;
300
293 regs[3] &= ~CPUID_DS;
294
295 /*
296 * Advertise the Machine Check and MTRR capability.
297 *
298 * Some guest OSes (e.g. Windows) will not boot if
299 * these features are absent.
300 */
301 regs[3] |= (CPUID_MCA | CPUID_MCE | CPUID_MTRR);
302
301 logical_cpus = threads_per_core * cores_per_package;
302 regs[1] &= ~CPUID_HTT_CORES;
303 regs[1] |= (logical_cpus & 0xff) << 16;
304 regs[3] |= CPUID_HTT;
305 break;
306
307 case CPUID_0000_0004:
308 cpuid_count(*eax, *ecx, regs);

--- 172 unchanged lines hidden (view full) ---

481
482 *eax = regs[0];
483 *ebx = regs[1];
484 *ecx = regs[2];
485 *edx = regs[3];
486
487 return (1);
488}
303 logical_cpus = threads_per_core * cores_per_package;
304 regs[1] &= ~CPUID_HTT_CORES;
305 regs[1] |= (logical_cpus & 0xff) << 16;
306 regs[3] |= CPUID_HTT;
307 break;
308
309 case CPUID_0000_0004:
310 cpuid_count(*eax, *ecx, regs);

--- 172 unchanged lines hidden (view full) ---

483
484 *eax = regs[0];
485 *ebx = regs[1];
486 *ecx = regs[2];
487 *edx = regs[3];
488
489 return (1);
490}
491
492bool
493vm_cpuid_capability(struct vm *vm, int vcpuid, enum vm_cpuid_capability cap)
494{
495 bool rv;
496
497 KASSERT(cap > 0 && cap < VCC_LAST, ("%s: invalid vm_cpu_capability %d",
498 __func__, cap));
499
500 /*
501 * Simply passthrough the capabilities of the host cpu for now.
502 */
503 rv = false;
504 switch (cap) {
505 case VCC_NO_EXECUTE:
506 if (amd_feature & AMDID_NX)
507 rv = true;
508 break;
509 case VCC_FFXSR:
510 if (amd_feature & AMDID_FFXSR)
511 rv = true;
512 break;
513 case VCC_TCE:
514 if (amd_feature2 & AMDID2_TCE)
515 rv = true;
516 break;
517 default:
518 panic("%s: unknown vm_cpu_capability %d", __func__, cap);
519 }
520 return (rv);
521}