/** @file Fetch the Tdx info. Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include 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; }