Skip to content

Commit

Permalink
HV: Remove the check pcpu active status when sending INIT
Browse files Browse the repository at this point in the history
Intel SDM Vol3 23.8 says:
  The INIT signal is blocked whenever a logical processor is in VMX root operation.
  It is not blocked in VMX nonroot operation. Instead, INITs cause VM exits

So, there is no side-effect to send INIT signal regardless of pcpu active status.

Tracked-On: projectacrn#2865
Signed-off-by: Kaige Fu <[email protected]>
Acked-by: Anthony Xu <[email protected]>
  • Loading branch information
KaigeFu authored and wenlingz committed Apr 3, 2019
1 parent f412d52 commit 9c5e169
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
16 changes: 8 additions & 8 deletions hypervisor/arch/x86/lapic.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,20 +271,20 @@ void send_single_ipi(uint16_t pcpu_id, uint32_t vector)

/**
* @pre pcpu_id < CONFIG_MAX_PCPU_NUM
* @pre target pCPU must be in active state
*
* @return None
*/
void send_single_init(uint16_t pcpu_id)
{
union apic_icr icr;

if (is_pcpu_active(pcpu_id)) {
icr.value_32.hi_32 = per_cpu(lapic_id, pcpu_id);
icr.value_32.lo_32 = (INTR_LAPIC_ICR_PHYSICAL << 11U) | (INTR_LAPIC_ICR_INIT << 8U);
/*
* Intel SDM Vol3 23.8:
* The INIT signal is blocked whenever a logical processor is in VMX root operation.
* It is not blocked in VMX nonroot operation. Instead, INITs cause VM exits
*/
icr.value_32.hi_32 = per_cpu(lapic_id, pcpu_id);
icr.value_32.lo_32 = (INTR_LAPIC_ICR_PHYSICAL << 11U) | (INTR_LAPIC_ICR_INIT << 8U);

msr_write(MSR_IA32_EXT_APIC_ICR, icr.value);
} else {
ASSERT(false, "pCPU%u not in active", pcpu_id);
}
msr_write(MSR_IA32_EXT_APIC_ICR, icr.value);
}
2 changes: 2 additions & 0 deletions hypervisor/include/arch/x86/lapic.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ void send_single_ipi(uint16_t pcpu_id, uint32_t vector);
* @brief Send an INIT signal to a single pCPU
*
* @param[in] pcpu_id The id of destination physical cpu
*
* @return None
*/
void send_single_init(uint16_t pcpu_id);

Expand Down

0 comments on commit 9c5e169

Please sign in to comment.