From: "Andrew Fish" <afish@apple.com>
To: "Gao, Liming" <liming.gao@intel.com>
Cc: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"lersek@redhat.com" <lersek@redhat.com>,
Jordan Justen <jordan.l.justen@intel.com>
Subject: Re: [edk2-devel] [Patch 11/12] OvmfPkg: Enable CLANG9 tool chain
Date: Thu, 10 Oct 2019 09:29:17 -0700 [thread overview]
Message-ID: <1F7679F4-4AE7-4795-9850-E4144B96B419@apple.com> (raw)
In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14E51572A@SHSMSX104.ccr.corp.intel.com>
[-- Attachment #1: Type: text/plain, Size: 6381 bytes --]
Liming,
I'm OK with not regressing OVMF, I understand the concept of technical debt.
I'd point out that this is likely a generic issue with the SecurityPkg that was worked around in OVMF.
Also it looks to me like passing those flags violate the calling convention [1]. Maybe that is why the linker had an issue?
int drbg_add(const void *buf, int num, double randomness);
>From what I can tell without the flag randomness gets passed in XMM2, with the flags it gets passed on the stack. Seems clang is not happy with that. But the optimizer violates the calling conventions too, so as long as nothing is public with a floating point API it should not break anything.
Yikes I crashed clang passing in -mno-mmx -mno-sse. It might be a good idea to not pass -mno-mmx -mno-sse to clang in general for any target that is x86_64-pc-win32.
[1] UEFI Spec...
Return values that fix into 64-bits are returned in the Rax register. If the return value does not fit within 64-bits, then the caller must allocate and pass a pointer for the return value as the first argument, Rcx. Subsequent arguments are then shifted one argument to the right, so for example argument one would be passed in Rdx. User-defined types to be returned must be 1,2,4,8,16,32, or 64 bits in length.
The registers Rax, Rcx Rdx R8, R9, R10, R11, and XMM0-XMM5 are volatile and are, therefore, destroyed on function calls.
The registers RBX, RBP, RDI, RSI, R12, R13, R14, R15, and XMM6-XMM15 are considered nonvolatile and must be saved and restored by a function that uses them.
Function pointers are pointers to the label of the respective function and don’t require special treatment. A caller must always call with the stack 16-byte aligned.
For MMX, XMM and floating-point values, return values that can fit into 64-bits are returned through RAX (including MMX types). However, XMM 128-bit types, floats, and doubles are returned in XMM0. The floating point status register is not saved by the target function. Floating-point and double-precision arguments are passed in XMM0 - XMM3 (up to 4) with the integer slot (RCX, RDX, R8, and R9) that would normally be used for that cardinal slot being ignored (see example) and vice versa. XMM types are never passed by immediate value but rather a pointer will be passed to memory allocated by the caller. MMX types will be passed as if they were integers of the same size. Callees must not unmask exceptions without providing correct exception handlers.
In addition, unless otherwise specified by the function definition, all other CPU registers (including MMX and XMM) are preserved.
Thanks,
Andrew Fish
> On Oct 10, 2019, at 5:18 AM, Gao, Liming <liming.gao@intel.com> wrote:
>
>
>
>> -----Original Message-----
>> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Laszlo Ersek
>> Sent: Thursday, October 10, 2019 3:35 PM
>> To: Andrew Fish <afish@apple.com>; Gao, Liming <liming.gao@intel.com>
>> Cc: devel@edk2.groups.io
>> Subject: Re: [edk2-devel] [Patch 11/12] OvmfPkg: Enable CLANG9 tool chain -
>>
>> Hi Andrew,
>>
>> On 10/09/19 18:22, Andrew Fish wrote:
>>
>>> I thought the thing we were discussing was compiler flags.
>>> Specifically -mno-mmx -mno-sse. It seems to me if OVMF requires
>>> -mno-mmx -mno-sse then it is a bug in the tools_def.txt definition
>>> for those compilers? As far as I can tell -mno-implicit-float should
>>> prevent the optimizer from using floating point. The -mno-mmx
>>> -mno-sse flags most change how floating point code gets compiled [1].
>>> it looks like -mno-mmx -mno-sse just down grade floating point
>>> instructions that get used. Thus it seems like either we have some
>>> code doing float and that code should set -mno-mmx -mno-sse, or the
>>> -mno-mmx -mno-sse should be set generically.
>>
>> The origin of those build flags in OVMF is commit 4a8266f570ef
>> ("OvmfPkg: Work around issue seen with kvm + grub2 (efi)", 2010-12-31):
>>
>> OvmfPkg: Work around issue seen with kvm + grub2 (efi)
>>
>> When OVMF is run with kvm and grub2 (efi), an exception
>> occurs when mmx/sse registers are accessed.
>>
>> As a work around, this change eliminates firmware usage
>> of these register types.
>>
>> First, only the BaseMemoryLib implementation
>> MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf
>> is used.
>>
>> Second, the GCC compiler is passes the additional
>> '-mno-mmx -mno-sse' parameters.
>>
>> The eternal problem with this kind of workaround is that we never know
>> when it becomes safe to remove.
>>
>> It would be nice to understand the exact details around the problem.
>> Given that the commit is from 2010, I assume the issue is difficult to
>> reproduce with recent components (KVM, grub2). On the other hand, if we
>> just remove the flags (which we should, in a perfect world), someone
>> could report a bug in three months: "my host distro upgraded the OVMF
>> package to the next edk2-stableYYYYMM tag, and now my virtual machine,
>> which runs a distro from 2009, no longer boots". (We've seen similar
>> reports before.)
>
> Yes. I agree it is hard to decide to remove this option, because we don't know its impact.
> With the option -mno-mmx -mno-sse, it will cause CLANG9 linker failure like below. So, I say
> this patch is to support the different linker.
>
> 0. Program arguments: C:\Program Files\LLVM\bin\lld-link.EXE /OUT:d:\allpkg\edk2\Build\Ovmf3264\DEBUG_CLANG9\X64\Se
> curityPkg\VariableAuthenticated\SecureBootConfigDxe\SecureBootConfigDxe\DEBUG\SecureBootConfigDxe.dll /NOLOGO /NODEFAULT
> LIB /IGNORE:4001 /OPT:REF /OPT:ICF=10 /ALIGN:32 /FILEALIGN:32 /SECTION:.xdata,D /SECTION:.pdata,D /Machine:X64 /DLL /ENT
> RY:_ModuleEntryPoint /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /SAFESEH:NO /BASE:0 /DEBUG:GHASH /lldmap @d:\allpkg\edk2\Build\O
> vmf3264\DEBUG_CLANG9\X64\SecurityPkg\VariableAuthenticated\SecureBootConfigDxe\SecureBootConfigDxe\OUTPUT\static_library
> _files.lst
> 1. Running pass 'Function Pass Manager' on module 'ld-temp.o'.
> 2. Running pass 'X86 FP Stackifier' on function '@drbg_add'
> #0 0x00007ff696bad7f8 C:\Program Files\LLVM\bin\lld-link.EXE 0x148d7f8 C:\Program Files\LLVM\bin\lld-link.EXE 0x142ba7f
>
> Thanks
> Liming
>>
>> Thanks
>> Laszlo
>>
>>
[-- Attachment #2: Type: text/html, Size: 20931 bytes --]
next prev parent reply other threads:[~2019-10-10 16:29 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-27 7:46 [Patch 00/12] New Cross OS tool chain CLANG9 Liming Gao
2019-09-27 7:46 ` [Patch 01/12] BaseTools tools_def.template: Remove unnecessary $(DEST_DIR_DEBUG) path Liming Gao
2019-09-27 7:46 ` [Patch 02/12] BaseTools tools_def: Add CLANG9 tool chain to directly generate PE image Liming Gao
2019-09-27 10:13 ` [edk2-devel] " Philippe Mathieu-Daudé
2019-09-27 7:46 ` [Patch 03/12] BaseTools GenFw: Fix the issue to update the wrong size as SectionSize Liming Gao
2019-09-27 10:15 ` [edk2-devel] " Philippe Mathieu-Daudé
2019-09-27 7:46 ` [Patch 04/12] MdePkg Base.h: Add definition for CLANG9 tool chain Liming Gao
2019-09-27 7:46 ` [Patch 05/12] MdePkg BaseIoLibIntrinsic: Remove __inline__ attribute for IO functions Liming Gao
2019-09-30 20:35 ` [edk2-devel] " Laszlo Ersek
2019-09-30 21:11 ` Andrew Fish
2019-10-08 14:47 ` Liming Gao
2019-10-08 20:22 ` Laszlo Ersek
2019-10-10 12:32 ` Liming Gao
2019-10-10 16:32 ` Laszlo Ersek
2019-10-11 1:28 ` Liming Gao
2019-10-11 19:22 ` Jordan Justen
2019-10-12 6:18 ` Liming Gao
2019-09-27 7:46 ` [Patch 06/12] MdeModulePkg LzmaCustomDecompressLib: Update macro to be same in CLANG tool Liming Gao
2019-09-27 7:46 ` [Patch 07/12] MdeModulePkg RegularExpressionDxe: Disable warning for CLANG9 tool chain Liming Gao
2019-09-27 7:46 ` [Patch 08/12] CryptoPkg: Append options to make CLANG9 tool chain pass build Liming Gao
2019-09-27 7:46 ` [Patch 09/12] CryptoPkg IntrinsicLib: Make _fltused always be used Liming Gao
2019-09-27 8:34 ` [edk2-devel] " Yao, Jiewen
2019-09-29 6:32 ` Liming Gao
2019-09-27 7:46 ` [Patch 10/12] EmulatorPkg: Enable CLANG9 tool chain Liming Gao
2019-09-27 7:46 ` [Patch 11/12] OvmfPkg: " Liming Gao
2019-09-30 20:42 ` [edk2-devel] " Laszlo Ersek
2019-10-08 15:02 ` Liming Gao
2019-10-08 22:29 ` Laszlo Ersek
2019-10-08 23:08 ` Andrew Fish
2019-10-09 13:43 ` Laszlo Ersek
2019-10-09 14:44 ` Liming Gao
2019-10-09 16:22 ` [edk2-devel] [Patch 11/12] OvmfPkg: Enable CLANG9 tool chain - Andrew Fish
2019-10-10 7:35 ` Laszlo Ersek
2019-10-10 12:18 ` Liming Gao
2019-10-10 16:29 ` Andrew Fish [this message]
2019-10-10 16:43 ` Laszlo Ersek
2019-10-11 1:47 ` Liming Gao
2019-10-11 9:57 ` Laszlo Ersek
2019-10-11 9:37 ` [edk2-devel] [Patch 11/12] OvmfPkg: Enable CLANG9 tool chain Laszlo Ersek
2019-10-12 8:22 ` Liming Gao
2019-09-27 7:46 ` [Patch 12/12] OvmfPkg SecMain: Add build option "-fno-omit-frame-pointer" for CLANG9 X64 Liming Gao
2019-09-30 21:09 ` [edk2-devel] " Laszlo Ersek
2019-10-08 15:09 ` Liming Gao
[not found] ` <15CBB488DC5DB3E9.15045@groups.io>
2019-10-10 14:08 ` Liming Gao
2019-10-10 17:35 ` Laszlo Ersek
2019-10-11 1:30 ` Liming Gao
2019-10-11 9:48 ` Laszlo Ersek
2019-09-27 8:33 ` [edk2-devel] [Patch 00/12] New Cross OS tool chain CLANG9 Yao, Jiewen
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=1F7679F4-4AE7-4795-9850-E4144B96B419@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