]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/CapsulePei/UefiCapsule.c
MdeModulePkg/BootGraphicsResourceDxe: Add Boot Logo 2 Protocol
[mirror_edk2.git] / MdeModulePkg / Universal / CapsulePei / UefiCapsule.c
index e60105b31caa69d719565fa3f0a89f3093059a83..043365f7f770193ca2e02af507da9e1f614fd13d 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Capsule update PEIM for UEFI2.0\r
 \r
-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions\r
@@ -41,6 +42,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST IA32_DESCRIPTOR mGdt = {
   (UINTN) mGdtEntries\r
   };\r
 \r
+\r
 /**\r
   The function will check if 1G page is supported.\r
 \r
@@ -145,6 +147,12 @@ Create4GPageTables (
   PAGE_TABLE_ENTRY                              *PageDirectoryEntry;\r
   UINTN                                         BigPageAddress;\r
   PAGE_TABLE_1G_ENTRY                           *PageDirectory1GEntry;\r
+  UINT64                                        AddressEncMask;\r
+\r
+  //\r
+  // Make sure AddressEncMask is contained to smallest supported address field.\r
+  //\r
+  AddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64;\r
 \r
   //\r
   // Create 4G page table by default,\r
@@ -187,7 +195,7 @@ Create4GPageTables (
     //\r
     // Make a PML4 Entry\r
     //\r
-    PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry;\r
+    PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry | AddressEncMask;\r
     PageMapLevel4Entry->Bits.ReadWrite = 1;\r
     PageMapLevel4Entry->Bits.Present = 1;\r
 \r
@@ -198,7 +206,7 @@ Create4GPageTables (
         //\r
         // Fill in the Page Directory entries\r
         //\r
-        PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;\r
+        PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | AddressEncMask;\r
         PageDirectory1GEntry->Bits.ReadWrite = 1;\r
         PageDirectory1GEntry->Bits.Present = 1;\r
         PageDirectory1GEntry->Bits.MustBe1 = 1;\r
@@ -215,7 +223,7 @@ Create4GPageTables (
         //\r
         // Fill in a Page Directory Pointer Entries\r
         //\r
-        PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry;\r
+        PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry | AddressEncMask;\r
         PageDirectoryPointerEntry->Bits.ReadWrite = 1;\r
         PageDirectoryPointerEntry->Bits.Present = 1;\r
 \r
@@ -223,7 +231,7 @@ Create4GPageTables (
           //\r
           // Fill in the Page Directory entries\r
           //\r
-          PageDirectoryEntry->Uint64 = (UINT64)PageAddress;\r
+          PageDirectoryEntry->Uint64 = (UINT64)PageAddress | AddressEncMask;\r
           PageDirectoryEntry->Bits.ReadWrite = 1;\r
           PageDirectoryEntry->Bits.Present = 1;\r
           PageDirectoryEntry->Bits.MustBe1 = 1;\r
@@ -321,6 +329,14 @@ Thunk32To64 (
     //\r
     AsmWriteCr3 ((UINTN) PageTableAddress);\r
 \r
+    DEBUG ((\r
+      DEBUG_INFO,\r
+      "%a() Stack Base: 0x%lx, Stack Size: 0x%lx\n",\r
+      __FUNCTION__,\r
+      Context->StackBufferBase,\r
+      Context->StackBufferLength\r
+      ));\r
+\r
     //\r
     // Disable interrupt of Debug timer, since the IDT table cannot work in long mode\r
     //\r
@@ -435,6 +451,7 @@ ModeSwitch (
   Context.MemoryBase64Ptr       = (EFI_PHYSICAL_ADDRESS)(UINTN)&MemoryBase64;\r
   Context.MemorySize64Ptr       = (EFI_PHYSICAL_ADDRESS)(UINTN)&MemorySize64;\r
   Context.Page1GSupport         = Page1GSupport;\r
+  Context.AddressEncMask        = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64;\r
 \r
   //\r
   // Prepare data for return back\r
@@ -607,6 +624,82 @@ GetPhysicalAddressBits (
 }\r
 #endif\r
 \r
+/**\r
+  Sort memory resource entries based upon PhysicalStart, from low to high.\r
+\r
+  @param[in, out] MemoryResource    A pointer to the memory resource entry buffer.\r
+\r
+**/\r
+VOID\r
+SortMemoryResourceDescriptor (\r
+  IN OUT MEMORY_RESOURCE_DESCRIPTOR *MemoryResource\r
+  )\r
+{\r
+  MEMORY_RESOURCE_DESCRIPTOR        *MemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        *NextMemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        TempMemoryResource;\r
+\r
+  MemoryResourceEntry = MemoryResource;\r
+  NextMemoryResourceEntry = MemoryResource + 1;\r
+  while (MemoryResourceEntry->ResourceLength != 0) {\r
+    while (NextMemoryResourceEntry->ResourceLength != 0) {\r
+      if (MemoryResourceEntry->PhysicalStart > NextMemoryResourceEntry->PhysicalStart) {\r
+        CopyMem (&TempMemoryResource, MemoryResourceEntry, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+        CopyMem (MemoryResourceEntry, NextMemoryResourceEntry, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+        CopyMem (NextMemoryResourceEntry, &TempMemoryResource, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+      }\r
+\r
+      NextMemoryResourceEntry = NextMemoryResourceEntry + 1;\r
+    }\r
+\r
+    MemoryResourceEntry     = MemoryResourceEntry + 1;\r
+    NextMemoryResourceEntry = MemoryResourceEntry + 1;\r
+  }\r
+}\r
+\r
+/**\r
+  Merge continous memory resource entries.\r
+\r
+  @param[in, out] MemoryResource    A pointer to the memory resource entry buffer.\r
+\r
+**/\r
+VOID\r
+MergeMemoryResourceDescriptor (\r
+  IN OUT MEMORY_RESOURCE_DESCRIPTOR *MemoryResource\r
+  )\r
+{\r
+  MEMORY_RESOURCE_DESCRIPTOR        *MemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        *NewMemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        *NextMemoryResourceEntry;\r
+  MEMORY_RESOURCE_DESCRIPTOR        *MemoryResourceEnd;\r
+\r
+  MemoryResourceEntry = MemoryResource;\r
+  NewMemoryResourceEntry = MemoryResource;\r
+  while (MemoryResourceEntry->ResourceLength != 0) {\r
+    CopyMem (NewMemoryResourceEntry, MemoryResourceEntry, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+    NextMemoryResourceEntry = MemoryResourceEntry + 1;\r
+\r
+    while ((NextMemoryResourceEntry->ResourceLength != 0) &&\r
+           (NextMemoryResourceEntry->PhysicalStart == (MemoryResourceEntry->PhysicalStart + MemoryResourceEntry->ResourceLength))) {\r
+      MemoryResourceEntry->ResourceLength += NextMemoryResourceEntry->ResourceLength;\r
+      if (NewMemoryResourceEntry != MemoryResourceEntry) {\r
+        NewMemoryResourceEntry->ResourceLength += NextMemoryResourceEntry->ResourceLength;\r
+      }\r
\r
+      NextMemoryResourceEntry = NextMemoryResourceEntry + 1;\r
+    }\r
+\r
+    MemoryResourceEntry = NextMemoryResourceEntry;\r
+    NewMemoryResourceEntry = NewMemoryResourceEntry + 1;\r
+  }\r
+\r
+  //\r
+  // Set NULL terminate memory resource descriptor after merging.\r
+  //\r
+  MemoryResourceEnd = NewMemoryResourceEntry;\r
+  ZeroMem (MemoryResourceEnd, sizeof (MEMORY_RESOURCE_DESCRIPTOR));\r
+}\r
+\r
 /**\r
   Build memory resource descriptor from resource descriptor in HOB list.\r
 \r
@@ -687,6 +780,20 @@ BuildMemoryResourceDescriptor (
     Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw);\r
   }\r
 \r
+  SortMemoryResourceDescriptor (MemoryResource);\r
+  MergeMemoryResourceDescriptor (MemoryResource);\r
+\r
+  DEBUG ((DEBUG_INFO, "Dump MemoryResource[] after sorted and merged\n"));\r
+  for (Index = 0; MemoryResource[Index].ResourceLength != 0; Index++) {\r
+    DEBUG ((\r
+      DEBUG_INFO,\r
+      "  MemoryResource[0x%x] - Start(0x%0lx) Length(0x%0lx)\n",\r
+      Index,\r
+      MemoryResource[Index].PhysicalStart,\r
+      MemoryResource[Index].ResourceLength\r
+      ));\r
+  }\r
+\r
   return MemoryResource;\r
 }\r
 \r
@@ -746,7 +853,7 @@ GetCapsuleDescriptors (
                                         (VOID *) &CapsuleDataPtr64\r
                                         );\r
         if (EFI_ERROR (Status)) {\r
-          DEBUG ((EFI_D_ERROR, "Capsule -- capsule variable not set\n"));\r
+          DEBUG ((DEBUG_INFO, "Capsule -- capsule variable not set\n"));\r
           return EFI_NOT_FOUND;\r
         }\r
         //\r
@@ -760,7 +867,13 @@ GetCapsuleDescriptors (
           return EFI_SUCCESS;\r
         }\r
       } else {\r
-        UnicodeValueToString (TempVarName, 0, Index, 0);\r
+        UnicodeValueToStringS (\r
+          TempVarName,\r
+          sizeof (CapsuleVarName) - ((UINTN)TempVarName - (UINTN)CapsuleVarName),\r
+          0,\r
+          Index,\r
+          0\r
+          );\r
         Status = PPIVariableServices->GetVariable (\r
                                         PPIVariableServices,\r
                                         CapsuleVarName,\r
@@ -883,7 +996,13 @@ CapsuleCoalesce (
   TempVarName = CapsuleVarName + StrLen (CapsuleVarName);\r
   while (TRUE) {\r
     if (Index > 0) {\r
-      UnicodeValueToString (TempVarName, 0, Index, 0);\r
+      UnicodeValueToStringS (\r
+        TempVarName,\r
+        sizeof (CapsuleVarName) - ((UINTN)TempVarName - (UINTN)CapsuleVarName),\r
+        0,\r
+        Index,\r
+        0\r
+        );\r
     }\r
     Status = PPIVariableServices->GetVariable (\r
                                     PPIVariableServices,\r