Mike,

This is a good way to play around with fixes, and to report bugs. You can see 
the assembler for different compilers with different flag. 

https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEINIADqgKhE4MHt6%2B/qRJKY4CIWGRLDFx0naYDmlCBEzEBBk%2BfgEVVQI1dQSFEdGx8ba19Y1ZLYNdoT0lfZIAlLaoXsTI7BwA9KsA1AAqAJ4JmBs7C8QbaFgbCLGYpBskG7SoTOgbhhuYqqwJ9AB0JhoAgqECBsFABHLx1TAQIEbBg%2BGYbEwAdisAI26I2xEwBEWDFhPg2ACp8SwTABmVH/ZEAEQ4c1onAArLw/BwtKRUJw3NZrCDjstEWYyTxSARNHS5gBrECMjT6TiSFnijmcXgKEBysVsumkOCwJBoFgJOixciUQ3G%2BhxYBcMxcPh0AixdUQKLKqKhOo7Tgiw1sQQAeQYtG92tIWBYhmA4jD%2BCxVQAbph1WH3pUvE6fbwgZgGWHaHgosQvR4sMqCMQ8Cws3MqAZgAoAGp4TAAdwD%2B1ZIv4ghEYnYUhkgkUKnUYd09oMRhQPMs%2BkL6sgc1QCXyDBTAFoA2SNhvI0sEOTqQpJTsDJLMGrc5U1y4GO5PE09MEJsVSnpcqkBMM/PbP2vujfPp7VaNcOiGR8shA682gYcDxiKXo4hAsYfz0BQxkApCJDmBR%2BQHUUsRWHh6SZJUw05DhVAADgANg3WjJA2YBkGQDZbW%2BLgNggblLGsG5cEIO5zGFG4PCNE0ThErgZl4LUtDmCADVQCSrTNCALUklApxtSQNDlGhaCdYgXTdMMPWYYhQ19FT/QIIMQ2VCMoxjdk4xvPAkxTdk02QDNiOzQRc2VAsixLDAVnZCsqxrPh6ybFt207LMh2EURxEHHt5CUNRlV0AIdJnPi51CxcIGXVc0k3bdd33ZBDzJY9T3PS9bBg28IFcND7RfRCpmQnJki/dJIN/Qa8jSLD%2BvQ9rqlQ0aZvsMDMNfbCUM6bqBk6Kb3xk%2BZFmWPQK0wALSI4ZlSFZdlKJo%2BjGNOHT2Mkb4NBe7jeKsOcNkEogpKFe0NnEy1YkFMkzFk0VxUUpB8CoKh1KyvsMukLKR1y/MEHVSdMdhqgCD2dg5WITHsmJhRcfx/YNTOi6rt4SjqTwOGNmbNsQduhimJYtiOK4hMFA2Dn7uQR6pBel65KhqUZTlPNFUu5VKLVbJ5IleUODMcjrtVSHtRmOYkxMtJ4iAA

Sorry I’m traveling and in Cupertino with lots of meetings so I did not have 
time to adjust the compiler flags….

Thanks,

Andrew Fish

