\r
Link = GetNextNode (&gSmmCpuPrivate->TokenList, Link);\r
}\r
+\r
+ //\r
+ // Reset the FirstFreeToken to the beginning of token list upon exiting SMI.\r
+ //\r
+ gSmmCpuPrivate->FirstFreeToken = GetFirstNode (&gSmmCpuPrivate->TokenList);\r
}\r
\r
/**\r
/**\r
Allocate buffer for the SPIN_LOCK and PROCEDURE_TOKEN.\r
\r
+ @return First token of the token buffer.\r
**/\r
-VOID\r
+LIST_ENTRY *\r
AllocateTokenBuffer (\r
VOID\r
)\r
{\r
UINTN SpinLockSize;\r
UINT32 TokenCountPerChunk;\r
- UINTN ProcTokenSize;\r
UINTN Index;\r
- PROCEDURE_TOKEN *ProcToken;\r
SPIN_LOCK *SpinLock;\r
UINT8 *SpinLockBuffer;\r
- UINT8 *ProcTokenBuffer;\r
+ PROCEDURE_TOKEN *ProcTokens;\r
\r
SpinLockSize = GetSpinLockProperties ();\r
- ProcTokenSize = sizeof (PROCEDURE_TOKEN);\r
\r
TokenCountPerChunk = FixedPcdGet32 (PcdCpuSmmMpTokenCountPerChunk);\r
ASSERT (TokenCountPerChunk != 0);\r
SpinLockBuffer = AllocatePool (SpinLockSize * TokenCountPerChunk);\r
ASSERT (SpinLockBuffer != NULL);\r
\r
- ProcTokenBuffer = AllocatePool (ProcTokenSize * TokenCountPerChunk);\r
- ASSERT (ProcTokenBuffer != NULL);\r
+ ProcTokens = AllocatePool (sizeof (PROCEDURE_TOKEN) * TokenCountPerChunk);\r
+ ASSERT (ProcTokens != NULL);\r
\r
for (Index = 0; Index < TokenCountPerChunk; Index++) {\r
SpinLock = (SPIN_LOCK *)(SpinLockBuffer + SpinLockSize * Index);\r
InitializeSpinLock (SpinLock);\r
\r
- ProcToken = (PROCEDURE_TOKEN *)(ProcTokenBuffer + ProcTokenSize * Index);\r
- ProcToken->Signature = PROCEDURE_TOKEN_SIGNATURE;\r
- ProcToken->SpinLock = SpinLock;\r
- ProcToken->Used = FALSE;\r
- ProcToken->RunningApCount = 0;\r
+ ProcTokens[Index].Signature = PROCEDURE_TOKEN_SIGNATURE;\r
+ ProcTokens[Index].SpinLock = SpinLock;\r
+ ProcTokens[Index].Used = FALSE;\r
+ ProcTokens[Index].RunningApCount = 0;\r
\r
- InsertTailList (&gSmmCpuPrivate->TokenList, &ProcToken->Link);\r
+ InsertTailList (&gSmmCpuPrivate->TokenList, &ProcTokens[Index].Link);\r
}\r
-}\r
\r
-/**\r
- Find first free token in the allocated token list.\r
-\r
- @retval return the first free PROCEDURE_TOKEN.\r
-\r
-**/\r
-PROCEDURE_TOKEN *\r
-FindFirstFreeToken (\r
- VOID\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- PROCEDURE_TOKEN *ProcToken;\r
-\r
- Link = GetFirstNode (&gSmmCpuPrivate->TokenList);\r
- while (!IsNull (&gSmmCpuPrivate->TokenList, Link)) {\r
- ProcToken = PROCEDURE_TOKEN_FROM_LINK (Link);\r
-\r
- if (!ProcToken->Used) {\r
- return ProcToken;\r
- }\r
-\r
- Link = GetNextNode (&gSmmCpuPrivate->TokenList, Link);\r
- }\r
-\r
- return NULL;\r
+ return &ProcTokens[0].Link;\r
}\r
\r
/**\r
{\r
PROCEDURE_TOKEN *NewToken;\r
\r
- NewToken = FindFirstFreeToken ();\r
- if (NewToken == NULL) {\r
- AllocateTokenBuffer ();\r
- NewToken = FindFirstFreeToken ();\r
+ //\r
+ // If FirstFreeToken meets the end of token list, enlarge the token list.\r
+ // Set FirstFreeToken to the first free token.\r
+ //\r
+ if (gSmmCpuPrivate->FirstFreeToken == &gSmmCpuPrivate->TokenList) {\r
+ gSmmCpuPrivate->FirstFreeToken = AllocateTokenBuffer ();\r
}\r
- ASSERT (NewToken != NULL);\r
+ NewToken = PROCEDURE_TOKEN_FROM_LINK (gSmmCpuPrivate->FirstFreeToken);\r
+ gSmmCpuPrivate->FirstFreeToken = GetNextNode (&gSmmCpuPrivate->TokenList, gSmmCpuPrivate->FirstFreeToken);\r
\r
NewToken->Used = TRUE;\r
NewToken->RunningApCount = RunningApsCount;\r
\r
InitializeListHead (&gSmmCpuPrivate->TokenList);\r
\r
- AllocateTokenBuffer ();\r
+ gSmmCpuPrivate->FirstFreeToken = AllocateTokenBuffer ();\r
}\r
\r
/**\r