We can know which CPU core (index) to trigger SMI as below.
EFI_STATUS
GetCpuCoreIndex (
OUT UINTN *CpuIndex
)
{
UINT8 Index;
EFI_STATUS Status;
EFI_SMM_SAVE_STATE_IO_INFO *IoInfomation;
Status = EFI_SUCCESS;
Status = mSmst->SmmAllocatePool (EfiRuntimeServicesData,
sizeof (EFI_SMM_SAVE_STATE_IO_INFO),
(VOID **) &IoInfomation);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Find the CPU that triggered the software SMI.
//
for (Index = 0; Index < mSmst->NumberOfCpus; Index++) {
Status = mSmmCpuSaveState->ReadSaveState (
mSmmCpuSaveState,
sizeof (IoInfo),
EFI_SMM_SAVE_STATE_REGISTER_IO,
Index,
IoInfomation);
if (Status == EFI_SUCCESS &&
(IoInfo->IoPort == (UINT16) mSwSmiCommandPort) &&
* (UINT8*) IoInfo->IoData == (UINT8) mSmbiosPnpSwSmiValue) {
*CpuIndex = Index;
break;
}
}
mSmst->SmmFreePool (IoInfo);
if (EFI_ERROR (Status)) {
return Status;
}
if (i == mSmst->NumberOfCpus) {
return EFI_NOT_FOUND;
} else {
return EFI_SUCCESS;
}
} // GetCpuCoreIndex
No comments:
Post a Comment