> On May 18, 2023, at 10:24 AM, Andrew (EFI) Fish <af...@apple.com> wrote:
> 
> Mike,
> 
> I guess my other question… If this turns out to be a compiler bug should we 
> scope the change to the broken toolchain. I’m not sure what the right answer 
> is for that, but I want to ask the question? 
> 
> Thanks,
> 
> Andrew Fish
> 
>> On May 18, 2023, at 10:19 AM, Michael D Kinney <michael.d.kin...@intel.com> 
>> wrote:
>> 
>> Andrew,
>>  
>> This might work for XIP.  Set non const global to initial value that is 
>> expected value to stay in dead loop.
>>  
>> UINTN  mDeadLoopCount = 0;
>>  
>> VOID
>> CpuDeadLoop(
>>   VOID
>>   ) 
>> {
>>   while (mDeadLoopCount == 0) {
>>       CpuPause();
>>   }
>> }
>>  
>> When deadloop is entered, developer can not change value of mDeadLoopCount, 
>> but they can use debugger to force exit loop and return from function.
>>  
>> Mike
>>  
>>  
>> From: Andrew (EFI) Fish <af...@apple.com <mailto:af...@apple.com>> 
>> Sent: Thursday, May 18, 2023 10:09 AM
>> To: Kinney, Michael D <michael.d.kin...@intel.com 
>> <mailto:michael.d.kin...@intel.com>>
>> Cc: edk2-devel-groups-io <devel@edk2.groups.io 
>> <mailto:devel@edk2.groups.io>>; Ni, Ray <ray...@intel.com 
>> <mailto:ray...@intel.com>>; Rebecca Cran <rebe...@bsdio.com 
>> <mailto:rebe...@bsdio.com>>
>> Subject: Re: [edk2-devel] CpuDeadLoop() is optimized by compiler
>>  
>> Mike,
>>  
>> Good point, that is why we are using the stack ….
>>  
>> The only other thing I can think of is to pass the address of Index to some 
>> inline assembler, or an asm no op function, to give it a side effect the 
>> compiler can’t resolve. 
>>  
>> Thanks,
>>  
>> Andrew Fish
>> 
>> 
>> On May 18, 2023, at 10:05 AM, Kinney, Michael D <michael.d.kin...@intel.com 
>> <mailto:michael.d.kin...@intel.com>> wrote:
>>  
>> Static global will not work for XIP
>>  
>> Mike
>>  
>> From: Andrew (EFI) Fish <af...@apple.com <mailto:af...@apple.com>> 
>> Sent: Thursday, May 18, 2023 9:49 AM
>> To: edk2-devel-groups-io <devel@edk2.groups.io 
>> <mailto:devel@edk2.groups.io>>; Kinney, Michael D 
>> <michael.d.kin...@intel.com <mailto:michael.d.kin...@intel.com>>
>> Cc: Ni, Ray <ray...@intel.com <mailto:ray...@intel.com>>; Rebecca Cran 
>> <rebe...@bsdio.com <mailto:rebe...@bsdio.com>>
>> Subject: Re: [edk2-devel] CpuDeadLoop() is optimized by compiler
>>  
>> Mike,
>>  
>> I pinged some compiler experts to see if our code is correct, or if the 
>> compiler has an issue. Seems to be trending compiler issue right now, but 
>> I’ve NOT gotten feedback from anyone on the spec committee yet. 
>>  
>> If we move Index to a static global that would likely work around the 
>> compiler issue.
>>  
>> Thanks,
>>  
>> Andrew Fish
>> 
>> 
>> 
>> On May 18, 2023, at 8:36 AM, Michael D Kinney <michael.d.kin...@intel.com 
>> <mailto:michael.d.kin...@intel.com>> wrote:
>>  
>> Hi Ray,
>>  
>> So the code generated does deadloop, but is just not easy to resume from as 
>> we have been able to do in the past.
>>  
>> We use CpuDeadloop() for 2 purposes.  One is a terminal condition with no 
>> reason to ever continue.
>>  
>> The 2nd is a debug aide for developers to halt the system at a specific 
>> location and then continue from that point, usually with a debugger, to step 
>> through code to an area to evaluate unexpected behavior.
>>  
>> We may have to do a NASM implementation of CpuDeadloop() to make sure it 
>> meets both use cases.
>>  
>> Mike
>>  
>> From: Ni, Ray <ray...@intel.com <mailto:ray...@intel.com>> 
>> Sent: Thursday, May 18, 2023 3:00 AM
>> To: devel@edk2.groups.io <mailto:devel@edk2.groups.io>
>> Cc: Kinney, Michael D <michael.d.kin...@intel.com 
>> <mailto:michael.d.kin...@intel.com>>; Rebecca Cran <rebe...@bsdio.com 
>> <mailto:rebe...@bsdio.com>>; Ni, Ray <ray...@intel.com 
>> <mailto:ray...@intel.com>>
>> Subject: CpuDeadLoop() is optimized by compiler
>>  
>> Hi,
>> Starting from certain version of Visual Studio C compiler (I don’t have the 
>> exact version. I am using VS2019), CpuDeadLoop is now optimized quite well 
>> by compiler.
>>  
>> The optimization is so “good” that it becomes harder for developers to break 
>> out of the deadloop.
>>  
>> I copied the assembly instructions as below for your reference.
>> The compiler does not generate instructions that jump out of the loop when 
>> the Index is not zero.
>> So in order to break out of the loop, developers need to:
>> Manually adjust rsp by increasing 40
>> Manually “ret”
>>  
>> I am not sure if anyone has interest to re-write this function so that 
>> compiler can be “fooled” again.
>> Thanks,
>> Ray
>>  
>> =======================
>> ; Function compile flags: /Ogspy
>> ; File e:\work\edk2\MdePkg\Library\BaseLib\CpuDeadLoop.c
>> ;              COMDAT CpuDeadLoop
>> _TEXT    SEGMENT
>> Index$ = 48
>> CpuDeadLoop PROC                                                             
>>        ; COMDAT
>>  
>> ; 26   : {
>>  
>> $LN12:
>>   00000  48 83 ec 28         sub        rsp, 40                              
>>   ; 00000028H
>>  
>> ; 27   :   volatile UINTN  Index;
>> ; 28   : 
>> ; 29   :   for (Index = 0; Index == 0;) {
>>  
>>   00004  48 c7 44 24 30
>>                00 00 00 00        mov      QWORD PTR Index$[rsp], 0
>> $LN10@CpuDeadLoo:
>>  
>> ; 30   :     CpuPause ();
>>  
>>   0000d  48 8b 44 24 30   mov      rax, QWORD PTR Index$[rsp]
>>   00012  e8 00 00 00 00   call        CpuPause
>>   00017  eb f4                     jmp       SHORT $LN10@CpuDeadLoo
>> CpuDeadLoop ENDP
>> _TEXT    ENDS
>> END
>>  
>>  
>>  
>> 
> 



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#105048): https://edk2.groups.io/g/devel/message/105048
Mute This Topic: https://groups.io/mt/98987896/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: 
https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to