From: "Andrew Fish" <afish@apple.com>
To: devel@edk2.groups.io, liming.gao@intel.com
Cc: "Laszlo Ersek" <lersek@redhat.com>,
"Lendacky, Thomas" <Thomas.Lendacky@amd.com>,
"Jordan Justen" <jordan.l.justen@intel.com>,
"Ard Biesheuvel" <ard.biesheuvel@linaro.org>,
"Mike Kinney" <michael.d.kinney@intel.com>,
"Dong, Eric" <eric.dong@intel.com>, "Ni, Ray" <ray.ni@intel.com>,
"Singh, Brijesh" <brijesh.singh@amd.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>
Subject: Re: [edk2-devel] [RFC PATCH v2 38/44] UefiCpuPkg: Allow AP booting under SEV-ES
Date: Sat, 12 Oct 2019 11:50:13 -0700 [thread overview]
Message-ID: <3391DF85-25CC-4B8B-AEBF-0CB833B7713F@apple.com> (raw)
In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14E516356@SHSMSX104.ccr.corp.intel.com>
[-- Attachment #1: Type: text/plain, Size: 7612 bytes --]
Liming,
Here is a simple example of a global with absolute function address in it.
1) The text section uses %rip relative addressing. So the 1st goto technique is to convert absolute addressing to PC relative addressing if possible.
2) The data section can contain absolute addresses. The data section is read/write. As you can see .quad can have a pointer to an absolute address (that would require a relocation).
3) The text section can access data section via PC relative addressing.
4) While the code looks like it is located together the data section is going to follow the text section and get aligned to section alignment. So in my simple example the data section is 4K from the start of the text section.
5) If all else fails the assembler will let you put code in the data section, and that code can have relocations, but see 4).
~/work/Compiler>cat relocation.c
int main();
void *gRelocation = (void *)main;
int main ()
{
return (int)(unsigned long long)gRelocation;
}
~/work/Compiler>clang -S -Os relocation.c
~/work/Compiler>cat relocation.S
.section __TEXT,__text,regular,pure_instructions
.globl _main ## -- Begin function main
_main: ## @main
pushq %rbp
movq %rsp, %rbp
movl _gRelocation(%rip), %eax
popq %rbp
retq
## -- End function
.section __DATA,__data
.globl _gRelocation ## @gRelocation
.p2align 3
_gRelocation:
.quad _main
.subsections_via_symbols
If you have questions about a specific chunk of code to convert let me know.
Thanks,
Andrew Fish
> On Oct 12, 2019, at 12:46 AM, Liming Gao <liming.gao@intel.com> wrote:
>
> Andrew:
> Can you give more detail on how to update nasm source code to put the 64bit absolute address from .text section to .data section? I will verify it. Now, the patching way doesn’t support X64 SEC/PEI. This is a gab in XCODE tool chain.
>
> Thanks
> Liming
> From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> [mailto:devel@edk2.groups.io <mailto:devel@edk2.groups.io>] On Behalf Of Andrew Fish via Groups.Io
> Sent: Saturday, October 12, 2019 2:43 PM
> To: devel@edk2.groups.io <mailto:devel@edk2.groups.io>; Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com>>
> Cc: Lendacky, Thomas <Thomas.Lendacky@amd.com <mailto:Thomas.Lendacky@amd.com>>; Justen, Jordan L <jordan.l.justen@intel.com <mailto:jordan.l.justen@intel.com>>; Ard Biesheuvel <ard.biesheuvel@linaro.org <mailto:ard.biesheuvel@linaro.org>>; Kinney, Michael D <michael.d.kinney@intel.com <mailto:michael.d.kinney@intel.com>>; Gao, Liming <liming.gao@intel.com <mailto:liming.gao@intel.com>>; Dong, Eric <eric.dong@intel.com <mailto:eric.dong@intel.com>>; Ni, Ray <ray.ni@intel.com <mailto:ray.ni@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com>>; Philippe Mathieu-Daudé <philmd@redhat.com <mailto:philmd@redhat.com>>
> Subject: Re: [edk2-devel] [RFC PATCH v2 38/44] UefiCpuPkg: Allow AP booting under SEV-ES
>
> Laszlo,
>
> For 2) this is very unfortunate. I think the root cause is for those of us who work on x86 hardware day to day we get programed that SEC/PEI is IA32 and DXE is X64, and this can lead to some unfortunate coding outcomes.
>
> I'm guessing this code probably got ported from the DXE CPU driver or some other place that had no XIP assumptions. One option vs. patching is putting the relocations in the .data section. The only issue with that could be the need to align sections on page boundaries and that may take up too much space in XIP code. Perhaps we could only require the .data section relocations for XCODE, and map them to .text for the other toolchain?
>
> Thanks,
>
> Andrew Fish
>
>
> On Oct 11, 2019, at 1:56 AM, Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com>> wrote:
>
> On 10/11/19 01:17, Lendacky, Thomas wrote:
>
> On 10/3/19 10:12 AM, Tom Lendacky wrote:
>
>
>
> On 10/3/19 5:32 AM, Laszlo Ersek wrote:
>
> On 10/03/19 12:12, Laszlo Ersek wrote:
>
>
> UINT32 ApEntryPoint;
> EFI_GUID SevEsFooterGuid;
> UINT16 Size;
>
> It's probably better to reverse the order of "Size" and
> "SevEsFooterGuid", like this:
>
> UINT32 ApEntryPoint;
> UINT16 Size;
> EFI_GUID SevEsFooterGuid;
>
> because then even the "Size" field can be changed (or resized), as a
> function of the footer GUID.
>
> Cool, I'll look into doing this and see how it works out.
>
> Just an update on this idea. This has worked out well, but has a couple of
> caveats. Removing the Qemu change to make the flash mapped read-only in
> the nested page tables, caused the following:
>
> 1. QemuFlashDetected() will attempt to detect how the flash memory device
> behaves. Because it is marked as read-only by the hypervisor, writing
> to the area results in a #NPF for the write-fault. With SEV-ES,
> emulation of the instruction can't be performed (can't read guest
> memory and not provided the faulting instruction bytes), so the vCPU is
> just restarted. This results in an infinite #NPF occurring.
>
> The solution here was to check for SEV-ES being enabled and just return
> false from QemuFlashDetected(). Any downfalls to doing that?
>
> Short-circuiting QemuFlashDetected() on SEV-ES seems appropriate.
>
> However, I don't understand why you return FALSE in that case. You
> should return TRUE. If QemuFlashDetected() returns FALSE, then the UEFI
> variable store will not be backed by the real pflash chip, it will be
> emulated with an \NvVars file on the EFI system partition. That
> emulation should really not be used nowadays.
>
> So IMO the right approach here is:
> - declare that SEV-ES only targets the "two pflash chips" setup
> - return TRUE from QemuFlashDetected() when SEV-ES is on.
>
>
>
> 2. Commit 2db0ccc2d7fe ("UefiCpuPkg: Update CpuExceptionHandlerLib pass
> XCODE5 tool chain") causes a similar situation to #1. It attempts to do
> some address fixups and write to the flash device.
>
> That's... stunning.
>
> Commit 2db0ccc2d7fe changes the file
>
> UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ExceptionHandlerAsm.nasm
>
> such that it does in-place binary patching.
>
> This source file is referenced from:
>
> UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf
>
> as well. Note "SecPei".
>
> That makes the commit buggy, to my eyes, regardless of SEV-ES. Because:
>
> The binary patching appears to occur in the SEC phase as well, i.e. at a
> time when the exception handler is located in flash. That's incorrect on
> physical hardware too.
>
> Upon re-reading <https://bugzilla.tianocore.org/show_bug.cgi?id=849 <https://bugzilla.tianocore.org/show_bug.cgi?id=849>>,
> this commit worked around an XCODE toolchain bug.
>
> Unfortunately, the workaround is not suitable for the SEC phase. (Also
> not suitable for the PEI phase, for such PEIMs that still execute from
> flash.)
>
> Please open a new bug for UefiCpuPkg in the TianoCore Bugzilla,
> reference BZ#849 in the See Also field, and please also make the new bug
> block BZ#2198.
>
> (I'll comment on this issue in a different thread too; I'll CC you on it.)
>
>
> Reverting that commit fixes the issue. I don't think that will be an
> acceptable solution, though, so need to think about what to do here.
>
> After those two changes, the above method works well.
>
> I'm happy to hear!
>
> Thanks,
> Laszlo
>
>
>
>
[-- Attachment #2: Type: text/html, Size: 27810 bytes --]
next prev parent reply other threads:[~2019-10-12 18:50 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-19 19:52 [RFC PATCH v2 00/44] SEV-ES guest support Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 01/44] MdePkg: Create PCDs to be used in support of SEV-ES Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 02/44] OvmfPkg/MemEncryptSevLib: Add an SEV-ES guest indicator function Lendacky, Thomas
2019-09-24 11:53 ` [edk2-devel] " Laszlo Ersek
2019-09-19 19:52 ` [RFC PATCH v2 03/44] OvmfPkg: Add support to perform SEV-ES initialization Lendacky, Thomas
2019-09-24 11:59 ` [edk2-devel] " Laszlo Ersek
2019-09-24 14:43 ` Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 04/44] OvmfPkg/ResetVector: Add support for a 32-bit SEV check Lendacky, Thomas
2019-09-24 13:42 ` [edk2-devel] " Laszlo Ersek
2019-09-24 13:50 ` Laszlo Ersek
2019-09-24 18:57 ` Lendacky, Thomas
2019-09-25 14:45 ` Laszlo Ersek
2019-09-30 19:29 ` Laszlo Ersek
2019-09-30 19:55 ` Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 05/44] MdePkg: Add the MSR definition for the GHCB register Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 06/44] OvmfPkg: Create a GHCB page for use during Sec phase Lendacky, Thomas
2019-09-25 8:09 ` [edk2-devel] " Laszlo Ersek
2019-09-25 17:36 ` Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 07/44] OvmfPkg/PlatformPei: Reserve GHCB-related areas if S3 is supported Lendacky, Thomas
2019-09-25 8:27 ` [edk2-devel] " Laszlo Ersek
2019-09-25 17:52 ` Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 08/44] OvmfPkg: Create GHCB pages for use during Pei and Dxe phase Lendacky, Thomas
2019-09-26 8:00 ` [edk2-devel] " Laszlo Ersek
2019-09-26 14:00 ` Lendacky, Thomas
2019-09-30 18:52 ` Laszlo Ersek
2019-09-30 19:49 ` Lendacky, Thomas
2019-09-30 19:12 ` Laszlo Ersek
2019-09-30 19:51 ` Lendacky, Thomas
2019-10-02 10:23 ` Laszlo Ersek
2019-10-02 14:43 ` Lendacky, Thomas
2019-10-02 15:55 ` Laszlo Ersek
2019-09-19 19:52 ` [RFC PATCH v2 09/44] MdeModulePkg/DxeIplPeim: Support GHCB pages when creating page tables Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 10/44] OvmfPkg: A per-CPU variable area for #VC usage Lendacky, Thomas
2019-09-26 8:17 ` [edk2-devel] " Laszlo Ersek
2019-09-26 14:46 ` Lendacky, Thomas
2019-09-30 19:15 ` Laszlo Ersek
2019-09-30 19:52 ` Lendacky, Thomas
2019-10-02 11:51 ` Laszlo Ersek
2019-10-02 16:06 ` Lendacky, Thomas
2019-10-03 9:06 ` Laszlo Ersek
2019-09-19 19:52 ` [RFC PATCH v2 11/44] OvmfPkg/PlatformPei: Move early GDT into ram when SEV-ES is enabled Lendacky, Thomas
2019-10-02 12:05 ` [edk2-devel] " Laszlo Ersek
2019-10-02 16:10 ` Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 12/44] MdePkg: Add a structure definition for the GHCB Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 13/44] MdePkg/BaseLib: Add support for the VMGEXIT instruction Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 14/44] UefiCpuPkg: Implement library support for VMGEXIT Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 15/44] UefiCpuPkg/CpuExceptionHandler: Add base support for the #VC exception Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 16/44] OvmfPkg/MemEncryptSevLib: Make MemEncryptSevLib available during SEC Lendacky, Thomas
2019-10-02 12:24 ` [edk2-devel] " Laszlo Ersek
2019-10-02 12:30 ` Laszlo Ersek
2019-10-02 16:16 ` Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 17/44] UefiCpuPkg/CpuExceptionHandler: Add #VC exception handling for Sec phase Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 18/44] OvmfPkg/Sec: Enable cache early to speed up booting Lendacky, Thomas
2019-10-02 12:31 ` [edk2-devel] " Laszlo Ersek
2019-09-19 19:52 ` [RFC PATCH v2 19/44] UefiCpuPkg/CpuExceptionHandler: Add support for IOIO_PROT NAE events Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 20/44] UefiCpuPkg/CpuExceptionHandler: Support string IO " Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 21/44] MdePkg: Add support for the XGETBV instruction Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 22/44] UefiCpuPkg/CpuExceptionHandler: Add support for CPUID NAE events Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 23/44] UefiCpuPkg/CpuExceptionHandler: Add support for MSR_PROT " Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 24/44] UefiCpuPkg/CpuExceptionHandler: Add support for NPF NAE events (MMIO) Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 25/44] UefiCpuPkg/CpuExceptionHandler: Add support for WBINVD NAE events Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 26/44] UefiCpuPkg/CpuExceptionHandler: Add support for RDTSC " Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 27/44] UefiCpuPkg/CpuExceptionHandler: Add support for RDPMC " Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 28/44] UefiCpuPkg/CpuExceptionHandler: Add support for INVD " Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 29/44] UefiCpuPkg/CpuExceptionHandler: Add support for VMMCALL " Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 30/44] UefiCpuPkg/CpuExceptionHandler: Add support for RDTSCP " Lendacky, Thomas
2019-09-19 19:52 ` [RFC PATCH v2 31/44] UefiCpuPkg/CpuExceptionHandler: Add support for MONITOR/MONITORX " Lendacky, Thomas
2019-09-19 19:53 ` [RFC PATCH v2 32/44] UefiCpuPkg/CpuExceptionHandler: Add support for MWAIT/MWAITX " Lendacky, Thomas
2019-09-19 19:53 ` [RFC PATCH v2 33/44] UefiCpuPkg/CpuExceptionHandler: Add support for DR7 Read/Write " Lendacky, Thomas
2019-09-19 19:53 ` [RFC PATCH v2 34/44] UefiCpuPkg/MpInitLib: Update CPU MP data with a flag to indicate if SEV-ES is active Lendacky, Thomas
2019-09-19 19:53 ` [RFC PATCH v2 35/44] MdeModulePkg: Reserve a 16-bit protected mode code segment descriptor Lendacky, Thomas
2019-09-19 19:53 ` [RFC PATCH v2 36/44] UefiCpuPkg: Add " Lendacky, Thomas
2019-09-19 19:53 ` [RFC PATCH v2 37/44] OvmfPkg: Add support for SEV-ES AP reset vector re-directing Lendacky, Thomas
2019-10-02 14:54 ` [edk2-devel] " Laszlo Ersek
2019-10-02 17:33 ` Lendacky, Thomas
2019-10-03 9:09 ` Laszlo Ersek
2019-09-19 19:53 ` [RFC PATCH v2 38/44] UefiCpuPkg: Allow AP booting under SEV-ES Lendacky, Thomas
2019-10-02 15:15 ` [edk2-devel] " Laszlo Ersek
2019-10-02 15:26 ` Laszlo Ersek
2019-10-02 18:07 ` Lendacky, Thomas
2019-10-03 10:12 ` Laszlo Ersek
2019-10-03 10:32 ` Laszlo Ersek
2019-10-03 15:12 ` Lendacky, Thomas
2019-10-10 23:17 ` Lendacky, Thomas
2019-10-10 23:56 ` Andrew Fish
2019-10-11 8:56 ` Laszlo Ersek
2019-10-12 6:42 ` Andrew Fish
2019-10-12 7:46 ` Liming Gao
2019-10-12 18:50 ` Andrew Fish [this message]
2019-10-14 13:11 ` Laszlo Ersek
2019-10-14 19:11 ` Andrew Fish
2019-10-02 17:58 ` Lendacky, Thomas
2019-10-03 9:21 ` Laszlo Ersek
2019-09-19 19:53 ` [RFC PATCH v2 40/44] MdePkg: Add a finalization function to the CPU protocol Lendacky, Thomas
2019-09-20 13:16 ` [RFC PATCH v2 39/44] OvmfPkg: Move the GHCB allocations into reserved memory Lendacky, Thomas
2019-10-02 14:38 ` [edk2-devel] " Laszlo Ersek
2019-09-20 13:16 ` [RFC PATCH v2 41/44] UefiCpuPkg/MpInitLib: Add MP finalization interface to MpInitLib Lendacky, Thomas
2019-09-20 13:16 ` [RFC PATCH v2 42/44] UefiCpuPkg/MpInitLib: Prepare SEV-ES guest APs for OS use Lendacky, Thomas
2019-12-12 8:24 ` Ni, Ray
2019-12-13 16:35 ` Lendacky, Thomas
2019-09-20 13:16 ` [RFC PATCH v2 43/44] UefiCpuPkg/CpuDxe: Provide an DXE MP finalization routine to support SEV-ES Lendacky, Thomas
2019-09-20 13:16 ` [RFC PATCH v2 44/44] MdeModulePkg/DxeCore: Perform the CPU protocol finalization support Lendacky, Thomas
2019-09-20 19:24 ` [RFC PATCH v2 00/44] SEV-ES guest support Lendacky, Thomas
2019-09-24 1:55 ` [edk2-devel] " Dong, Eric
2019-09-24 14:31 ` Lendacky, Thomas
2019-09-25 22:31 ` Ni, Ray
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=3391DF85-25CC-4B8B-AEBF-0CB833B7713F@apple.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