mirror of https://github.com/acidanthera/audk.git
116 lines
2.5 KiB
C
116 lines
2.5 KiB
C
/** @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;
|
|
}
|