From: "Lendacky, Thomas" <thomas.lendacky@amd.com>
To: Laszlo Ersek <lersek@redhat.com>, devel@edk2.groups.io
Cc: Jordan Justen <jordan.l.justen@intel.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Liming Gao <liming.gao@intel.com>,
Eric Dong <eric.dong@intel.com>, Ray Ni <ray.ni@intel.com>,
Brijesh Singh <brijesh.singh@amd.com>,
Anthony Perard <anthony.perard@citrix.com>,
Benjamin You <benjamin.you@intel.com>,
Guo Dong <guo.dong@intel.com>, Julien Grall <julien@xen.org>,
Maurice Ma <maurice.ma@intel.com>, Andrew Fish <afish@apple.com>
Subject: Re: [edk2-devel] [PATCH 1/4] UefiCpuPkg/CpuExceptionHandler: Make XCODE5 changes toolchain specific
Date: Tue, 5 May 2020 17:09:17 -0500 [thread overview]
Message-ID: <eccf0220-16b7-0eb2-2fe9-922fd8b5e862@amd.com> (raw)
In-Reply-To: <862a2551-7f07-a4e8-52d6-dccb1db01fcb@redhat.com>
On 5/5/20 4:39 PM, Laszlo Ersek wrote:
> Hi Tom,
>
> On 05/01/20 22:17, Lendacky, Thomas wrote:
>> BZ: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2340&data=02%7C01%7Cthomas.lendacky%40amd.com%7C4d398c73a4bc4674d36608d7f13cce1d%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637243115777198329&sdata=YA9qmWhZDrwGCchGXKDmOQPFqXdDztokQSZeZIq6u18%3D&reserved=0
>>
>> Commit 2db0ccc2d7fe ("UefiCpuPkg: Update CpuExceptionHandlerLib pass
>> XCODE5 tool chain") introduced binary patching into the exception handling
>> support. CPU exception handling is allowed during SEC and this results in
>> binary patching of flash, which should not be done.
>>
>> Separate the changes from commit 2db0ccc2d7fe into an XCODE5 toolchain
>> specific file, Xcode5ExceptionHandlerAsm.nasm, and create new INF files
>> for an XCODE5 version of CpuExceptionHandlerLib. Update the UefiCpuPkg.dsc
>> file to use the new files when the XCODE5 toolchain is used.
>>
>> Cc: Eric Dong <eric.dong@intel.com>
>> Cc: Ray Ni <ray.ni@intel.com>
>> Cc: Laszlo Ersek <lersek@redhat.com>
>> Cc: Liming Gao <liming.gao@intel.com>
>> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
>> ---
>> UefiCpuPkg/UefiCpuPkg.dsc | 23 +
>> .../Xcode5DxeCpuExceptionHandlerLib.inf | 64 +++
>> .../Xcode5PeiCpuExceptionHandlerLib.inf | 63 +++
>> .../Xcode5SecPeiCpuExceptionHandlerLib.inf | 55 +++
>> .../Xcode5SmmCpuExceptionHandlerLib.inf | 59 +++
>
> I don't think that paralleling all the existent INF files is necessary
> for XCODE5.
>
> The binary patching is a problem when the UEFI module containing the
> self-patching CpuExceptionHandlerLib instance executes in-place from
> flash. That applies to: (a) SEC modules, (b) PEI modules that do *not*
> have a DEPEX on "gEfiPeiMemoryDiscoveredPpiGuid". (PEIMs that do have a
> DEPEX on that PPI GUID are only dispatched after the permanent PEI RAM
> has been discovered / published, so they run out of normal RAM.)
>
> Reviewing the existent INF files, we have:
>
> - DxeCpuExceptionHandlerLib.inf: for DXE_CORE, DXE_DRIVER,
> UEFI_APPLICATION modules. Self-patching is fine.
>
> - SmmCpuExceptionHandlerLib.inf: for DXE_SMM_DRIVER modules.
> Self-patching is fine.
>
> - SecPeiCpuExceptionHandlerLib.inf: SEC is listed explicitly, so here we
> certainly need an alternative.
>
> - PeiCpuExceptionHandlerLib.inf: unfortunately, the differences of this
> library instance with "SecPeiCpuExceptionHandlerLib.inf" is not obvious;
> only SEC's absence is easily visible.
>
> If we look at the commit that introduced this lib instance
> (a81abf161666, "UefiCpuPkg/ExceptionLib: Import
> PeiCpuExceptionHandlerLib module", 2016-06-01), we find:
>
>> This module could be linked by CpuMpPei driver to handle reserved vector list
>> and provide spin lock for BSP/APs to prevent dump message corrupted.
>
> So the library was added explicitly for CpuMpPei's sake -- which looks
> promising, because CpuMpPei certainly depends on
> "gEfiPeiMemoryDiscoveredPpiGuid", as it needs a bunch of RAM for
> offering the multi-processing PPI. That suggests the self-patching is OK
> in "PeiCpuExceptionHandlerLib.inf" too.
>
> The CpuMpPei DEPEX in question was replaced with a PPI notify callback
> in commit 0a0d5296e448 ("UefiCpuPkg/CpuMpPei: support stack guard
> feature", 2018-09-10). This would be a problem if the self-patching in
> the PeiCpuExceptionHandlerLib instance occurred in the library
> constructor, because the CpuMpPei can now actually be dispatched before
> permanent PEI RAM is available -- and the constructor would run
> immediately.
>
> Luckily, the lib instance has no CONSTRUCTOR at all, and CpuMpPei calls
> InitializeCpuExceptionHandlers() explicitly in InitializeCpuMpWorker(),
> which is the PPI notify in question. (And per
> <https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2340%23c0&data=02%7C01%7Cthomas.lendacky%40amd.com%7C4d398c73a4bc4674d36608d7f13cce1d%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637243115777198329&sdata=1ucjYymvr7VAF2d2QGyCxQhE8hGe8AFMaW8EYbUUkdM%3D&reserved=0>, the
> self-patching occurs in InitializeCpuExceptionHandlers().)
>
> Therefore, having two variants of PeiCpuExceptionHandlerLib.inf is also
> unnecessary.
>
> (1) We only need two variants for "SecPeiCpuExceptionHandlerLib.inf", in
> my opinion.
Ok, I'll rework it to have variants for just SecPeiCpuExceptionHandlerLib.
>
> (Note: if we check OVMF, we see that PeiCpuExceptionHandlerLib.inf is
> used universally for PEIMs. That's because OVMF is special -- its PEI
> phase runs entirely out of RAM. See also commit f0e6a56a9a2f, "OvmfPkg:
> include UefiCpuPkg/CpuMpPei", 2016-07-15.)
>
> --*--
>
> With this patch applied:
>
> $ diff -u \
> SecPeiCpuExceptionHandlerLib.inf \
> Xcode5SecPeiCpuExceptionHandlerLib.inf
>
>> --- SecPeiCpuExceptionHandlerLib.inf 2020-05-05 18:36:12.813156743 +0200
>> +++ Xcode5SecPeiCpuExceptionHandlerLib.inf 2020-05-05 23:25:24.578572971 +0200
>> @@ -8,7 +8,7 @@
>>
>> [Defines]
>> INF_VERSION = 0x00010005
>> - BASE_NAME = SecPeiCpuExceptionHandlerLib
>> + BASE_NAME = Xcode5SecPeiCpuExceptionHandlerLib
>
> OK
>
>> MODULE_UNI_FILE = SecPeiCpuExceptionHandlerLib.uni
>
> (2) We'll need a separate UNI file here -- also we should customize the
> file-top comment in the INF file -- that explains the difference between
> the XCODE5 and non-XCODE5 variants, briefly.
Ok, will do.
>
>> FILE_GUID = CA4BBC99-DFC6-4234-B553-8B6586B7B113
>
> (3) Please generate a new FILE_GUID with "uuidgen".
Ok, thanks, that answers my question that I asked in another email.
>
>> MODULE_TYPE = PEIM
>> @@ -26,16 +26,20 @@
>> Ia32/ExceptionTssEntryAsm.nasm
>> Ia32/ArchExceptionHandler.c
>> Ia32/ArchInterruptDefs.h
>> + Ia32/ArchAMDSevVcHandler.c
>
> (4) Even though the blurb says that this series is based on edk2 commit
> e54310451f1a, some SEV-ES specific parts remain in this patch, and
> should be eliminated. The first example is above.
Ugh. I thought I had that all cleaned up before sending. My bad, I'll fix
that in the next version.
Thanks,
Tom
>
>>
>> [Sources.X64]
>> - X64/ExceptionHandlerAsm.nasm
>> + X64/Xcode5ExceptionHandlerAsm.nasm
>> X64/ArchExceptionHandler.c
>> X64/ArchInterruptDefs.h
>> + X64/ArchAMDSevVcHandler.c
>
> (5) Another SEV-ES change.
>
>>
>> [Sources.common]
>> CpuExceptionCommon.h
>> CpuExceptionCommon.c
>> SecPeiCpuException.c
>> + AMDSevVcHandler.c
>> + AMDSevVcCommon.h
>
> (6) ditto
>
>>
>> [Packages]
>> MdePkg/MdePkg.dec
>> @@ -48,3 +52,4 @@
>> PrintLib
>> LocalApicLib
>> PeCoffGetEntryPointLib
>> + VmgExitLib
>
> (7) ditto
>
> Furthermore:
>
> $ diff -u \
> ExceptionHandlerAsm.nasm \
> Xcode5ExceptionHandlerAsm.nasm
>
>> --- ExceptionHandlerAsm.nasm 2020-05-05 23:26:30.941784203 +0200
>> +++ Xcode5ExceptionHandlerAsm.nasm 2020-05-05 23:25:24.578572971 +0200
>> @@ -18,6 +18,8 @@
>> ; CommonExceptionHandler()
>> ;
>>
>> +%define VC_EXCEPTION 29
>> +
>> extern ASM_PFX(mErrorCodeFlag) ; Error code flags for exceptions
>> extern ASM_PFX(mDoFarReturnFlag) ; Do far return flag
>> extern ASM_PFX(CommonExceptionHandler)
>> @@ -225,6 +227,9 @@
>> push rax
>>
>> ;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7;
>> + cmp qword [rbp + 8], VC_EXCEPTION
>> + je VcDebugRegs ; For SEV-ES (#VC) Debug registers ignored
>> +
>> mov rax, dr7
>> push rax
>> mov rax, dr6
>> @@ -237,7 +242,19 @@
>> push rax
>> mov rax, dr0
>> push rax
>> + jmp DrFinish
>> +
>> +VcDebugRegs:
>> +;; UINT64 Dr0, Dr1, Dr2, Dr3, Dr6, Dr7 are skipped for #VC to avoid exception recursion
>> + xor rax, rax
>> + push rax
>> + push rax
>> + push rax
>> + push rax
>> + push rax
>> + push rax
>>
>> +DrFinish:
>> ;; FX_SAVE_STATE_X64 FxSaveState;
>> sub rsp, 512
>> mov rdi, rsp
>
> (8) All of these should be removed -- they should be part of your SEV-ES
> series, on top of this set.
>
> Thanks,
> Laszlo
>
next prev parent reply other threads:[~2020-05-05 22:09 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-01 20:17 [PATCH 0/4] XCODE5 toolchain binary patching fix Lendacky, Thomas
2020-05-01 20:17 ` [PATCH 1/4] UefiCpuPkg/CpuExceptionHandler: Make XCODE5 changes toolchain specific Lendacky, Thomas
2020-05-05 21:39 ` [edk2-devel] " Laszlo Ersek
2020-05-05 22:09 ` Lendacky, Thomas [this message]
2020-05-01 20:17 ` [PATCH 2/4] UefiPayloadPkg: Use toolchain appropriate CpuExceptionHandlerLib Lendacky, Thomas
2020-05-05 22:19 ` [edk2-devel] " Laszlo Ersek
2020-05-01 20:17 ` [PATCH 3/4] OvmfPkg: " Lendacky, Thomas
2020-05-05 21:49 ` [edk2-devel] " Laszlo Ersek
2020-05-01 20:17 ` [PATCH 4/4] UefiCpuPkg/CpuExceptionHandler: Revert binary patching in standard CpuExceptionHandlerLib Lendacky, Thomas
2020-05-01 20:49 ` [EXTERNAL] [edk2-devel] " Bret Barkelew
2020-05-05 22:15 ` Laszlo Ersek
2020-05-06 14:35 ` Lendacky, Thomas
2020-05-06 14:53 ` Liming Gao
2020-05-06 16:33 ` Laszlo Ersek
2020-05-06 18:07 ` [EXTERNAL] " Bret Barkelew
2020-05-06 19:51 ` Lendacky, Thomas
[not found] ` <160B00E54624ADAA.10991@groups.io>
2020-05-05 18:50 ` [edk2-devel] [PATCH 1/4] UefiCpuPkg/CpuExceptionHandler: Make XCODE5 changes toolchain specific Lendacky, Thomas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=eccf0220-16b7-0eb2-2fe9-922fd8b5e862@amd.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox