TianoCore EDK2 master
Loading...
Searching...
No Matches
SmiHandlerProfile.c
Go to the documentation of this file.
1
10#include <PiSmm.h>
11#include <Library/BaseLib.h>
16#include <Library/DebugLib.h>
17#include <Library/PrintLib.h>
18#include <Library/UefiLib.h>
22#include <Protocol/SmmAccess2.h>
25
27
28#include "PiSmmCore.h"
29
30#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
31 ((ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1)))
32
33typedef struct {
34 EFI_GUID FileGuid;
35 PHYSICAL_ADDRESS EntryPoint;
36 PHYSICAL_ADDRESS ImageBase;
37 UINT64 ImageSize;
38 UINT32 ImageRef;
39 UINT16 PdbStringSize;
40 CHAR8 *PdbString;
42
46VOID
48 VOID
49 );
50
54VOID
56 VOID
57 );
58
76RETURN_STATUS
78 IN VOID *Pe32Data,
79 OUT VOID **EntryPoint
80 );
81
82extern LIST_ENTRY mSmiEntryList;
83extern LIST_ENTRY mHardwareSmiEntryList;
84extern SMI_ENTRY mRootSmiEntry;
85
86extern SMI_HANDLER_PROFILE_PROTOCOL mSmiHandlerProfile;
87
88GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY mHardwareSmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mHardwareSmiEntryList);
89
90GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY mRootSmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mRootSmiEntryList);
91
92GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY *mSmmCoreRootSmiEntryList = &mRootSmiEntryList;
93GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY *mSmmCoreSmiEntryList = &mSmiEntryList;
94GLOBAL_REMOVE_IF_UNREFERENCED LIST_ENTRY *mSmmCoreHardwareSmiEntryList = &mHardwareSmiEntryList;
95
97GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mImageStructCountMax;
98GLOBAL_REMOVE_IF_UNREFERENCED UINT32 mImageStructCount;
99
100GLOBAL_REMOVE_IF_UNREFERENCED VOID *mSmiHandlerProfileDatabase;
101GLOBAL_REMOVE_IF_UNREFERENCED UINTN mSmiHandlerProfileDatabaseSize;
102
103GLOBAL_REMOVE_IF_UNREFERENCED UINTN mSmmImageDatabaseSize;
104GLOBAL_REMOVE_IF_UNREFERENCED UINTN mSmmRootSmiDatabaseSize;
105GLOBAL_REMOVE_IF_UNREFERENCED UINTN mSmmSmiDatabaseSize;
106GLOBAL_REMOVE_IF_UNREFERENCED UINTN mSmmHardwareSmiDatabaseSize;
107
108GLOBAL_REMOVE_IF_UNREFERENCED BOOLEAN mSmiHandlerProfileRecordingStatus;
109
113};
114
121VOID
123 IN UINT8 *Data,
124 IN UINTN Size
125 )
126{
127 UINTN Index;
128
129 for (Index = 0; Index < Size; Index++) {
130 DEBUG ((DEBUG_INFO, "%02x ", (UINTN)Data[Index]));
131 }
132}
133
140VOID
142 IN EFI_LOADED_IMAGE_PROTOCOL *LoadedImage,
143 OUT EFI_GUID *Guid
144 )
145{
146 EFI_GUID *FileName;
147
148 FileName = NULL;
149 if ((DevicePathType (LoadedImage->FilePath) == MEDIA_DEVICE_PATH) &&
150 (DevicePathSubType (LoadedImage->FilePath) == MEDIA_PIWG_FW_FILE_DP))
151 {
152 FileName = &((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)LoadedImage->FilePath)->FvFileName;
153 }
154
155 if (FileName != NULL) {
156 CopyGuid (Guid, FileName);
157 } else {
158 ZeroMem (Guid, sizeof (EFI_GUID));
159 }
160}
161
171VOID
173 IN PHYSICAL_ADDRESS ImageBase,
174 IN UINT64 ImageSize,
175 IN PHYSICAL_ADDRESS EntryPoint,
176 IN EFI_GUID *Guid,
177 IN CHAR8 *PdbString
178 )
179{
180 UINTN PdbStringSize;
181
182 if (mImageStructCount >= mImageStructCountMax) {
183 ASSERT (FALSE);
184 return;
185 }
186
187 CopyGuid (&mImageStruct[mImageStructCount].FileGuid, Guid);
188 mImageStruct[mImageStructCount].ImageRef = mImageStructCount;
189 mImageStruct[mImageStructCount].ImageBase = ImageBase;
190 mImageStruct[mImageStructCount].ImageSize = ImageSize;
191 mImageStruct[mImageStructCount].EntryPoint = EntryPoint;
192 if (PdbString != NULL) {
193 PdbStringSize = AsciiStrSize (PdbString);
194 mImageStruct[mImageStructCount].PdbString = AllocateCopyPool (PdbStringSize, PdbString);
195 if (mImageStruct[mImageStructCount].PdbString != NULL) {
196 mImageStruct[mImageStructCount].PdbStringSize = (UINT16)PdbStringSize;
197 }
198 }
199
200 mImageStructCount++;
201}
202
212 IN UINTN Address
213 )
214{
215 UINTN Index;
216
217 for (Index = 0; Index < mImageStructCount; Index++) {
218 if ((Address >= mImageStruct[Index].ImageBase) &&
219 (Address < mImageStruct[Index].ImageBase + mImageStruct[Index].ImageSize))
220 {
221 return &mImageStruct[Index];
222 }
223 }
224
225 return NULL;
226}
227
235UINT32
237 IN UINTN Address
238 )
239{
240 IMAGE_STRUCT *ImageStruct;
241
242 ImageStruct = AddressToImageStruct (Address);
243 if (ImageStruct != NULL) {
244 return ImageStruct->ImageRef;
245 }
246
247 return (UINT32)-1;
248}
249
253VOID
255 VOID
256 )
257{
258 EFI_STATUS Status;
259 UINTN NoHandles;
260 UINTN HandleBufferSize;
261 EFI_HANDLE *HandleBuffer;
262 UINTN Index;
263 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
264 CHAR16 *PathStr;
265 EFI_SMM_DRIVER_ENTRY *LoadedImagePrivate;
266 PHYSICAL_ADDRESS EntryPoint;
267 VOID *EntryPointInImage;
268 EFI_GUID Guid;
269 CHAR8 *PdbString;
270 PHYSICAL_ADDRESS RealImageBase;
271
272 HandleBufferSize = 0;
273 HandleBuffer = NULL;
274 Status = gSmst->SmmLocateHandle (
276 &gEfiLoadedImageProtocolGuid,
277 NULL,
278 &HandleBufferSize,
279 HandleBuffer
280 );
281 if (Status != EFI_BUFFER_TOO_SMALL) {
282 return;
283 }
284
285 HandleBuffer = AllocateZeroPool (HandleBufferSize);
286 if (HandleBuffer == NULL) {
287 return;
288 }
289
290 Status = gSmst->SmmLocateHandle (
292 &gEfiLoadedImageProtocolGuid,
293 NULL,
294 &HandleBufferSize,
295 HandleBuffer
296 );
297 if (EFI_ERROR (Status)) {
298 return;
299 }
300
301 NoHandles = HandleBufferSize/sizeof (EFI_HANDLE);
302 mImageStructCountMax = (UINT32)NoHandles;
303 mImageStruct = AllocateZeroPool (mImageStructCountMax * sizeof (IMAGE_STRUCT));
304 if (mImageStruct == NULL) {
305 goto Done;
306 }
307
308 for (Index = 0; Index < NoHandles; Index++) {
309 Status = gSmst->SmmHandleProtocol (
310 HandleBuffer[Index],
311 &gEfiLoadedImageProtocolGuid,
312 (VOID **)&LoadedImage
313 );
314 if (EFI_ERROR (Status)) {
315 continue;
316 }
317
318 PathStr = ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE);
319 GetDriverGuid (LoadedImage, &Guid);
320 DEBUG ((DEBUG_INFO, "Image: %g ", &Guid));
321
322 EntryPoint = 0;
323 LoadedImagePrivate = BASE_CR (LoadedImage, EFI_SMM_DRIVER_ENTRY, SmmLoadedImage);
324 RealImageBase = (UINTN)LoadedImage->ImageBase;
325 if (LoadedImagePrivate->Signature == EFI_SMM_DRIVER_ENTRY_SIGNATURE) {
326 EntryPoint = LoadedImagePrivate->ImageEntryPoint;
327 if ((EntryPoint != 0) && ((EntryPoint < (UINTN)LoadedImage->ImageBase) || (EntryPoint >= ((UINTN)LoadedImage->ImageBase + LoadedImage->ImageSize)))) {
328 //
329 // If the EntryPoint is not in the range of image buffer, it should come from emulation environment.
330 // So patch ImageBuffer here to align the EntryPoint.
331 //
332 Status = InternalPeCoffGetEntryPoint (LoadedImage->ImageBase, &EntryPointInImage);
333 ASSERT_EFI_ERROR (Status);
334 RealImageBase = (UINTN)LoadedImage->ImageBase + EntryPoint - (UINTN)EntryPointInImage;
335 }
336 }
337
338 DEBUG ((DEBUG_INFO, "(0x%lx - 0x%lx", RealImageBase, LoadedImage->ImageSize));
339 if (EntryPoint != 0) {
340 DEBUG ((DEBUG_INFO, ", EntryPoint:0x%lx", EntryPoint));
341 }
342
343 DEBUG ((DEBUG_INFO, ")\n"));
344
345 if (RealImageBase != 0) {
346 PdbString = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)RealImageBase);
347 if (PdbString != NULL) {
348 DEBUG ((DEBUG_INFO, " pdb - %a\n", PdbString));
349 }
350 } else {
351 PdbString = NULL;
352 }
353
354 DEBUG ((DEBUG_INFO, " (%s)\n", PathStr));
355
356 AddImageStruct (RealImageBase, LoadedImage->ImageSize, EntryPoint, &Guid, PdbString);
357 }
358
359Done:
360 FreePool (HandleBuffer);
361 return;
362}
363
371VOID
373 IN EFI_GUID *HandlerType,
374 IN VOID *Context,
375 IN UINTN ContextSize
376 )
377{
378 CHAR16 *Str;
379
380 if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {
381 DEBUG ((DEBUG_INFO, " SwSmi - 0x%lx\n", ((SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue));
382 } else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) {
383 DEBUG ((DEBUG_INFO, " SxType - 0x%x\n", ((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));
384 DEBUG ((DEBUG_INFO, " SxPhase - 0x%x\n", ((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase));
385 } else if (CompareGuid (HandlerType, &gEfiSmmPowerButtonDispatch2ProtocolGuid)) {
386 DEBUG ((DEBUG_INFO, " PowerButtonPhase - 0x%x\n", ((EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT *)Context)->Phase));
387 } else if (CompareGuid (HandlerType, &gEfiSmmStandbyButtonDispatch2ProtocolGuid)) {
388 DEBUG ((DEBUG_INFO, " StandbyButtonPhase - 0x%x\n", ((EFI_SMM_STANDBY_BUTTON_REGISTER_CONTEXT *)Context)->Phase));
389 } else if (CompareGuid (HandlerType, &gEfiSmmPeriodicTimerDispatch2ProtocolGuid)) {
390 DEBUG ((DEBUG_INFO, " PeriodicTimerPeriod - %ld\n", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->Period));
391 DEBUG ((DEBUG_INFO, " PeriodicTimerSmiTickInterval - %ld\n", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->SmiTickInterval));
392 } else if (CompareGuid (HandlerType, &gEfiSmmGpiDispatch2ProtocolGuid)) {
393 DEBUG ((DEBUG_INFO, " GpiNum - 0x%lx\n", ((EFI_SMM_GPI_REGISTER_CONTEXT *)Context)->GpiNum));
394 } else if (CompareGuid (HandlerType, &gEfiSmmIoTrapDispatch2ProtocolGuid)) {
395 DEBUG ((DEBUG_INFO, " IoTrapAddress - 0x%x\n", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Address));
396 DEBUG ((DEBUG_INFO, " IoTrapLength - 0x%x\n", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Length));
397 DEBUG ((DEBUG_INFO, " IoTrapType - 0x%x\n", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Type));
398 } else if (CompareGuid (HandlerType, &gEfiSmmUsbDispatch2ProtocolGuid)) {
399 DEBUG ((DEBUG_INFO, " UsbType - 0x%x\n", ((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context)->Type));
401 DEBUG ((DEBUG_INFO, " UsbDevicePath - %s\n", Str));
402 if (Str != NULL) {
403 FreePool (Str);
404 }
405 } else {
406 DEBUG ((DEBUG_INFO, " Context - "));
407 InternalDumpData (Context, ContextSize);
408 DEBUG ((DEBUG_INFO, "\n"));
409 }
410}
411
417VOID
419 IN SMI_ENTRY *SmiEntry
420 )
421{
422 LIST_ENTRY *ListEntry;
423 SMI_HANDLER *SmiHandler;
424 IMAGE_STRUCT *ImageStruct;
425
426 ListEntry = &SmiEntry->SmiHandlers;
427 for (ListEntry = ListEntry->ForwardLink;
428 ListEntry != &SmiEntry->SmiHandlers;
429 ListEntry = ListEntry->ForwardLink)
430 {
431 SmiHandler = CR (ListEntry, SMI_HANDLER, Link, SMI_HANDLER_SIGNATURE);
432 ImageStruct = AddressToImageStruct ((UINTN)SmiHandler->Handler);
433 if (ImageStruct != NULL) {
434 DEBUG ((DEBUG_INFO, " Module - %g", &ImageStruct->FileGuid));
435 }
436
437 if ((ImageStruct != NULL) && (ImageStruct->PdbString[0] != 0)) {
438 DEBUG ((DEBUG_INFO, " (Pdb - %a)", ImageStruct->PdbString));
439 }
440
441 DEBUG ((DEBUG_INFO, "\n"));
442 if (SmiHandler->ContextSize != 0) {
443 DumpSmiChildContext (&SmiEntry->HandlerType, SmiHandler->Context, SmiHandler->ContextSize);
444 }
445
446 DEBUG ((DEBUG_INFO, " Handler - 0x%x", SmiHandler->Handler));
447 if (ImageStruct != NULL) {
448 DEBUG ((DEBUG_INFO, " <== RVA - 0x%x", (UINTN)SmiHandler->Handler - (UINTN)ImageStruct->ImageBase));
449 }
450
451 DEBUG ((DEBUG_INFO, "\n"));
452 DEBUG ((DEBUG_INFO, " CallerAddr - 0x%x", SmiHandler->CallerAddr));
453 if (ImageStruct != NULL) {
454 DEBUG ((DEBUG_INFO, " <== RVA - 0x%x", SmiHandler->CallerAddr - (UINTN)ImageStruct->ImageBase));
455 }
456
457 DEBUG ((DEBUG_INFO, "\n"));
458 }
459
460 return;
461}
462
468VOID
470 IN LIST_ENTRY *SmiEntryList
471 )
472{
473 LIST_ENTRY *ListEntry;
474 SMI_ENTRY *SmiEntry;
475
476 ListEntry = SmiEntryList;
477 for (ListEntry = ListEntry->ForwardLink;
478 ListEntry != SmiEntryList;
479 ListEntry = ListEntry->ForwardLink)
480 {
481 SmiEntry = CR (ListEntry, SMI_ENTRY, AllEntries, SMI_ENTRY_SIGNATURE);
482 DEBUG ((DEBUG_INFO, "SmiEntry - %g\n", &SmiEntry->HandlerType));
483 DumpSmiHandlerOnSmiEntry (SmiEntry);
484 }
485
486 return;
487}
488
502EFIAPI
504 IN CONST EFI_GUID *Protocol,
505 IN VOID *Interface,
506 IN EFI_HANDLE Handle
507 )
508{
510
511 //
512 // Dump all image
513 //
514 DEBUG ((DEBUG_INFO, "##################\n"));
515 DEBUG ((DEBUG_INFO, "# IMAGE DATABASE #\n"));
516 DEBUG ((DEBUG_INFO, "##################\n"));
518 DEBUG ((DEBUG_INFO, "\n"));
519
520 //
521 // Dump SMI Handler
522 //
523 DEBUG ((DEBUG_INFO, "########################\n"));
524 DEBUG ((DEBUG_INFO, "# SMI Handler DATABASE #\n"));
525 DEBUG ((DEBUG_INFO, "########################\n"));
526
527 DEBUG ((DEBUG_INFO, "# 1. ROOT SMI Handler #\n"));
528 DEBUG_CODE (
529 DumpSmiEntryList (mSmmCoreRootSmiEntryList);
530 );
531
532 DEBUG ((DEBUG_INFO, "# 2. GUID SMI Handler #\n"));
533 DEBUG_CODE (
534 DumpSmiEntryList (mSmmCoreSmiEntryList);
535 );
536
537 DEBUG ((DEBUG_INFO, "# 3. Hardware SMI Handler #\n"));
538 DEBUG_CODE (
539 DumpSmiEntryList (mSmmCoreHardwareSmiEntryList);
540 );
541
542 DEBUG ((DEBUG_INFO, "\n"));
543
545
546 if (mImageStruct != NULL) {
547 FreePool (mImageStruct);
548 }
549
550 return EFI_SUCCESS;
551}
552
558UINTN
560 VOID
561 )
562{
563 UINTN Size;
564 UINT32 Index;
565
566 Size = 0;
567 for (Index = 0; Index < mImageStructCount; Index++) {
568 Size += sizeof (SMM_CORE_IMAGE_DATABASE_STRUCTURE) + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof (UINT64));
569 }
570
571 return Size;
572}
573
581UINTN
583 IN SMI_ENTRY *SmiEntry
584 )
585{
586 LIST_ENTRY *ListEntry;
587 SMI_HANDLER *SmiHandler;
588 UINTN Size;
589
590 Size = 0;
591 ListEntry = &SmiEntry->SmiHandlers;
592 for (ListEntry = ListEntry->ForwardLink;
593 ListEntry != &SmiEntry->SmiHandlers;
594 ListEntry = ListEntry->ForwardLink)
595 {
596 SmiHandler = CR (ListEntry, SMI_HANDLER, Link, SMI_HANDLER_SIGNATURE);
597 Size += sizeof (SMM_CORE_SMI_HANDLER_STRUCTURE) + GET_OCCUPIED_SIZE (SmiHandler->ContextSize, sizeof (UINT64));
598 }
599
600 return Size;
601}
602
610UINTN
612 IN LIST_ENTRY *SmiEntryList
613 )
614{
615 LIST_ENTRY *ListEntry;
616 SMI_ENTRY *SmiEntry;
617 UINTN Size;
618
619 Size = 0;
620 ListEntry = SmiEntryList;
621 for (ListEntry = ListEntry->ForwardLink;
622 ListEntry != SmiEntryList;
623 ListEntry = ListEntry->ForwardLink)
624 {
625 SmiEntry = CR (ListEntry, SMI_ENTRY, AllEntries, SMI_ENTRY_SIGNATURE);
626 Size += sizeof (SMM_CORE_SMI_DATABASE_STRUCTURE);
627 Size += GetSmmSmiHandlerSizeOnSmiEntry (SmiEntry);
628 }
629
630 return Size;
631}
632
638UINTN
640 VOID
641 )
642{
643 mSmmImageDatabaseSize = GetSmmImageDatabaseSize ();
644 mSmmRootSmiDatabaseSize = GetSmmSmiDatabaseSize (mSmmCoreRootSmiEntryList);
645 mSmmSmiDatabaseSize = GetSmmSmiDatabaseSize (mSmmCoreSmiEntryList);
646 mSmmHardwareSmiDatabaseSize = GetSmmSmiDatabaseSize (mSmmCoreHardwareSmiEntryList);
647
648 return mSmmImageDatabaseSize + mSmmSmiDatabaseSize + mSmmRootSmiDatabaseSize + mSmmHardwareSmiDatabaseSize;
649}
650
659UINTN
661 IN OUT VOID *Data,
662 IN UINTN ExpectedSize
663 )
664{
666 UINTN Size;
667 UINTN Index;
668
669 ImageStruct = Data;
670 Size = 0;
671 for (Index = 0; Index < mImageStructCount; Index++) {
672 if (Size >= ExpectedSize) {
673 return 0;
674 }
675
676 if (sizeof (SMM_CORE_IMAGE_DATABASE_STRUCTURE) + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof (UINT64)) > ExpectedSize - Size) {
677 return 0;
678 }
679
680 ImageStruct->Header.Signature = SMM_CORE_IMAGE_DATABASE_SIGNATURE;
681 ImageStruct->Header.Length = (UINT32)(sizeof (SMM_CORE_IMAGE_DATABASE_STRUCTURE) + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof (UINT64)));
682 ImageStruct->Header.Revision = SMM_CORE_IMAGE_DATABASE_REVISION;
683 CopyGuid (&ImageStruct->FileGuid, &mImageStruct[Index].FileGuid);
684 ImageStruct->ImageRef = mImageStruct[Index].ImageRef;
685 ImageStruct->EntryPoint = mImageStruct[Index].EntryPoint;
686 ImageStruct->ImageBase = mImageStruct[Index].ImageBase;
687 ImageStruct->ImageSize = mImageStruct[Index].ImageSize;
688 if (mImageStruct[Index].PdbStringSize != 0) {
689 ImageStruct->PdbStringOffset = sizeof (SMM_CORE_IMAGE_DATABASE_STRUCTURE);
690 CopyMem ((VOID *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset), mImageStruct[Index].PdbString, mImageStruct[Index].PdbStringSize);
691 } else {
692 ImageStruct->PdbStringOffset = 0;
693 }
694
695 ImageStruct = (SMM_CORE_IMAGE_DATABASE_STRUCTURE *)((UINTN)ImageStruct + ImageStruct->Header.Length);
696 Size += sizeof (SMM_CORE_IMAGE_DATABASE_STRUCTURE) + GET_OCCUPIED_SIZE (mImageStruct[Index].PdbStringSize, sizeof (UINT64));
697 }
698
699 if (ExpectedSize != Size) {
700 return 0;
701 }
702
703 return Size;
704}
705
716UINTN
718 IN SMI_ENTRY *SmiEntry,
719 IN OUT VOID *Data,
720 IN UINTN MaxSize,
721 OUT UINT32 *Count
722 )
723{
724 SMM_CORE_SMI_HANDLER_STRUCTURE *SmiHandlerStruct;
725 LIST_ENTRY *ListEntry;
726 SMI_HANDLER *SmiHandler;
727 UINTN Size;
728
729 SmiHandlerStruct = Data;
730 Size = 0;
731 *Count = 0;
732 ListEntry = &SmiEntry->SmiHandlers;
733 for (ListEntry = ListEntry->ForwardLink;
734 ListEntry != &SmiEntry->SmiHandlers;
735 ListEntry = ListEntry->ForwardLink)
736 {
737 SmiHandler = CR (ListEntry, SMI_HANDLER, Link, SMI_HANDLER_SIGNATURE);
738 if (Size >= MaxSize) {
739 *Count = 0;
740 return 0;
741 }
742
743 if (sizeof (SMM_CORE_SMI_HANDLER_STRUCTURE) + GET_OCCUPIED_SIZE (SmiHandler->ContextSize, sizeof (UINT64)) > MaxSize - Size) {
744 *Count = 0;
745 return 0;
746 }
747
748 SmiHandlerStruct->Length = (UINT32)(sizeof (SMM_CORE_SMI_HANDLER_STRUCTURE) + GET_OCCUPIED_SIZE (SmiHandler->ContextSize, sizeof (UINT64)));
749 SmiHandlerStruct->CallerAddr = (UINTN)SmiHandler->CallerAddr;
750 SmiHandlerStruct->Handler = (UINTN)SmiHandler->Handler;
751 SmiHandlerStruct->ImageRef = AddressToImageRef ((UINTN)SmiHandler->Handler);
752 SmiHandlerStruct->ContextBufferSize = (UINT32)SmiHandler->ContextSize;
753 if (SmiHandler->ContextSize != 0) {
754 SmiHandlerStruct->ContextBufferOffset = sizeof (SMM_CORE_SMI_HANDLER_STRUCTURE);
755 CopyMem ((UINT8 *)SmiHandlerStruct + SmiHandlerStruct->ContextBufferOffset, SmiHandler->Context, SmiHandler->ContextSize);
756 } else {
757 SmiHandlerStruct->ContextBufferOffset = 0;
758 }
759
760 Size += sizeof (SMM_CORE_SMI_HANDLER_STRUCTURE) + GET_OCCUPIED_SIZE (SmiHandler->ContextSize, sizeof (UINT64));
761 SmiHandlerStruct = (SMM_CORE_SMI_HANDLER_STRUCTURE *)((UINTN)SmiHandlerStruct + SmiHandlerStruct->Length);
762 *Count = *Count + 1;
763 }
764
765 return Size;
766}
767
778UINTN
780 IN LIST_ENTRY *SmiEntryList,
781 IN UINT32 HandlerCategory,
782 IN OUT VOID *Data,
783 IN UINTN ExpectedSize
784 )
785{
787 LIST_ENTRY *ListEntry;
788 SMI_ENTRY *SmiEntry;
789 UINTN Size;
790 UINTN SmiHandlerSize;
791 UINT32 SmiHandlerCount;
792
793 SmiStruct = Data;
794 Size = 0;
795 ListEntry = SmiEntryList;
796 for (ListEntry = ListEntry->ForwardLink;
797 ListEntry != SmiEntryList;
798 ListEntry = ListEntry->ForwardLink)
799 {
800 SmiEntry = CR (ListEntry, SMI_ENTRY, AllEntries, SMI_ENTRY_SIGNATURE);
801 if (Size >= ExpectedSize) {
802 return 0;
803 }
804
805 if (sizeof (SMM_CORE_SMI_DATABASE_STRUCTURE) > ExpectedSize - Size) {
806 return 0;
807 }
808
809 SmiStruct->Header.Signature = SMM_CORE_SMI_DATABASE_SIGNATURE;
810 SmiStruct->Header.Length = sizeof (SMM_CORE_SMI_DATABASE_STRUCTURE);
811 SmiStruct->Header.Revision = SMM_CORE_SMI_DATABASE_REVISION;
812 SmiStruct->HandlerCategory = HandlerCategory;
813 CopyGuid (&SmiStruct->HandlerType, &SmiEntry->HandlerType);
814 Size += sizeof (SMM_CORE_SMI_DATABASE_STRUCTURE);
815 SmiHandlerSize = GetSmmSmiHandlerDataOnSmiEntry (SmiEntry, (UINT8 *)SmiStruct + SmiStruct->Header.Length, ExpectedSize - Size, &SmiHandlerCount);
816 SmiStruct->HandlerCount = SmiHandlerCount;
817 Size += SmiHandlerSize;
818 SmiStruct->Header.Length += (UINT32)SmiHandlerSize;
819 SmiStruct = (VOID *)((UINTN)SmiStruct + SmiStruct->Header.Length);
820 }
821
822 if (ExpectedSize != Size) {
823 return 0;
824 }
825
826 return Size;
827}
828
839 IN OUT VOID *Data
840 )
841{
842 UINTN SmmImageDatabaseSize;
843 UINTN SmmSmiDatabaseSize;
844 UINTN SmmRootSmiDatabaseSize;
845 UINTN SmmHardwareSmiDatabaseSize;
846
847 DEBUG ((DEBUG_VERBOSE, "GetSmiHandlerProfileDatabaseData\n"));
848 SmmImageDatabaseSize = GetSmmImageDatabaseData (Data, mSmmImageDatabaseSize);
849 if (SmmImageDatabaseSize != mSmmImageDatabaseSize) {
850 DEBUG ((DEBUG_ERROR, "GetSmiHandlerProfileDatabaseData - SmmImageDatabaseSize mismatch!\n"));
851 return EFI_INVALID_PARAMETER;
852 }
853
854 SmmRootSmiDatabaseSize = GetSmmSmiDatabaseData (mSmmCoreRootSmiEntryList, SmmCoreSmiHandlerCategoryRootHandler, (UINT8 *)Data + SmmImageDatabaseSize, mSmmRootSmiDatabaseSize);
855 if (SmmRootSmiDatabaseSize != mSmmRootSmiDatabaseSize) {
856 DEBUG ((DEBUG_ERROR, "GetSmiHandlerProfileDatabaseData - SmmRootSmiDatabaseSize mismatch!\n"));
857 return EFI_INVALID_PARAMETER;
858 }
859
860 SmmSmiDatabaseSize = GetSmmSmiDatabaseData (mSmmCoreSmiEntryList, SmmCoreSmiHandlerCategoryGuidHandler, (UINT8 *)Data + SmmImageDatabaseSize + mSmmRootSmiDatabaseSize, mSmmSmiDatabaseSize);
861 if (SmmSmiDatabaseSize != mSmmSmiDatabaseSize) {
862 DEBUG ((DEBUG_ERROR, "GetSmiHandlerProfileDatabaseData - SmmSmiDatabaseSize mismatch!\n"));
863 return EFI_INVALID_PARAMETER;
864 }
865
866 SmmHardwareSmiDatabaseSize = GetSmmSmiDatabaseData (mSmmCoreHardwareSmiEntryList, SmmCoreSmiHandlerCategoryHardwareHandler, (UINT8 *)Data + SmmImageDatabaseSize + SmmRootSmiDatabaseSize + SmmSmiDatabaseSize, mSmmHardwareSmiDatabaseSize);
867 if (SmmHardwareSmiDatabaseSize != mSmmHardwareSmiDatabaseSize) {
868 DEBUG ((DEBUG_ERROR, "GetSmiHandlerProfileDatabaseData - SmmHardwareSmiDatabaseSize mismatch!\n"));
869 return EFI_INVALID_PARAMETER;
870 }
871
872 return EFI_SUCCESS;
873}
874
878VOID
880 VOID
881 )
882{
883 EFI_STATUS Status;
884
885 mSmiHandlerProfileDatabaseSize = GetSmiHandlerProfileDatabaseSize ();
886 mSmiHandlerProfileDatabase = AllocatePool (mSmiHandlerProfileDatabaseSize);
887 if (mSmiHandlerProfileDatabase == NULL) {
888 return;
889 }
890
891 Status = GetSmiHandlerProfileDatabaseData (mSmiHandlerProfileDatabase);
892 if (EFI_ERROR (Status)) {
893 FreePool (mSmiHandlerProfileDatabase);
894 mSmiHandlerProfileDatabase = NULL;
895 }
896}
897
908VOID
910 OUT VOID *DataBuffer,
911 IN OUT UINT64 *DataSize,
912 IN OUT UINT64 *DataOffset
913 )
914{
915 if (*DataOffset >= mSmiHandlerProfileDatabaseSize) {
916 *DataOffset = mSmiHandlerProfileDatabaseSize;
917 return;
918 }
919
920 if (mSmiHandlerProfileDatabaseSize - *DataOffset < *DataSize) {
921 *DataSize = mSmiHandlerProfileDatabaseSize - *DataOffset;
922 }
923
924 CopyMem (
925 DataBuffer,
926 (UINT8 *)mSmiHandlerProfileDatabase + *DataOffset,
927 (UINTN)*DataSize
928 );
929 *DataOffset = *DataOffset + *DataSize;
930}
931
938VOID
940 IN SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *SmiHandlerProfileParameterGetInfo
941 )
942{
943 BOOLEAN SmiHandlerProfileRecordingStatus;
944
945 SmiHandlerProfileRecordingStatus = mSmiHandlerProfileRecordingStatus;
946 mSmiHandlerProfileRecordingStatus = FALSE;
947
948 SmiHandlerProfileParameterGetInfo->DataSize = mSmiHandlerProfileDatabaseSize;
949 SmiHandlerProfileParameterGetInfo->Header.ReturnStatus = 0;
950
951 mSmiHandlerProfileRecordingStatus = SmiHandlerProfileRecordingStatus;
952}
953
960VOID
962 IN SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *SmiHandlerProfileParameterGetDataByOffset
963 )
964{
965 SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET SmiHandlerProfileGetDataByOffset;
966 BOOLEAN SmiHandlerProfileRecordingStatus;
967
968 SmiHandlerProfileRecordingStatus = mSmiHandlerProfileRecordingStatus;
969 mSmiHandlerProfileRecordingStatus = FALSE;
970
971 CopyMem (&SmiHandlerProfileGetDataByOffset, SmiHandlerProfileParameterGetDataByOffset, sizeof (SmiHandlerProfileGetDataByOffset));
972
973 //
974 // Sanity check
975 //
976 if (!SmmIsBufferOutsideSmmValid ((UINTN)SmiHandlerProfileGetDataByOffset.DataBuffer, (UINTN)SmiHandlerProfileGetDataByOffset.DataSize)) {
977 DEBUG ((DEBUG_ERROR, "SmiHandlerProfileHandlerGetDataByOffset: SMI handler profile get data in SMRAM or overflow!\n"));
978 SmiHandlerProfileParameterGetDataByOffset->Header.ReturnStatus = (UINT64)(INT64)(INTN)EFI_ACCESS_DENIED;
979 goto Done;
980 }
981
982 SmiHandlerProfileCopyData ((VOID *)(UINTN)SmiHandlerProfileGetDataByOffset.DataBuffer, &SmiHandlerProfileGetDataByOffset.DataSize, &SmiHandlerProfileGetDataByOffset.DataOffset);
983 CopyMem (SmiHandlerProfileParameterGetDataByOffset, &SmiHandlerProfileGetDataByOffset, sizeof (SmiHandlerProfileGetDataByOffset));
984 SmiHandlerProfileParameterGetDataByOffset->Header.ReturnStatus = 0;
985
986Done:
987 mSmiHandlerProfileRecordingStatus = SmiHandlerProfileRecordingStatus;
988}
989
1006EFIAPI
1008 IN EFI_HANDLE DispatchHandle,
1009 IN CONST VOID *Context OPTIONAL,
1010 IN OUT VOID *CommBuffer OPTIONAL,
1011 IN OUT UINTN *CommBufferSize OPTIONAL
1012 )
1013{
1014 SMI_HANDLER_PROFILE_PARAMETER_HEADER *SmiHandlerProfileParameterHeader;
1015 UINTN TempCommBufferSize;
1016
1017 DEBUG ((DEBUG_ERROR, "SmiHandlerProfileHandler Enter\n"));
1018
1019 if (mSmiHandlerProfileDatabase == NULL) {
1020 return EFI_SUCCESS;
1021 }
1022
1023 //
1024 // If input is invalid, stop processing this SMI
1025 //
1026 if ((CommBuffer == NULL) || (CommBufferSize == NULL)) {
1027 return EFI_SUCCESS;
1028 }
1029
1030 TempCommBufferSize = *CommBufferSize;
1031
1032 if (TempCommBufferSize < sizeof (SMI_HANDLER_PROFILE_PARAMETER_HEADER)) {
1033 DEBUG ((DEBUG_ERROR, "SmiHandlerProfileHandler: SMM communication buffer size invalid!\n"));
1034 return EFI_SUCCESS;
1035 }
1036
1037 if (!SmmIsBufferOutsideSmmValid ((UINTN)CommBuffer, TempCommBufferSize)) {
1038 DEBUG ((DEBUG_ERROR, "SmiHandlerProfileHandler: SMM communication buffer in SMRAM or overflow!\n"));
1039 return EFI_SUCCESS;
1040 }
1041
1042 SmiHandlerProfileParameterHeader = (SMI_HANDLER_PROFILE_PARAMETER_HEADER *)((UINTN)CommBuffer);
1043 SmiHandlerProfileParameterHeader->ReturnStatus = (UINT64)-1;
1044
1045 switch (SmiHandlerProfileParameterHeader->Command) {
1046 case SMI_HANDLER_PROFILE_COMMAND_GET_INFO:
1047 DEBUG ((DEBUG_ERROR, "SmiHandlerProfileHandlerGetInfo\n"));
1048 if (TempCommBufferSize != sizeof (SMI_HANDLER_PROFILE_PARAMETER_GET_INFO)) {
1049 DEBUG ((DEBUG_ERROR, "SmiHandlerProfileHandler: SMM communication buffer size invalid!\n"));
1050 return EFI_SUCCESS;
1051 }
1052
1054 break;
1055 case SMI_HANDLER_PROFILE_COMMAND_GET_DATA_BY_OFFSET:
1056 DEBUG ((DEBUG_ERROR, "SmiHandlerProfileHandlerGetDataByOffset\n"));
1057 if (TempCommBufferSize != sizeof (SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET)) {
1058 DEBUG ((DEBUG_ERROR, "SmiHandlerProfileHandler: SMM communication buffer size invalid!\n"));
1059 return EFI_SUCCESS;
1060 }
1061
1063 break;
1064 default:
1065 break;
1066 }
1067
1068 DEBUG ((DEBUG_ERROR, "SmiHandlerProfileHandler Exit\n"));
1069
1070 return EFI_SUCCESS;
1071}
1072
1076VOID
1078 VOID
1079 )
1080{
1081 EFI_STATUS Status;
1082 EFI_HANDLE DispatchHandle;
1083
1084 Status = gSmst->SmiHandlerRegister (
1086 &gSmiHandlerProfileGuid,
1087 &DispatchHandle
1088 );
1089 ASSERT_EFI_ERROR (Status);
1090}
1091
1100SMI_ENTRY *
1102 IN EFI_GUID *HandlerType,
1103 IN BOOLEAN Create
1104 )
1105{
1106 LIST_ENTRY *Link;
1107 SMI_ENTRY *Item;
1108 SMI_ENTRY *SmiEntry;
1109
1110 //
1111 // Search the SMI entry list for the matching GUID
1112 //
1113 SmiEntry = NULL;
1114 for (Link = mHardwareSmiEntryList.ForwardLink;
1115 Link != &mHardwareSmiEntryList;
1116 Link = Link->ForwardLink)
1117 {
1118 Item = CR (Link, SMI_ENTRY, AllEntries, SMI_ENTRY_SIGNATURE);
1119 if (CompareGuid (&Item->HandlerType, HandlerType)) {
1120 //
1121 // This is the SMI entry
1122 //
1123 SmiEntry = Item;
1124 break;
1125 }
1126 }
1127
1128 //
1129 // If the protocol entry was not found and Create is TRUE, then
1130 // allocate a new entry
1131 //
1132 if ((SmiEntry == NULL) && Create) {
1133 SmiEntry = AllocatePool (sizeof (SMI_ENTRY));
1134 if (SmiEntry != NULL) {
1135 //
1136 // Initialize new SMI entry structure
1137 //
1138 SmiEntry->Signature = SMI_ENTRY_SIGNATURE;
1139 CopyGuid ((VOID *)&SmiEntry->HandlerType, HandlerType);
1140 InitializeListHead (&SmiEntry->SmiHandlers);
1141
1142 //
1143 // Add it to SMI entry list
1144 //
1145 InsertTailList (&mHardwareSmiEntryList, &SmiEntry->AllEntries);
1146 }
1147 }
1148
1149 return SmiEntry;
1150}
1151
1163 IN EFI_SMM_USB_REGISTER_CONTEXT *UsbContext,
1164 IN UINTN UsbContextSize,
1165 OUT UINTN *SmiHandlerUsbContextSize
1166 )
1167{
1168 UINTN DevicePathSize;
1169 SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *SmiHandlerUsbContext;
1170
1171 ASSERT (UsbContextSize == sizeof (EFI_SMM_USB_REGISTER_CONTEXT));
1172
1173 DevicePathSize = GetDevicePathSize (UsbContext->Device);
1174 SmiHandlerUsbContext = AllocatePool (sizeof (SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT) + DevicePathSize);
1175 if (SmiHandlerUsbContext == NULL) {
1176 *SmiHandlerUsbContextSize = 0;
1177 return NULL;
1178 }
1179
1180 SmiHandlerUsbContext->Type = UsbContext->Type;
1181 SmiHandlerUsbContext->DevicePathSize = (UINT32)DevicePathSize;
1182 CopyMem (SmiHandlerUsbContext + 1, UsbContext->Device, DevicePathSize);
1183 *SmiHandlerUsbContextSize = sizeof (SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT) + DevicePathSize;
1184 return SmiHandlerUsbContext;
1185}
1186
1199 IN UINTN SwContextSize,
1200 OUT UINTN *SmiHandlerSwContextSize
1201 )
1202{
1203 SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *SmiHandlerSwContext;
1204
1205 ASSERT (SwContextSize == sizeof (EFI_SMM_SW_REGISTER_CONTEXT));
1206
1207 SmiHandlerSwContext = AllocatePool (sizeof (SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT));
1208 if (SmiHandlerSwContext == NULL) {
1209 *SmiHandlerSwContextSize = 0;
1210 return NULL;
1211 }
1212
1213 SmiHandlerSwContext->SwSmiInputValue = SwContext->SwSmiInputValue;
1214 *SmiHandlerSwContextSize = sizeof (SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT);
1215 return SmiHandlerSwContext;
1216}
1217
1239EFIAPI
1242 IN EFI_GUID *HandlerGuid,
1243 IN EFI_SMM_HANDLER_ENTRY_POINT2 Handler,
1244 IN PHYSICAL_ADDRESS CallerAddress,
1245 IN VOID *Context OPTIONAL,
1246 IN UINTN ContextSize OPTIONAL
1247 )
1248{
1249 SMI_HANDLER *SmiHandler;
1250 SMI_ENTRY *SmiEntry;
1251 LIST_ENTRY *List;
1252
1253 if (((ContextSize == 0) && (Context != NULL)) ||
1254 ((ContextSize != 0) && (Context == NULL)))
1255 {
1256 return EFI_INVALID_PARAMETER;
1257 }
1258
1259 SmiHandler = AllocateZeroPool (sizeof (SMI_HANDLER));
1260 if (SmiHandler == NULL) {
1261 return EFI_OUT_OF_RESOURCES;
1262 }
1263
1264 SmiHandler->Signature = SMI_HANDLER_SIGNATURE;
1265 SmiHandler->Handler = Handler;
1266 SmiHandler->CallerAddr = (UINTN)CallerAddress;
1267 SmiHandler->Context = Context;
1268 SmiHandler->ContextSize = ContextSize;
1269
1270 if (Context != NULL) {
1271 if (CompareGuid (HandlerGuid, &gEfiSmmUsbDispatch2ProtocolGuid)) {
1272 SmiHandler->Context = ConvertSmiHandlerUsbContext (Context, ContextSize, &SmiHandler->ContextSize);
1273 } else if (CompareGuid (HandlerGuid, &gEfiSmmSwDispatch2ProtocolGuid)) {
1274 SmiHandler->Context = ConvertSmiHandlerSwContext (Context, ContextSize, &SmiHandler->ContextSize);
1275 } else {
1276 SmiHandler->Context = AllocateCopyPool (ContextSize, Context);
1277 }
1278 }
1279
1280 if (SmiHandler->Context == NULL) {
1281 SmiHandler->ContextSize = 0;
1282 }
1283
1284 SmiEntry = SmmCoreFindHardwareSmiEntry (HandlerGuid, TRUE);
1285 if (SmiEntry == NULL) {
1286 if (SmiHandler->Context != NULL) {
1287 FreePool (SmiHandler->Context);
1288 }
1289
1290 FreePool (SmiHandler);
1291 return EFI_OUT_OF_RESOURCES;
1292 }
1293
1294 List = &SmiEntry->SmiHandlers;
1295
1296 SmiHandler->SmiEntry = SmiEntry;
1297 InsertTailList (List, &SmiHandler->Link);
1298
1299 return EFI_SUCCESS;
1300}
1301
1320EFIAPI
1323 IN EFI_GUID *HandlerGuid,
1324 IN EFI_SMM_HANDLER_ENTRY_POINT2 Handler,
1325 IN VOID *Context OPTIONAL,
1326 IN UINTN ContextSize OPTIONAL
1327 )
1328{
1329 LIST_ENTRY *Link;
1330 LIST_ENTRY *Head;
1331 SMI_HANDLER *SmiHandler;
1332 SMI_ENTRY *SmiEntry;
1333 SMI_HANDLER *TargetSmiHandler;
1334 VOID *SearchContext;
1335 UINTN SearchContextSize;
1336
1337 if (((ContextSize == 0) && (Context != NULL)) ||
1338 ((ContextSize != 0) && (Context == NULL)))
1339 {
1340 return EFI_INVALID_PARAMETER;
1341 }
1342
1343 SmiEntry = SmmCoreFindHardwareSmiEntry (HandlerGuid, FALSE);
1344 if (SmiEntry == NULL) {
1345 return EFI_NOT_FOUND;
1346 }
1347
1348 SearchContext = Context;
1349 SearchContextSize = ContextSize;
1350 if (Context != NULL) {
1351 if (CompareGuid (HandlerGuid, &gEfiSmmUsbDispatch2ProtocolGuid)) {
1352 SearchContext = ConvertSmiHandlerUsbContext (Context, ContextSize, &SearchContextSize);
1353 } else if (CompareGuid (HandlerGuid, &gEfiSmmSwDispatch2ProtocolGuid)) {
1354 SearchContext = ConvertSmiHandlerSwContext (Context, ContextSize, &SearchContextSize);
1355 }
1356 }
1357
1358 TargetSmiHandler = NULL;
1359 Head = &SmiEntry->SmiHandlers;
1360 for (Link = Head->ForwardLink; Link != Head; Link = Link->ForwardLink) {
1361 SmiHandler = CR (Link, SMI_HANDLER, Link, SMI_HANDLER_SIGNATURE);
1362 if (SmiHandler->Handler == Handler) {
1363 if ((SearchContext == NULL) ||
1364 ((SearchContextSize == SmiHandler->ContextSize) && (CompareMem (SearchContext, SmiHandler->Context, SearchContextSize) == 0)))
1365 {
1366 TargetSmiHandler = SmiHandler;
1367 break;
1368 }
1369 }
1370 }
1371
1372 if (SearchContext != NULL) {
1373 if (CompareGuid (HandlerGuid, &gEfiSmmUsbDispatch2ProtocolGuid)) {
1374 FreePool (SearchContext);
1375 }
1376 }
1377
1378 if (TargetSmiHandler == NULL) {
1379 return EFI_NOT_FOUND;
1380 }
1381
1382 SmiHandler = TargetSmiHandler;
1383
1384 RemoveEntryList (&SmiHandler->Link);
1385 if (SmiHandler->Context != NULL) {
1386 FreePool (SmiHandler->Context);
1387 }
1388
1389 FreePool (SmiHandler);
1390
1391 if (IsListEmpty (&SmiEntry->SmiHandlers)) {
1392 RemoveEntryList (&SmiEntry->AllEntries);
1393 FreePool (SmiEntry);
1394 }
1395
1396 return EFI_SUCCESS;
1397}
1398
1402VOID
1404 VOID
1405 )
1406{
1407 EFI_STATUS Status;
1408 VOID *Registration;
1409 EFI_HANDLE Handle;
1410
1411 if ((PcdGet8 (PcdSmiHandlerProfilePropertyMask) & 0x1) != 0) {
1412 InsertTailList (&mRootSmiEntryList, &mRootSmiEntry.AllEntries);
1413
1414 Status = gSmst->SmmRegisterProtocolNotify (
1415 &gEfiSmmReadyToLockProtocolGuid,
1417 &Registration
1418 );
1419 ASSERT_EFI_ERROR (Status);
1420
1421 Handle = NULL;
1423 &Handle,
1424 &gSmiHandlerProfileGuid,
1426 &mSmiHandlerProfile
1427 );
1428 ASSERT_EFI_ERROR (Status);
1429 }
1430}
UINT64 UINTN
INT64 INTN
BOOLEAN EFIAPI IsListEmpty(IN CONST LIST_ENTRY *ListHead)
Definition: LinkedList.c:403
LIST_ENTRY *EFIAPI RemoveEntryList(IN CONST LIST_ENTRY *Entry)
Definition: LinkedList.c:590
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
Definition: LinkedList.c:182
#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)
Definition: BaseLib.h:2884
UINTN EFIAPI AsciiStrSize(IN CONST CHAR8 *String)
Definition: String.c:681
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
Definition: LinkedList.c:259
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
Definition: MemLibGuid.c:73
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
Definition: MemLibGuid.c:39
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
#define MEDIA_PIWG_FW_FILE_DP
Definition: DevicePath.h:1130
UINT8 EFIAPI DevicePathType(IN CONST VOID *Node)
UINT8 EFIAPI DevicePathSubType(IN CONST VOID *Node)
CHAR16 *EFIAPI ConvertDevicePathToText(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN BOOLEAN DisplayOnly, IN BOOLEAN AllowShortcuts)
UINTN EFIAPI GetDevicePathSize(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
VOID *EFIAPI AllocateCopyPool(IN UINTN AllocationSize, IN CONST VOID *Buffer)
#define NULL
Definition: Base.h:319
#define CONST
Definition: Base.h:259
#define VOID
Definition: Base.h:269
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define GLOBAL_REMOVE_IF_UNREFERENCED
Definition: Base.h:48
#define BASE_CR(Record, TYPE, Field)
Definition: Base.h:891
#define ASSERT_EFI_ERROR(StatusParameter)
Definition: DebugLib.h:463
#define DEBUG(Expression)
Definition: DebugLib.h:435
#define CR(Record, TYPE, Field, TestSignature)
Definition: DebugLib.h:660
#define DEBUG_CODE(Expression)
Definition: DebugLib.h:591
#define PcdGet8(TokenName)
Definition: PcdLib.h:336
EFI_SMM_SYSTEM_TABLE2 * gSmst
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
VOID InternalDumpData(IN UINT8 *Data, IN UINTN Size)
UINTN GetSmmSmiDatabaseSize(IN LIST_ENTRY *SmiEntryList)
VOID RegisterSmiHandlerProfileHandler(VOID)
VOID SmmCoreInitializeSmiHandlerProfile(VOID)
SMI_ENTRY * SmmCoreFindHardwareSmiEntry(IN EFI_GUID *HandlerType, IN BOOLEAN Create)
SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT * ConvertSmiHandlerSwContext(IN EFI_SMM_SW_REGISTER_CONTEXT *SwContext, IN UINTN SwContextSize, OUT UINTN *SmiHandlerSwContextSize)
UINTN GetSmiHandlerProfileDatabaseSize(VOID)
UINT32 AddressToImageRef(IN UINTN Address)
VOID GetSmmLoadedImage(VOID)
VOID SmiHandlerProfileHandlerGetDataByOffset(IN SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *SmiHandlerProfileParameterGetDataByOffset)
EFI_STATUS GetSmiHandlerProfileDatabaseData(IN OUT VOID *Data)
SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT * ConvertSmiHandlerUsbContext(IN EFI_SMM_USB_REGISTER_CONTEXT *UsbContext, IN UINTN UsbContextSize, OUT UINTN *SmiHandlerUsbContextSize)
EFI_STATUS EFIAPI SmiHandlerProfileRegisterHandler(IN SMI_HANDLER_PROFILE_PROTOCOL *This, IN EFI_GUID *HandlerGuid, IN EFI_SMM_HANDLER_ENTRY_POINT2 Handler, IN PHYSICAL_ADDRESS CallerAddress, IN VOID *Context OPTIONAL, IN UINTN ContextSize OPTIONAL)
UINTN GetSmmSmiDatabaseData(IN LIST_ENTRY *SmiEntryList, IN UINT32 HandlerCategory, IN OUT VOID *Data, IN UINTN ExpectedSize)
VOID AddImageStruct(IN PHYSICAL_ADDRESS ImageBase, IN UINT64 ImageSize, IN PHYSICAL_ADDRESS EntryPoint, IN EFI_GUID *Guid, IN CHAR8 *PdbString)
UINTN GetSmmSmiHandlerDataOnSmiEntry(IN SMI_ENTRY *SmiEntry, IN OUT VOID *Data, IN UINTN MaxSize, OUT UINT32 *Count)
VOID DumpSmiHandlerOnSmiEntry(IN SMI_ENTRY *SmiEntry)
UINTN GetSmmImageDatabaseData(IN OUT VOID *Data, IN UINTN ExpectedSize)
VOID DumpSmiEntryList(IN LIST_ENTRY *SmiEntryList)
UINTN GetSmmSmiHandlerSizeOnSmiEntry(IN SMI_ENTRY *SmiEntry)
VOID SmiHandlerProfileCopyData(OUT VOID *DataBuffer, IN OUT UINT64 *DataSize, IN OUT UINT64 *DataOffset)
UINTN GetSmmImageDatabaseSize(VOID)
VOID BuildSmiHandlerProfileDatabase(VOID)
VOID SmiHandlerProfileHandlerGetInfo(IN SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *SmiHandlerProfileParameterGetInfo)
EFI_STATUS EFIAPI SmiHandlerProfileUnregisterHandler(IN SMI_HANDLER_PROFILE_PROTOCOL *This, IN EFI_GUID *HandlerGuid, IN EFI_SMM_HANDLER_ENTRY_POINT2 Handler, IN VOID *Context OPTIONAL, IN UINTN ContextSize OPTIONAL)
RETURN_STATUS InternalPeCoffGetEntryPoint(IN VOID *Pe32Data, OUT VOID **EntryPoint)
VOID DumpSmiChildContext(IN EFI_GUID *HandlerType, IN VOID *Context, IN UINTN ContextSize)
IMAGE_STRUCT * AddressToImageStruct(IN UINTN Address)
EFI_STATUS EFIAPI SmmReadyToLockInSmiHandlerProfile(IN CONST EFI_GUID *Protocol, IN VOID *Interface, IN EFI_HANDLE Handle)
EFI_STATUS EFIAPI SmiHandlerProfileHandler(IN EFI_HANDLE DispatchHandle, IN CONST VOID *Context OPTIONAL, IN OUT VOID *CommBuffer OPTIONAL, IN OUT UINTN *CommBufferSize OPTIONAL)
VOID GetDriverGuid(IN EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, OUT EFI_GUID *Guid)
BOOLEAN EFIAPI SmmIsBufferOutsideSmmValid(IN EFI_PHYSICAL_ADDRESS Buffer, IN UINT64 Length)
Definition: SmmMemLib.c:114
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
@ EFI_NATIVE_INTERFACE
Definition: UefiSpec.h:1203
@ ByProtocol
Definition: UefiSpec.h:1528
EFI_INSTALL_PROTOCOL_INTERFACE SmmInstallProtocolInterface
Definition: PiSmmCis.h:185
Definition: Base.h:213