> On May 25, 2016, at 9:43 AM, Shi, Steven <steven....@intel.com> wrote:
> 
> Hi Andrew,
> For the Clang LTO generate wrong code on Qemu X64 issue, I found it is 
> related to the high address (>2G) wrong sign-extend displacements to 64 bits. 
> E.g. I hope “jmp qword ptr 0xfffcdd54[0]” in 64 bits mode is to jump to the 
> address in [0x00000000fffcdd54+0], but in fact, clang lto generate 
> instruction to jump to address in [0xfffffffffffcdd54+0]. Qemu X64 is very 
> special that its SecMain run in 64 bits mode, and its execution address 
> happen to be 0x00000000fffcxxxx. If there is any instruction need indirect 
> address access, the clang lto code will wrong access very high 
> 0xfffffffffffcxxxx rang, which cause page fault error in Qemu X64 sec. This 
> is why this issue does not happen in IA32 tip, but only in X64 tip.
>  
> BTW, could you help to build the XCode LTO Qemu X64 image as below and send 
> it (edk2\Build\OvmfX64\DEBUG_CLANGLTO38\FV\OVMF.fd) to me to test whether the 
> XCode LTO Qemu X64 image really work?
> build -a X64 -t CLANGLTO38(replace it with your XCodeLTO tool chain) -p 
> OvmfPkg/OvmfPkgX64.dsc -n 5 -b DEBUG -DDEBUG_ON_SERIAL_PORT
>  
> Below is this issue detail info:
> You know, Clang LTO aggressively inline (or collapse) code together, and then 
> like to use many Jump far, absolute indirect, instructions, which is quite 
> different from Clang normal build. In the attachment, there is a LTO assembly 
> code example of MdePkg\Library\BasePrintLib\PrintLibInternal.c. You can 
> create it with below command:
> build -a X64 -t CLANGLTO38(replace it with your XCodeLTO tool chain) -p 
> OvmfPkg/OvmfPkgX64.dsc -n 5 -b DEBUG -DDEBUG_ON_SERIAL_PORT -m 
> MdePkg/Library/BasePrintLib/BasePrintLib.inf
> llc 
> Build/OvmfX64/DEBUG_CLANGLTO38/X64/MdePkg/Library/BasePrintLib/BasePrintLib/OUTPUT/PrintLibInternal.obj
>  -o PrintLibInternal.s
>  
> And in this PrintLibInternal.s, you can see the Clang LTO use two indirect 
> Jump far as below. These two indirect Jump far cause the Qemu X64 SecMain 
> page fault.
> # /home/jshi19/edk2-fork/MdePkg/Library/BasePrintLib/PrintLibInternal.c:446:9
>                 ...
>                 jmpq     *.LJTI3_0(,%rdx,8)
>                 ...
>  
> # /home/jshi19/edk2-fork/MdePkg/Library/BasePrintLib/PrintLibInternal.c:528:7
>                 ....
>                 jmpq     *.LJTI3_1(,%rax,8)
>                 ...
>  
> .LJTI3_0:
>                 .quad    .LBB3_36
>                 .quad    .LBB3_33
>                 .quad    .LBB3_35
>                 ... ...
>  
> .LJTI3_1:
>                 .quad    .LBB3_56
>                 .quad    .LBB3_26
>                 .quad    .LBB3_89
>                 ...
>  
> To more clearly show the page fault arch info, I leaverage Simics MinnowMax 
> to re-run the Qemu X64 SecMain LTO code to reproduce it. I add one more line 
> in line 528 to let simics stop just before the page fault point. You can see 
> the new PrintLibInternal.c and its LTO assembly code in attached 
> PrintLibInternal.c-Simics and PrintLibInternal.s-Simics. Below is the page 
> fault point:
>  
>                 .loc         2 528 7 is_stmt 0       # 
> /home/jshi19/edk2-fork/MdePkg/Library/BasePrintLib/PrintLibInternal.c:528:7
>                 callq       MAGIC_SHOW_VALUE
>                 .loc         2 529 15 is_stmt 1      # 
> /home/jshi19/edk2-fork/MdePkg/Library/BasePrintLib/PrintLibInternal.c:529:15
>                 movq    -416(%rbp), %rax
>                 .loc         2 529 7 is_stmt 0       # 
> /home/jshi19/edk2-fork/MdePkg/Library/BasePrintLib/PrintLibInternal.c:529:7
>                 cmpq     $87, %rax
>                 jle           .LBB3_66
> # BB#72:                                #   in Loop: Header=BB3_23 Depth=1
>                 leaq       -97(%rax), %rcx
>                 cmpq     $23, %rcx
>                 ja            .LBB3_73
> # BB#76:                                #   in Loop: Header=BB3_23 Depth=1
>                 jmpq     *.LJTI3_0(,%rcx,8)
>                 … …
>  
> In below Simics, you can clearly see the “jmp qword ptr 0xfffcdd54[rcx*8]” 
> instruction cause the processor access logic address 0xfffffffffffcdd54 (not 
> we hoped 0x00000000fffcdd54)

Steven,

Can you dump the bytes for the instruction and look it up in the Intel manual. 
I did not think that a jmp does a sign extend? I usually dump the code in lldb 
to get the byte, assembly, and source mixed together so I'm not sure how to do 
it in your setup.

Thanks,

Andrew Fish

> which cause page fault exception, then the page fault trigger General 
> Protection (Exception 13) because there is not exception handler in Sec parse.
> <image002.png>
> The content in [0x00000000fffcdd54] is 0x00000000FFFCC8FA as below
> <image001.png>
>  
> There is no page table to map logic address 0xfffffffffffcdd54, so there is 
> no content in [0xfffffffffffcdd54] :
> <image003.png>
>  
>  
>  
>  
> Steven Shi
> Intel\SSG\STO\UEFI Firmware
>  
> Tel: +86 021-61166522
> iNet: 821-6522
>  
>  <> 
> <PrintLibInternal.s><PrintLibInternal.s-Simics><PrintLibInternal.c-Simics>

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to