hv:Change structure boot_cpu_data to static

-- Change boot_cpu_data to static, only used in cpu_caps.c,
-- Add get_cpu_info() api, it will call this api instead of
   boot_cpu_data except cpu_caps.c

Tracked-On: #1842
Signed-off-by: Mingqiang Chi <mingqiang.chi@intel.com>
Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com>
This commit is contained in:
Mingqiang Chi 2019-01-03 10:24:21 +08:00 committed by wenlingz
parent 7c4dd0d277
commit 09ff94fc49
8 changed files with 26 additions and 15 deletions

View File

@ -163,7 +163,7 @@ void init_cpu_post(uint16_t pcpu_id)
pr_acrnlog("API version %u.%u", pr_acrnlog("API version %u.%u",
HV_API_MAJOR_VERSION, HV_API_MINOR_VERSION); HV_API_MAJOR_VERSION, HV_API_MINOR_VERSION);
pr_acrnlog("Detect processor: %s", boot_cpu_data.model_name); pr_acrnlog("Detect processor: %s", (get_cpu_info())->model_name);
pr_dbg("Core %hu is up", BOOT_CPU_ID); pr_dbg("Core %hu is up", BOOT_CPU_ID);
@ -393,6 +393,7 @@ void wait_sync_change(uint64_t *sync, uint64_t wake_sync)
static void cpu_xsave_init(void) static void cpu_xsave_init(void)
{ {
uint64_t val64; uint64_t val64;
struct cpuinfo_x86 *cpu_info;
if (cpu_has_cap(X86_FEATURE_XSAVE)) { if (cpu_has_cap(X86_FEATURE_XSAVE)) {
CPU_CR_READ(cr4, &val64); CPU_CR_READ(cr4, &val64);
@ -405,8 +406,8 @@ static void cpu_xsave_init(void)
/* if set, update it */ /* if set, update it */
if ((ecx & CPUID_ECX_OSXSAVE) != 0U) { if ((ecx & CPUID_ECX_OSXSAVE) != 0U) {
boot_cpu_data.cpuid_leaves[FEAT_1_ECX] |= cpu_info = get_cpu_info();
CPUID_ECX_OSXSAVE; cpu_info->cpuid_leaves[FEAT_1_ECX] |= CPUID_ECX_OSXSAVE;
} }
} }
} }

View File

@ -34,7 +34,7 @@ static struct cpu_capability {
uint32_t vmx_vpid; uint32_t vmx_vpid;
} cpu_caps; } cpu_caps;
struct cpuinfo_x86 boot_cpu_data; static struct cpuinfo_x86 boot_cpu_data;
bool cpu_has_cap(uint32_t bit) bool cpu_has_cap(uint32_t bit)
{ {
@ -417,3 +417,8 @@ int32_t detect_hardware_support(void)
return ret; return ret;
} }
struct cpuinfo_x86 *get_cpu_info(void)
{
return &boot_cpu_data;
}

View File

