]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/PiSmmCore/PiSmmCore.c
MdeModulePkg DxeCore: Fix issue to print GUID value %g without pointer
[mirror_edk2.git] / MdeModulePkg / Core / PiSmmCore / PiSmmCore.c
index 2bdb19ca86cbe422c5b7daa058072d7599677899..9e4390e15a1cbe69d44d57b0221ed8faaa297ac4 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   SMM Core Main Entry Point\r
 \r
-  Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials are licensed and made available \r
   under the terms and conditions of the BSD License which accompanies this \r
   distribution.  The full text of the license may be found at        \r
@@ -87,6 +87,8 @@ SMM_CORE_SMI_HANDLERS  mSmmCoreSmiHandlers[] = {
 UINTN                           mFullSmramRangeCount;\r
 EFI_SMRAM_DESCRIPTOR            *mFullSmramRanges;\r
 \r
+EFI_SMM_DRIVER_ENTRY            *mSmmCoreDriverEntry;\r
+\r
 EFI_LOADED_IMAGE_PROTOCOL       *mSmmCoreLoadedImage;\r
 \r
 /**\r
@@ -430,6 +432,8 @@ SmmEntryPoint (
   EFI_SMM_COMMUNICATE_HEADER  *CommunicateHeader;\r
   BOOLEAN                     InLegacyBoot;\r
   BOOLEAN                     IsOverlapped;\r
+  VOID                        *CommunicationBuffer;\r
+  UINTN                       BufferSize;\r
 \r
   PERF_START (NULL, "SMM", NULL, 0) ;\r
 \r
@@ -461,17 +465,19 @@ SmmEntryPoint (
     // Check to see if this is a Synchronous SMI sent through the SMM Communication \r
     // Protocol or an Asynchronous SMI\r
     //\r
-    if (gSmmCorePrivate->CommunicationBuffer != NULL) {\r
+    CommunicationBuffer = gSmmCorePrivate->CommunicationBuffer;\r
+    BufferSize          = gSmmCorePrivate->BufferSize;\r
+    if (CommunicationBuffer != NULL) {\r
       //\r
       // Synchronous SMI for SMM Core or request from Communicate protocol\r
       //\r
       IsOverlapped = InternalIsBufferOverlapped (\r
-                       (UINT8 *) gSmmCorePrivate->CommunicationBuffer,\r
-                       gSmmCorePrivate->BufferSize,\r
+                       (UINT8 *) CommunicationBuffer,\r
+                       BufferSize,\r
                        (UINT8 *) gSmmCorePrivate,\r
                        sizeof (*gSmmCorePrivate)\r
                        );\r
-      if (!SmmIsBufferOutsideSmmValid ((UINTN)gSmmCorePrivate->CommunicationBuffer, gSmmCorePrivate->BufferSize) || IsOverlapped) {\r
+      if (!SmmIsBufferOutsideSmmValid ((UINTN)CommunicationBuffer, BufferSize) || IsOverlapped) {\r
         //\r
         // If CommunicationBuffer is not in valid address scope,\r
         // or there is overlap between gSmmCorePrivate and CommunicationBuffer,\r
@@ -480,19 +486,19 @@ SmmEntryPoint (
         gSmmCorePrivate->CommunicationBuffer = NULL;\r
         gSmmCorePrivate->ReturnStatus = EFI_INVALID_PARAMETER;\r
       } else {\r
-        CommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *)gSmmCorePrivate->CommunicationBuffer;\r
-        gSmmCorePrivate->BufferSize -= OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
+        CommunicateHeader = (EFI_SMM_COMMUNICATE_HEADER *)CommunicationBuffer;\r
+        BufferSize -= OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
         Status = SmiManage (\r
                    &CommunicateHeader->HeaderGuid, \r
                    NULL, \r
                    CommunicateHeader->Data, \r
-                   &gSmmCorePrivate->BufferSize\r
+                   &BufferSize\r
                    );\r
         //\r
         // Update CommunicationBuffer, BufferSize and ReturnStatus\r
         // Communicate service finished, reset the pointer to CommBuffer to NULL\r
         //\r
-        gSmmCorePrivate->BufferSize += OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
+        gSmmCorePrivate->BufferSize = BufferSize + OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data);\r
         gSmmCorePrivate->CommunicationBuffer = NULL;\r
         gSmmCorePrivate->ReturnStatus = (Status == EFI_SUCCESS) ? EFI_SUCCESS : EFI_NOT_FOUND;\r
       }\r
@@ -564,6 +570,42 @@ SmmCoreInstallLoadedImage (
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  //\r
+  // Allocate a Loaded Image Protocol in SMM\r
+  //\r
+  Status = SmmAllocatePool (EfiRuntimeServicesData, sizeof(EFI_SMM_DRIVER_ENTRY), (VOID **)&mSmmCoreDriverEntry);\r
+  ASSERT_EFI_ERROR(Status);\r
+\r
+  ZeroMem (mSmmCoreDriverEntry, sizeof(EFI_SMM_DRIVER_ENTRY));\r
+  //\r
+  // Fill in the remaining fields of the Loaded Image Protocol instance.\r
+  //\r
+  mSmmCoreDriverEntry->Signature = EFI_SMM_DRIVER_ENTRY_SIGNATURE;\r
+  mSmmCoreDriverEntry->SmmLoadedImage.Revision = EFI_LOADED_IMAGE_PROTOCOL_REVISION;\r
+  mSmmCoreDriverEntry->SmmLoadedImage.ParentHandle = gSmmCorePrivate->SmmIplImageHandle;\r
+  mSmmCoreDriverEntry->SmmLoadedImage.SystemTable = gST;\r
+\r
+  mSmmCoreDriverEntry->SmmLoadedImage.ImageBase = (VOID *)(UINTN)gSmmCorePrivate->PiSmmCoreImageBase;\r
+  mSmmCoreDriverEntry->SmmLoadedImage.ImageSize = gSmmCorePrivate->PiSmmCoreImageSize;\r
+  mSmmCoreDriverEntry->SmmLoadedImage.ImageCodeType = EfiRuntimeServicesCode;\r
+  mSmmCoreDriverEntry->SmmLoadedImage.ImageDataType = EfiRuntimeServicesData;\r
+\r
+  mSmmCoreDriverEntry->ImageEntryPoint = gSmmCorePrivate->PiSmmCoreEntryPoint;\r
+  mSmmCoreDriverEntry->ImageBuffer     = gSmmCorePrivate->PiSmmCoreImageBase;\r
+  mSmmCoreDriverEntry->NumberOfPage    = EFI_SIZE_TO_PAGES((UINTN)gSmmCorePrivate->PiSmmCoreImageSize);\r
+\r
+  //\r
+  // Create a new image handle in the SMM handle database for the SMM Driver\r
+  //\r
+  mSmmCoreDriverEntry->SmmImageHandle = NULL;\r
+  Status = SmmInstallProtocolInterface (\r
+             &mSmmCoreDriverEntry->SmmImageHandle,\r
+             &gEfiLoadedImageProtocolGuid,\r
+             EFI_NATIVE_INTERFACE,\r
+             &mSmmCoreDriverEntry->SmmLoadedImage\r
+             );\r
+  ASSERT_EFI_ERROR(Status);\r
+\r
   return ;\r
 }\r
 \r
@@ -636,5 +678,9 @@ SmmMain (
 \r
   SmmCoreInstallLoadedImage ();\r
 \r
+  SmmCoreInitializeMemoryAttributesTable ();\r
+\r
+  SmmCoreInitializeSmiHandlerProfile ();\r
+\r
   return EFI_SUCCESS;\r
 }\r