summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg/CpuDxe/CpuPageTable.c
diff options
context:
space:
mode:
authorJian J Wang <jian.j.wang@intel.com>2018-01-17 18:36:55 +0800
committerStar Zeng <star.zeng@intel.com>2018-01-19 14:16:11 +0800
commit425d25699be83c35e12df8470b827d7fbcef3bce (patch)
tree8c148e4dd10131ca0d9c70c2a4ea0ab1d41595c1 /UefiCpuPkg/CpuDxe/CpuPageTable.c
parentd40695ad82a6a9990d4e73bc9cc3de123eda7a90 (diff)
downloadedk2-425d25699be83c35e12df8470b827d7fbcef3bce.tar.gz
edk2-425d25699be83c35e12df8470b827d7fbcef3bce.tar.bz2
edk2-425d25699be83c35e12df8470b827d7fbcef3bce.zip
MdeModulePkg/Core: fix a logic hole in page free
This hole will cause page fault randomly. The root cause is that Guard page, which is just freed back to page pool but not yet cleared not- present attribute, will be allocated right away by internal function CoreFreeMemoryMapStack(). The solution to this issue is to clear the not-present attribute for freed Guard page before doing any free operation, instead of after those operation. The reason we didn't do this before is due to the fact that manipulating page attributes might cause memory allocation action which would cause a dead lock inside a memory allocation/free operation. So we always set or unset Guard page outside the memory lock. After a thorough analysis, we believe clearing a Guard page will not cause memory allocation because memory we're to manipulate was already manipulated before for sure. Therefore there should be no memory allocation occurring in this situation. Since we cleared Guard page not-present attribute before freeing instead of after freeing, the debug code to clear freed memory can now be restored to its original way (aka no checking and bypassing Guard page). Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Star Zeng <star.zeng@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jian J Wang <jian.j.wang@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
Diffstat (limited to 'UefiCpuPkg/CpuDxe/CpuPageTable.c')
0 files changed, 0 insertions, 0 deletions