mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-21 16:57:20 +00:00
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:
@@ -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_ */
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user