/** @file | |
Fetch the Tdx info. | |
Copyright (c) 2021, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <Library/BaseLib.h> | |
#include <Library/DebugLib.h> | |
#include <IndustryStandard/Tdx.h> | |
#include <Uefi/UefiBaseType.h> | |
#include <Library/TdxLib.h> | |
#include <Library/BaseMemoryLib.h> | |
UINT64 mTdSharedPageMask = 0; | |
UINT32 mTdMaxVCpuNum = 0; | |
UINT32 mTdVCpuNum = 0; | |
BOOLEAN mTdDataReturned = FALSE; | |
/** | |
This function call TDCALL_TDINFO to get the TD_RETURN_DATA. | |
If the TDCALL is successful, populate below variables: | |
- mTdSharedPageMask | |
- mTdMaxVCpunum | |
- mTdVCpuNum | |
- mTdDataReturned | |
@return TRUE The TDCALL is successful and above variables are populated. | |
@return FALSE The TDCALL is failed. Above variables are not set. | |
**/ | |
BOOLEAN | |
GetTdInfo ( | |
VOID | |
) | |
{ | |
UINT64 Status; | |
TD_RETURN_DATA TdReturnData; | |
UINT8 Gpaw; | |
Status = TdCall (TDCALL_TDINFO, 0, 0, 0, &TdReturnData); | |
if (Status == TDX_EXIT_REASON_SUCCESS) { | |
Gpaw = (UINT8)(TdReturnData.TdInfo.Gpaw & 0x3f); | |
mTdSharedPageMask = 1ULL << (Gpaw - 1); | |
mTdMaxVCpuNum = TdReturnData.TdInfo.MaxVcpus; | |
mTdVCpuNum = TdReturnData.TdInfo.NumVcpus; | |
mTdDataReturned = TRUE; | |
} else { | |
DEBUG ((DEBUG_ERROR, "Failed call TDCALL_TDINFO. %llx\n", Status)); | |
mTdDataReturned = FALSE; | |
} | |
return mTdDataReturned; | |
} | |
/** | |
This function gets the Td guest shared page mask. | |
The guest indicates if a page is shared using the Guest Physical Address | |
(GPA) Shared (S) bit. If the GPA Width(GPAW) is 48, the S-bit is bit-47. | |
If the GPAW is 52, the S-bit is bit-51. | |
@return Shared page bit mask | |
**/ | |
UINT64 | |
EFIAPI | |
TdSharedPageMask ( | |
VOID | |
) | |
{ | |
if (mTdDataReturned) { | |
return mTdSharedPageMask; | |
} | |
return GetTdInfo () ? mTdSharedPageMask : 0; | |
} | |
/** | |
This function gets the maximum number of Virtual CPUs that are usable for | |
Td Guest. | |
@return maximum Virtual CPUs number | |
**/ | |
UINT32 | |
EFIAPI | |
TdMaxVCpuNum ( | |
VOID | |
) | |
{ | |
if (mTdDataReturned) { | |
return mTdMaxVCpuNum; | |
} | |
return GetTdInfo () ? mTdMaxVCpuNum : 0; | |
} | |
/** | |
This function gets the number of Virtual CPUs that are usable for Td | |
Guest. | |
@return Virtual CPUs number | |
**/ | |
UINT32 | |
EFIAPI | |
TdVCpuNum ( | |
VOID | |
) | |
{ | |
if (mTdDataReturned) { | |
return mTdVCpuNum; | |
} | |
return GetTdInfo () ? mTdVCpuNum : 0; | |
} |