@ -131,10 +131,11 @@ void load_cpu_state_data(void)
{ {
int32_t tbl_idx; int32_t tbl_idx;
const struct cpu_state_info *state_info; const struct cpu_state_info *state_info;
struct cpuinfo_x86 *cpu_info = get_cpu_info();
(void)memset(&cpu_pm_state_info, 0U, sizeof(struct cpu_state_info)); (void)memset(&cpu_pm_state_info, 0U, sizeof(struct cpu_state_info));
tbl_idx = get_state_tbl_idx(boot_cpu_data.model_name); tbl_idx = get_state_tbl_idx(cpu_info->model_name);
if (tbl_idx >= 0) { if (tbl_idx >= 0) {
/* The state table is found. */ /* The state table is found. */

View File

@ -97,6 +97,8 @@ static inline int32_t set_vcpuid_entry(struct acrn_vm *vm,
static void init_vcpuid_entry(uint32_t leaf, uint32_t subleaf, static void init_vcpuid_entry(uint32_t leaf, uint32_t subleaf,
uint32_t flags, struct vcpuid_entry *entry) uint32_t flags, struct vcpuid_entry *entry)
{ {
struct cpuinfo_x86 *cpu_info;
entry->leaf = leaf; entry->leaf = leaf;
entry->subleaf = subleaf; entry->subleaf = subleaf;
entry->flags = flags; entry->flags = flags;
@ -123,7 +125,8 @@ static void init_vcpuid_entry(uint32_t leaf, uint32_t subleaf,
break; break;
case 0x16U: case 0x16U:
if (boot_cpu_data.cpuid_level >= 0x16U) { cpu_info = get_cpu_info();
if (cpu_info->cpuid_level >= 0x16U) {
/* call the cpuid when 0x16 is supported */ /* call the cpuid when 0x16 is supported */
cpuid_subleaf(leaf, subleaf, &entry->eax, &entry->ebx, &entry->ecx, &entry->edx); cpuid_subleaf(leaf, subleaf, &entry->eax, &entry->ebx, &entry->ecx, &entry->edx);
} else { } else {
@ -185,9 +188,10 @@ int32_t set_vcpuid_entries(struct acrn_vm *vm)
struct vcpuid_entry entry; struct vcpuid_entry entry;
uint32_t limit; uint32_t limit;
uint32_t i, j; uint32_t i, j;
struct cpuinfo_x86 *cpu_info = get_cpu_info();
init_vcpuid_entry(0U, 0U, 0U, &entry); init_vcpuid_entry(0U, 0U, 0U, &entry);
if (boot_cpu_data.cpuid_level < 0x16U) { if (cpu_info->cpuid_level < 0x16U) {
/* The cpuid with zero leaf returns the max level. Emulate that the 0x16U is supported */ /* The cpuid with zero leaf returns the max level. Emulate that the 0x16U is supported */
entry.eax = 0x16U; entry.eax = 0x16U;
} }

View File

@ -196,6 +196,7 @@ send_startup_ipi(enum intr_cpu_startup_shorthand cpu_startup_shorthand,
{ {
union apic_icr icr; union apic_icr icr;
uint8_t shorthand; uint8_t shorthand;
struct cpuinfo_x86 *cpu_info = get_cpu_info();
icr.value = 0U; icr.value = 0U;
icr.bits.destination_mode = INTR_LAPIC_ICR_PHYSICAL; icr.bits.destination_mode = INTR_LAPIC_ICR_PHYSICAL;
@ -218,7 +219,7 @@ send_startup_ipi(enum intr_cpu_startup_shorthand cpu_startup_shorthand,
/* Give 10ms for INIT sequence to complete for old processors. /* Give 10ms for INIT sequence to complete for old processors.
* Modern processors (family == 6) don't need to wait here. * Modern processors (family == 6) don't need to wait here.
*/ */
if (boot_cpu_data.family != 6U) { if (cpu_info->family != 6U) {
/* delay 10ms */ /* delay 10ms */
udelay(10000U); udelay(10000U);
} }
@ -234,7 +235,7 @@ send_startup_ipi(enum intr_cpu_startup_shorthand cpu_startup_shorthand,
icr.bits.vector = (uint8_t)(cpu_startup_start_address >> 12U); icr.bits.vector = (uint8_t)(cpu_startup_start_address >> 12U);
msr_write(MSR_IA32_EXT_APIC_ICR, icr.value); msr_write(MSR_IA32_EXT_APIC_ICR, icr.value);
if (boot_cpu_data.family == 6U) { if (cpu_info->family == 6U) {
udelay(10U); /* 10us is enough for Modern processors */ udelay(10U); /* 10us is enough for Modern processors */
} else { } else {
udelay(200U); /* 200us for old processors */ udelay(200U); /* 200us for old processors */

View File

@ -245,8 +245,9 @@ static uint64_t pit_calibrate_tsc(uint32_t cal_ms_arg)
static uint64_t native_calibrate_tsc(void) static uint64_t native_calibrate_tsc(void)
{ {
uint64_t tsc_hz = 0UL; uint64_t tsc_hz = 0UL;
struct cpuinfo_x86 *cpu_info = get_cpu_info();
if (boot_cpu_data.cpuid_level >= 0x15U) { if (cpu_info->cpuid_level >= 0x15U) {
uint32_t eax_denominator, ebx_numerator, ecx_hz, reserved; uint32_t eax_denominator, ebx_numerator, ecx_hz, reserved;
cpuid(0x15U, &eax_denominator, &ebx_numerator, cpuid(0x15U, &eax_denominator, &ebx_numerator,
@ -258,7 +259,7 @@ static uint64_t native_calibrate_tsc(void)
} }
} }
if ((tsc_hz == 0UL) && (boot_cpu_data.cpuid_level >= 0x16U)) { if ((tsc_hz == 0UL) && (cpu_info->cpuid_level >= 0x16U)) {
uint32_t eax_base_mhz, ebx_max_mhz, ecx_bus_mhz, edx; uint32_t eax_base_mhz, ebx_max_mhz, ecx_bus_mhz, edx;
cpuid(0x16U, &eax_base_mhz, &ebx_max_mhz, &ecx_bus_mhz, &edx); cpuid(0x16U, &eax_base_mhz, &ebx_max_mhz, &ecx_bus_mhz, &edx);
tsc_hz = (uint64_t) eax_base_mhz * 1000000U; tsc_hz = (uint64_t) eax_base_mhz * 1000000U;

View File

@ -36,8 +36,6 @@ struct cpuinfo_x86 {
char model_name[64]; char model_name[64];
}; };
extern struct cpuinfo_x86 boot_cpu_data;
bool has_monitor_cap(void); bool has_monitor_cap(void);
bool is_apicv_reg_virtualization_supported(void); bool is_apicv_reg_virtualization_supported(void);
bool is_apicv_intr_delivery_supported(void); bool is_apicv_intr_delivery_supported(void);
@ -50,5 +48,6 @@ void init_cpu_model_name(void);
bool check_cpu_security_cap(void); bool check_cpu_security_cap(void);
void cpu_l1d_flush(void); void cpu_l1d_flush(void);
int detect_hardware_support(void); int detect_hardware_support(void);
struct cpuinfo_x86 *get_cpu_info(void);
#endif /* CPUINFO_H */ #endif /* CPUINFO_H */

View File

@ -51,8 +51,7 @@
#define CACHE_LINE_SIZE 64U #define CACHE_LINE_SIZE 64U
/* IA32E Paging constants */ /* IA32E Paging constants */
#define IA32E_REF_MASK \ #define IA32E_REF_MASK ((get_cpu_info())->physical_address_mask)
(boot_cpu_data.physical_address_mask)
extern uint8_t ld_text_end; extern uint8_t ld_text_end;