public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v2] UefiCpuPkg/CpuDxe: Fix multiple entries of RT_CODE in memory map
@ 2017-11-03  0:57 Jian J Wang
  2017-11-06  9:15 ` Zeng, Star
                   ` (2 more replies)
  0 siblings, 3 replies; 17+ messages in thread
From: Jian J Wang @ 2017-11-03  0:57 UTC (permalink / raw)
  To: edk2-devel; +Cc: Eric Dong, Jiewen Yao, Laszlo Ersek

> v2
> a. Fix an issue which will cause setting capability failure if size is smaller
>    than a page.

More than one entry of RT_CODE memory might cause boot problem for some
old OSs. This patch will fix this issue to keep OS compatibility as much
as possible.

More detailed information, please refer to
    https://bugzilla.tianocore.org/show_bug.cgi?id=753

Cc: Eric Dong <eric.dong@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jian J Wang <jian.j.wang@intel.com>
---
 UefiCpuPkg/CpuDxe/CpuPageTable.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/UefiCpuPkg/CpuDxe/CpuPageTable.c b/UefiCpuPkg/CpuDxe/CpuPageTable.c
index d312eb66f8..4a7827ebc9 100644
--- a/UefiCpuPkg/CpuDxe/CpuPageTable.c
+++ b/UefiCpuPkg/CpuDxe/CpuPageTable.c
@@ -809,7 +809,9 @@ RefreshGcdMemoryAttributesFromPaging (
   PageLength    = 0;
 
   for (Index = 0; Index < NumberOfDescriptors; Index++) {
-    if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
+    if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent
+        || (MemorySpaceMap[Index].BaseAddress & EFI_PAGE_MASK) != 0
+        || (MemorySpaceMap[Index].Length & EFI_PAGE_MASK) != 0) {
       continue;
     }
 
@@ -829,6 +831,15 @@ RefreshGcdMemoryAttributesFromPaging (
     // Sync real page attributes to GCD
     BaseAddress       = MemorySpaceMap[Index].BaseAddress;
     MemorySpaceLength = MemorySpaceMap[Index].Length;
+    Capabilities      = MemorySpaceMap[Index].Capabilities |
+                        EFI_MEMORY_PAGETYPE_MASK;
+    Status = gDS->SetMemorySpaceCapabilities (
+                    BaseAddress,
+                    MemorySpaceLength,
+                    Capabilities
+                    );
+    ASSERT_EFI_ERROR (Status);
+
     while (MemorySpaceLength > 0) {
       if (PageLength == 0) {
         PageEntry = GetPageTableEntry (&PagingContext, BaseAddress, &PageAttribute);
@@ -846,7 +857,6 @@ RefreshGcdMemoryAttributesFromPaging (
         if (Attributes != (MemorySpaceMap[Index].Attributes & EFI_MEMORY_PAGETYPE_MASK)) {
           DoUpdate = TRUE;
           Attributes |= (MemorySpaceMap[Index].Attributes & ~EFI_MEMORY_PAGETYPE_MASK);
-          Capabilities = Attributes | MemorySpaceMap[Index].Capabilities;
         } else {
           DoUpdate = FALSE;
         }
@@ -854,8 +864,8 @@ RefreshGcdMemoryAttributesFromPaging (
 
       Length = MIN (PageLength, MemorySpaceLength);
       if (DoUpdate) {
-        gDS->SetMemorySpaceCapabilities (BaseAddress, Length, Capabilities);
-        gDS->SetMemorySpaceAttributes (BaseAddress, Length, Attributes);
+        Status = gDS->SetMemorySpaceAttributes (BaseAddress, Length, Attributes);
+        ASSERT_EFI_ERROR (Status);
         DEBUG ((DEBUG_INFO, "Update memory space attribute: [%02d] %016lx - %016lx (%08lx -> %08lx)\r\n",
                              Index, BaseAddress, BaseAddress + Length - 1,
                              MemorySpaceMap[Index].Attributes, Attributes));
-- 
2.14.1.windows.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread
* [PATCH v2] UefiCpuPkg/CpuDxe: Fix multiple entries of RT_CODE in memory map
@ 2017-10-25  8:12 Jian J Wang
  0 siblings, 0 replies; 17+ messages in thread
From: Jian J Wang @ 2017-10-25  8:12 UTC (permalink / raw)
  To: edk2-devel; +Cc: Eric Dong, Jiewen Yao

> v2 just updated the commit message.

Multiple RT_CODE in memory map was introduced by previous commit

    c1cab54ce57c2608b8b3ea051c7041f036f21153

This commit changed memory capability only based on page type of memory
attributes. EDK2's report of memory map to OS is grouped by memory
capabilites. This will cause more than on RT_CODE entries in memory map
if UEFI image protection is enabled, which will mark memory of code
segments of some modules to be read-only.

More than one entry of RT_CODE memory will cause boot problem for specific
old version of Linux kernel, because it will misplace the code segment and
data segment in this situation. The recent major Linux distro have no such
problem in boot. This patch will fix this issue to keep OS compatibility
as much as possible.

>From memory paging point of view, all memory block should have the capabilites
to change paging related memory attributes, if the memory paging has been
enabled and well setup, not just those memory blocks having some paging related
attributes set. So this patch will simply add all paging related memory
attribtes to the capability of all existing memory blocks if paging is enabled.
As a side effect, it will prevent EDK2 from reporting multple RT_CODE to OS.

Cc: Eric Dong <eric.dong@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jian J Wang <jian.j.wang@intel.com>
---
 UefiCpuPkg/CpuDxe/CpuPageTable.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/UefiCpuPkg/CpuDxe/CpuPageTable.c b/UefiCpuPkg/CpuDxe/CpuPageTable.c
index d312eb66f8..0802464b9d 100644
--- a/UefiCpuPkg/CpuDxe/CpuPageTable.c
+++ b/UefiCpuPkg/CpuDxe/CpuPageTable.c
@@ -829,6 +829,15 @@ RefreshGcdMemoryAttributesFromPaging (
     // Sync real page attributes to GCD
     BaseAddress       = MemorySpaceMap[Index].BaseAddress;
     MemorySpaceLength = MemorySpaceMap[Index].Length;
+    Capabilities      = MemorySpaceMap[Index].Capabilities |
+                        EFI_MEMORY_PAGETYPE_MASK;
+    Status = gDS->SetMemorySpaceCapabilities (
+                    BaseAddress,
+                    MemorySpaceLength,
+                    Capabilities
+                    );
+    ASSERT_EFI_ERROR (Status);
+
     while (MemorySpaceLength > 0) {
       if (PageLength == 0) {
         PageEntry = GetPageTableEntry (&PagingContext, BaseAddress, &PageAttribute);
@@ -846,7 +855,6 @@ RefreshGcdMemoryAttributesFromPaging (
         if (Attributes != (MemorySpaceMap[Index].Attributes & EFI_MEMORY_PAGETYPE_MASK)) {
           DoUpdate = TRUE;
           Attributes |= (MemorySpaceMap[Index].Attributes & ~EFI_MEMORY_PAGETYPE_MASK);
-          Capabilities = Attributes | MemorySpaceMap[Index].Capabilities;
         } else {
           DoUpdate = FALSE;
         }
@@ -854,8 +862,8 @@ RefreshGcdMemoryAttributesFromPaging (
 
       Length = MIN (PageLength, MemorySpaceLength);
       if (DoUpdate) {
-        gDS->SetMemorySpaceCapabilities (BaseAddress, Length, Capabilities);
-        gDS->SetMemorySpaceAttributes (BaseAddress, Length, Attributes);
+        Status = gDS->SetMemorySpaceAttributes (BaseAddress, Length, Attributes);
+        ASSERT_EFI_ERROR (Status);
         DEBUG ((DEBUG_INFO, "Update memory space attribute: [%02d] %016lx - %016lx (%08lx -> %08lx)\r\n",
                              Index, BaseAddress, BaseAddress + Length - 1,
                              MemorySpaceMap[Index].Attributes, Attributes));
-- 
2.14.1.windows.1



^ permalink raw reply related	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2017-11-09 12:15 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-03  0:57 [PATCH v2] UefiCpuPkg/CpuDxe: Fix multiple entries of RT_CODE in memory map Jian J Wang
2017-11-06  9:15 ` Zeng, Star
2017-11-07  0:55   ` Wang, Jian J
2017-11-07  1:12     ` Zeng, Star
2017-11-08  3:13     ` Zeng, Star
2017-11-08 13:25       ` Laszlo Ersek
2017-11-07 17:13 ` Laszlo Ersek
2017-11-08  0:10   ` Wang, Jian J
2017-11-08  9:10     ` Wang, Jian J
2017-11-08 14:17     ` Laszlo Ersek
2017-11-09  0:41       ` Wang, Jian J
2017-11-09  1:48         ` Yao, Jiewen
2017-11-09  1:51           ` Wang, Jian J
2017-11-09 12:19           ` Laszlo Ersek
2017-11-08  4:41 ` Ni, Ruiyu
2017-11-08  4:46   ` Wang, Jian J
  -- strict thread matches above, loose matches on Subject: below --
2017-10-25  8:12 Jian J Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox