Пример #1
0
/**
  Allocate reset vector buffer.

  @param[in, out]  CpuMpData  The pointer to CPU MP Data structure.
**/
VOID
AllocateResetVector (
  IN OUT CPU_MP_DATA          *CpuMpData
  )
{
  UINTN           ApResetVectorSize;

  if (CpuMpData->WakeupBuffer == (UINTN) -1) {
    ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize +
                          sizeof (MP_CPU_EXCHANGE_INFO);

    CpuMpData->WakeupBuffer      = GetWakeupBuffer (ApResetVectorSize);
    CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)
                    (CpuMpData->WakeupBuffer + CpuMpData->AddressMap.RendezvousFunnelSize);
    BackupAndPrepareWakeupBuffer (CpuMpData);
  }

  if (CpuMpData->SaveRestoreFlag) {
    BackupAndPrepareWakeupBuffer (CpuMpData);
  }
}
Пример #2
0
/**
  Allocate reset vector buffer.

  @param[in, out]  CpuMpData  The pointer to CPU MP Data structure.
**/
VOID
AllocateResetVector (
  IN OUT CPU_MP_DATA          *CpuMpData
  )
{
  EFI_STATUS            Status;
  UINTN                 ApResetVectorSize;
  EFI_PHYSICAL_ADDRESS  StartAddress;

  if (CpuMpData->SaveRestoreFlag) {
    BackupAndPrepareWakeupBuffer (CpuMpData);
  } else {
    ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize +
                        sizeof (MP_CPU_EXCHANGE_INFO);

    StartAddress = BASE_1MB;
    Status = gBS->AllocatePages (
                    AllocateMaxAddress,
                    EfiACPIMemoryNVS,
                    EFI_SIZE_TO_PAGES (ApResetVectorSize),
                    &StartAddress
                    );
    ASSERT_EFI_ERROR (Status);

    CpuMpData->WakeupBuffer      = (UINTN) StartAddress;
    CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)
                  (CpuMpData->WakeupBuffer + CpuMpData->AddressMap.RendezvousFunnelSize);
    //
    // copy AP reset code in it
    //
    CopyMem (
      (VOID *) CpuMpData->WakeupBuffer,
      (VOID *) CpuMpData->AddressMap.RendezvousFunnelAddress,
      CpuMpData->AddressMap.RendezvousFunnelSize
      );
  }
}