/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2011 NetApp, Inc.4* All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND16* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE17* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE18* ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE19* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL20* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS21* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)22* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT23* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY24* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF25* SUCH DAMAGE.26*/2728#ifndef _X86_H_29#define _X86_H_3031#define CPUID_0000_0000 (0x0)32#define CPUID_0000_0001 (0x1)33#define CPUID_0000_0002 (0x2)34#define CPUID_0000_0003 (0x3)35#define CPUID_0000_0004 (0x4)36#define CPUID_0000_0006 (0x6)37#define CPUID_0000_0007 (0x7)38#define CPUID_0000_000A (0xA)39#define CPUID_0000_000B (0xB)40#define CPUID_0000_000D (0xD)41#define CPUID_0000_000F (0xF)42#define CPUID_0000_0010 (0x10)43#define CPUID_0000_0015 (0x15)44#define CPUID_8000_0000 (0x80000000)45#define CPUID_8000_0001 (0x80000001)46#define CPUID_8000_0002 (0x80000002)47#define CPUID_8000_0003 (0x80000003)48#define CPUID_8000_0004 (0x80000004)49#define CPUID_8000_0006 (0x80000006)50#define CPUID_8000_0007 (0x80000007)51#define CPUID_8000_0008 (0x80000008)52#define CPUID_8000_001D (0x8000001D)53#define CPUID_8000_001E (0x8000001E)5455/*56* CPUID instruction Fn0000_0001:57*/58#define CPUID_0000_0001_APICID_MASK (0xff<<24)59#define CPUID_0000_0001_APICID_SHIFT 246061/*62* CPUID instruction Fn0000_0001 ECX63*/64#define CPUID_0000_0001_FEAT0_VMX (1<<5)6566int x86_emulate_cpuid(struct vcpu *vcpu, uint64_t *rax, uint64_t *rbx,67uint64_t *rcx, uint64_t *rdx);6869enum vm_cpuid_capability {70VCC_NONE,71VCC_NO_EXECUTE,72VCC_FFXSR,73VCC_TCE,74VCC_LAST75};7677/*78* Return 'true' if the capability 'cap' is enabled in this virtual cpu79* and 'false' otherwise.80*/81bool vm_cpuid_capability(struct vcpu *vcpu, enum vm_cpuid_capability);8283#define VMM_MTRR_VAR_MAX 1084#define VMM_MTRR_DEF_MASK \85(MTRR_DEF_ENABLE | MTRR_DEF_FIXED_ENABLE | MTRR_DEF_TYPE)86#define VMM_MTRR_PHYSBASE_MASK (MTRR_PHYSBASE_PHYSBASE | MTRR_PHYSBASE_TYPE)87#define VMM_MTRR_PHYSMASK_MASK (MTRR_PHYSMASK_PHYSMASK | MTRR_PHYSMASK_VALID)88struct vm_mtrr {89uint64_t def_type;90uint64_t fixed4k[8];91uint64_t fixed16k[2];92uint64_t fixed64k;93struct {94uint64_t base;95uint64_t mask;96} var[VMM_MTRR_VAR_MAX];97};9899int vm_rdmtrr(struct vm_mtrr *mtrr, u_int num, uint64_t *val);100int vm_wrmtrr(struct vm_mtrr *mtrr, u_int num, uint64_t val);101102#endif103104105