cpuid restruct

Generate all common virtual cpuid entries for flexible support of
guest VCPUID emulation, by decoupling from PCPUID.

Signed-off-by: Li, Fei1 <fei1.li@intel.com>
Acked-by: Xu, Anthony <anthony.xu@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
Acked-by: Chen, Jason CJ <jason.cj.chen@intel.com>
This commit is contained in:
Li, Fei1
2018-03-23 03:05:50 +08:00
committed by Jack Ren
parent cb59bfaff0
commit 6c1122f869
6 changed files with 337 additions and 164 deletions

View File

@@ -115,38 +115,39 @@
#define CPUID_EXTEND_FEATURE 7
#define CPUID_EXTEND_FUNCTION_1 0x80000001
enum cpuid_cache_idx {
CPUID_VENDORSTRING_CACHE_IDX = 0,
CPUID_FEATURES_CACHE_IDX,
CPUID_EXTEND_FEATURE_CACHE_IDX,
CPUID_EXTEND_FEATURE_CACHE_MAX
};
struct cpuid_cache_entry {
uint32_t a;
uint32_t b;
uint32_t c;
uint32_t d;
uint32_t inited;
uint32_t reserved;
};
static inline void native_cpuid_count(uint32_t op, uint32_t count,
uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d)
static inline void __cpuid(uint32_t *eax, uint32_t *ebx,
uint32_t *ecx, uint32_t *edx)
{
/* Execute CPUID instruction and save results */
asm volatile("cpuid":"=a"(*a), "=b"(*b),
"=c"(*c), "=d"(*d)
: "a"(op), "c" (count));
asm volatile("cpuid":"=a"(*eax), "=b"(*ebx),
"=c"(*ecx), "=d"(*edx)
: "0" (*eax), "2" (*ecx)
: "memory");
}
void cpuid_count(uint32_t op, uint32_t count,
uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d);
static inline void cpuid(uint32_t leaf,
uint32_t *eax, uint32_t *ebx,
uint32_t *ecx, uint32_t *edx)
{
*eax = leaf;
*ecx = 0;
#define cpuid(op, a, b, c, d) cpuid_count(op, 0, a, b, c, d)
__cpuid(eax, ebx, ecx, edx);
}
void emulate_cpuid(struct vcpu *vcpu, uint32_t src_op, uint32_t *eax_ptr,
uint32_t *ebx_ptr, uint32_t *ecx_ptr, uint32_t *edx_ptr);
static inline void cpuid_subleaf(uint32_t leaf, uint32_t subleaf,
uint32_t *eax, uint32_t *ebx,
uint32_t *ecx, uint32_t *edx)
{
*eax = leaf;
*ecx = subleaf;
__cpuid(eax, ebx, ecx, edx);
}
int set_vcpuid_entries(struct vm *vm);
void guest_cpuid(struct vcpu *vcpu,
uint32_t *eax, uint32_t *ebx,
uint32_t *ecx, uint32_t *edx);
#endif /* CPUID_H_ */

View File

@@ -39,7 +39,7 @@ enum vm_privilege_level {
#define MAX_VM_NAME_LEN 16
struct vm_attr {
char name[16]; /* Virtual machine name string */
char name[MAX_VM_NAME_LEN]; /* Virtual machine name string */
int id; /* Virtual machine identifier */
int boot_idx; /* Index indicating the boot sequence for this VM */
};
@@ -134,6 +134,19 @@ struct vm_arch {
/* reference to virtual platform to come here (as needed) */
};
#define CPUID_CHECK_SUBLEAF (1 << 0)
#define MAX_VM_VCPUID_ENTRIES 64
struct vcpuid_entry {
uint32_t eax;
uint32_t ebx;
uint32_t ecx;
uint32_t edx;
uint32_t leaf;
uint32_t subleaf;
uint32_t flags;
uint32_t padding;
};
struct vpic;
struct vm {
struct vm_attr attr; /* Reference to this VM's attributes */
@@ -167,6 +180,9 @@ struct vm {
unsigned char GUID[16];
struct secure_world_control sworld_control;
uint32_t vcpuid_entry_nr, vcpuid_level, vcpuid_xlevel;
struct vcpuid_entry vcpuid_entries[MAX_VM_VCPUID_ENTRIES];
};
struct vm_description {