From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from ma-mailsvcp-mx-lapp01.apple.com (ma-mailsvcp-mx-lapp01.apple.com [17.32.222.22]) by mx.groups.io with SMTP id smtpd.web10.150.1684435556321163676 for ; Thu, 18 May 2023 11:45:56 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@apple.com header.s=20180706 header.b=NwJVYDCz; spf=pass (domain: apple.com, ip: 17.32.222.22, mailfrom: afish@apple.com) Received: from rn-mailsvcp-mta-lapp02.rno.apple.com (rn-mailsvcp-mta-lapp02.rno.apple.com [10.225.203.150]) by ma-mailsvcp-mx-lapp01.apple.com (Oracle Communications Messaging Server 8.1.0.22.20230228 64bit (built Feb 28 2023)) with ESMTPS id <0RUV00YV0ASIIQ20@ma-mailsvcp-mx-lapp01.apple.com> for devel@edk2.groups.io; Thu, 18 May 2023 11:45:55 -0700 (PDT) X-Proofpoint-GUID: HPhewSOgft71Jokdff0N88IqBJ9MSt4T X-Proofpoint-ORIG-GUID: HPhewSOgft71Jokdff0N88IqBJ9MSt4T X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.573,18.0.957 definitions=2023-05-18_13:2023-05-17,2023-05-18 signatures=0 X-Proofpoint-Spam-Details: rule=interactive_user_notspam policy=interactive_user score=0 phishscore=0 adultscore=0 malwarescore=0 mlxlogscore=999 bulkscore=0 spamscore=0 mlxscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2304280000 definitions=main-2305180153 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apple.com; h=from : message-id : content-type : mime-version : subject : date : in-reply-to : cc : to : references; s=20180706; bh=Z8Qc9E1BM5DtC6Q9VWWd/twlwpzjc2up+vkQpJXrIUY=; b=NwJVYDCzccGU3a2VLpHiOHmMlgN9UciHihXD9qubLYP/ppPba5pPeHDramVXhvNdnSZd Jr8EJ/uvcT8GTBJlAgqj0HFL18jKartCdRXTAtwkboozhiyKIvRx2HMDrg14RchY7VNV OHuudKSeO7prQ/f7t+rZd8WNFD9CtOpx4HHiNxXi4AJ1a7rJaKGPqjvYLRI2w45abemA UjMm4ItHet+xfr7NBV2CzimUJVNpyOmAy7lHYE1m97DJDXF7FL8xpYIj352WeCV7ted1 Fyj3Mp0zyeq+s3NwcQ1dR9weMDvQn9ZuGLwuUaHq49hEg5Aaw5ybXhm+YB93EubplNUs sQ== Received: from rn-mailsvcp-policy-lapp01.rno.apple.com (rn-mailsvcp-policy-lapp01.rno.apple.com [17.179.253.18]) by rn-mailsvcp-mta-lapp02.rno.apple.com (Oracle Communications Messaging Server 8.1.0.22.20230228 64bit (built Feb 28 2023)) with ESMTPS id <0RUV00Y1KASIN400@rn-mailsvcp-mta-lapp02.rno.apple.com>; Thu, 18 May 2023 11:45:54 -0700 (PDT) Received: from process_milters-daemon.rn-mailsvcp-policy-lapp01.rno.apple.com by rn-mailsvcp-policy-lapp01.rno.apple.com (Oracle Communications Messaging Server 8.1.0.22.20230228 64bit (built Feb 28 2023)) id <0RUV00T00ASG4N00@rn-mailsvcp-policy-lapp01.rno.apple.com>; Thu, 18 May 2023 11:45:54 -0700 (PDT) X-Va-A: X-Va-T-CD: 70a38c3f5b1d46c4b8dccb3b011be358 X-Va-E-CD: 156d5ae2ad5b70872c2d8b4f187426ab X-Va-R-CD: faed37d9f0280288bcb510df700d8485 X-Va-ID: a102b5bd-5701-4f03-901a-18e7375da555 X-Va-CD: 0 X-V-A: X-V-T-CD: 70a38c3f5b1d46c4b8dccb3b011be358 X-V-E-CD: 156d5ae2ad5b70872c2d8b4f187426ab X-V-R-CD: faed37d9f0280288bcb510df700d8485 X-V-ID: 4818e2b4-1a7d-4c21-994d-36bd350078a4 X-V-CD: 0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.573,18.0.957 definitions=2023-05-18_13:2023-05-17,2023-05-18 signatures=0 Received: from smtpclient.apple (unknown [17.115.1.186]) by rn-mailsvcp-policy-lapp01.rno.apple.com (Oracle Communications Messaging Server 8.1.0.22.20230228 64bit (built Feb 28 2023)) with ESMTPSA id <0RUV00HO2ASGWA00@rn-mailsvcp-policy-lapp01.rno.apple.com>; Thu, 18 May 2023 11:45:52 -0700 (PDT) From: "Andrew Fish" Message-id: <210610B3-3736-49CC-B8C0-5F64DCD10811@apple.com> MIME-version: 1.0 (Mac OS X Mail 16.0 \(3731.600.7\)) Subject: Re: [edk2-devel] CpuDeadLoop() is optimized by compiler Date: Thu, 18 May 2023 11:45:42 -0700 In-reply-to: <0EECE39F-0B65-4BFE-8668-CB59448C578D@apple.com> Cc: "Ni, Ray" , Rebecca Cran To: edk2-devel-groups-io , Mike Kinney References: <7C9FD4BA-328C-4CFE-AF5A-3A795BB147E4@apple.com> <0EECE39F-0B65-4BFE-8668-CB59448C578D@apple.com> X-Mailer: Apple Mail (2.3731.600.7) X-Groupsio-MsgNum: 105048 Content-type: multipart/alternative; boundary="Apple-Mail=_672C66FD-F1A4-452B-BA75-990D19CF61B5" --Apple-Mail=_672C66FD-F1A4-452B-BA75-990D19CF61B5 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Mike, This is a good way to play around with fixes, and to report bugs. You can s= ee the assembler for different compilers with different flag.=20 https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwF= tMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKj= dAGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEINIADqgKhE4MHt6%2B/qRJKY4CIWGRLDFx0naYDmlCB= EzEBBk%2BfgEVVQI1dQSFEdGx8ba19Y1ZLYNdoT0lfZIAlLaoXsTI7BwA9KsA1AAqAJ4JmBs7C8= QbaFgbCLGYpBskG7SoTOgbhhuYqqwJ9AB0JhoAgqECBsFABHLx1TAQIEbBg%2BGYbEwAdisAI26= I2xEwBEWDFhPg2ACp8SwTABmVH/ZEAEQ4c1onAArLw/BwtKRUJw3NZrCDjstEWYyTxSARNHS5gB= rECMjT6TiSFnijmcXgKEBysVsumkOCwJBoFgJOixciUQ3G%2BhxYBcMxcPh0AixdUQKLKqKhOo7= Tgiw1sQQAeQYtG92tIWBYhmA4jD%2BCxVQAbph1WH3pUvE6fbwgZgGWHaHgosQvR4sMqCMQ8Cws= 3MqAZgAoAGp4TAAdwD%2B1ZIv4ghEYnYUhkgkUKnUYd09oMRhQPMs%2BkL6sgc1QCXyDBTAFoA2= SNhvI0sEOTqQpJTsDJLMGrc5U1y4GO5PE09MEJsVSnpcqkBMM/PbP2vujfPp7VaNcOiGR8shA68= 2gYcDxiKXo4hAsYfz0BQxkApCJDmBR%2BQHUUsRWHh6SZJUw05DhVAADgANg3WjJA2YBkGQDZbW= %2BLgNggblLGsG5cEIO5zGFG4PCNE0ThErgZl4LUtDmCADVQCSrTNCALUklApxtSQNDlGhaCdYg= XTdMMPWYYhQ19FT/QIIMQ2VCMoxjdk4xvPAkxTdk02QDNiOzQRc2VAsixLDAVnZCsqxrPh6ybFt= 207LMh2EURxEHHt5CUNRlV0AIdJnPi51CxcIGXVc0k3bdd33ZBDzJY9T3PS9bBg28IFcND7RfRC= pmQnJki/dJIN/Qa8jSLD%2BvQ9rqlQ0aZvsMDMNfbCUM6bqBk6Kb3xk%2BZFmWPQK0wALSI4ZlS= FZdlKJo%2BjGNOHT2Mkb4NBe7jeKsOcNkEogpKFe0NnEy1YkFMkzFk0VxUUpB8CoKh1KyvsMukL= KR1y/MEHVSdMdhqgCD2dg5WITHsmJhRcfx/YNTOi6rt4SjqTwOGNmbNsQduhimJYtiOK4hMFA2D= n7uQR6pBel65KhqUZTlPNFUu5VKLVbJ5IleUODMcjrtVSHtRmOYkxMtJ4iAA=EF=BF=BC Sorry I=E2=80=99m traveling and in Cupertino with lots of meetings so I did= not have time to adjust the compiler flags=E2=80=A6. Thanks, Andrew Fish > On May 18, 2023, at 10:24 AM, Andrew (EFI) Fish wrote: >=20 > Mike, >=20 > I guess my other question=E2=80=A6 If this turns out to be a compiler bug= should we scope the change to the broken toolchain. I=E2=80=99m not sure w= hat the right answer is for that, but I want to ask the question?=20 >=20 > Thanks, >=20 > Andrew Fish >=20 >> On May 18, 2023, at 10:19 AM, Michael D Kinney wrote: >>=20 >> Andrew, >> =20 >> This might work for XIP. Set non const global to initial value that is = expected value to stay in dead loop. >> =20 >> UINTN mDeadLoopCount =3D 0; >> =20 >> VOID >> CpuDeadLoop( >> VOID >> )=20 >> { >> while (mDeadLoopCount =3D=3D 0) { >> CpuPause(); >> } >> } >> =20 >> When deadloop is entered, developer can not change value of mDeadLoopCou= nt, but they can use debugger to force exit loop and return from function. >> =20 >> Mike >> =20 >> =20 >> From: Andrew (EFI) Fish >=20 >> Sent: Thursday, May 18, 2023 10:09 AM >> To: Kinney, Michael D > >> Cc: edk2-devel-groups-io >; Ni, Ray >; Rebecca Cran <= rebecca@bsdio.com > >> Subject: Re: [edk2-devel] CpuDeadLoop() is optimized by compiler >> =20 >> Mike, >> =20 >> Good point, that is why we are using the stack =E2=80=A6. >> =20 >> The only other thing I can think of is to pass the address of Index to s= ome inline assembler, or an asm no op function, to give it a side effect th= e compiler can=E2=80=99t resolve.=20 >> =20 >> Thanks, >> =20 >> Andrew Fish >>=20 >>=20 >> On May 18, 2023, at 10:05 AM, Kinney, Michael D > wrote: >> =20 >> Static global will not work for XIP >> =20 >> Mike >> =20 >> From: Andrew (EFI) Fish >=20 >> Sent: Thursday, May 18, 2023 9:49 AM >> To: edk2-devel-groups-io >; Kinney, Michael D > >> Cc: Ni, Ray >; Rebecca Cran <= rebecca@bsdio.com > >> Subject: Re: [edk2-devel] CpuDeadLoop() is optimized by compiler >> =20 >> Mike, >> =20 >> 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= =E2=80=99ve NOT gotten feedback from anyone on the spec committee yet.=20 >> =20 >> If we move Index to a static global that would likely work around the co= mpiler issue. >> =20 >> Thanks, >> =20 >> Andrew Fish >>=20 >>=20 >>=20 >> On May 18, 2023, at 8:36 AM, Michael D Kinney > wrote: >> =20 >> Hi Ray, >> =20 >> So the code generated does deadloop, but is just not easy to resume from= as we have been able to do in the past. >> =20 >> We use CpuDeadloop() for 2 purposes. One is a terminal condition with n= o reason to ever continue. >> =20 >> 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 ste= p through code to an area to evaluate unexpected behavior. >> =20 >> We may have to do a NASM implementation of CpuDeadloop() to make sure it= meets both use cases. >> =20 >> Mike >> =20 >> From: Ni, Ray >=20 >> Sent: Thursday, May 18, 2023 3:00 AM >> To: devel@edk2.groups.io >> Cc: Kinney, Michael D >; Rebecca Cran >= ; Ni, Ray > >> Subject: CpuDeadLoop() is optimized by compiler >> =20 >> Hi, >> Starting from certain version of Visual Studio C compiler (I don=E2=80= =99t have the exact version. I am using VS2019), CpuDeadLoop is now optimiz= ed quite well by compiler. >> =20 >> The optimization is so =E2=80=9Cgood=E2=80=9D that it becomes harder for= developers to break out of the deadloop. >> =20 >> I copied the assembly instructions as below for your reference. >> The compiler does not generate instructions that jump out of the loop wh= en the Index is not zero. >> So in order to break out of the loop, developers need to: >> Manually adjust rsp by increasing 40 >> Manually =E2=80=9Cret=E2=80=9D >> =20 >> I am not sure if anyone has interest to re-write this function so that c= ompiler can be =E2=80=9Cfooled=E2=80=9D again. >> Thanks, >> Ray >> =20 >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> ; Function compile flags: /Ogspy >> ; File e:\work\edk2\MdePkg\Library\BaseLib\CpuDeadLoop.c >> ; COMDAT CpuDeadLoop >> _TEXT SEGMENT >> Index$ =3D 48 >> CpuDeadLoop PROC = ; COMDAT >> =20 >> ; 26 : { >> =20 >> $LN12: >> 00000 48 83 ec 28 sub rsp, 40 = ; 00000028H >> =20 >> ; 27 : volatile UINTN Index; >> ; 28 :=20 >> ; 29 : for (Index =3D 0; Index =3D=3D 0;) { >> =20 >> 00004 48 c7 44 24 30 >> 00 00 00 00 mov QWORD PTR Index$[rsp], 0 >> $LN10@CpuDeadLoo: >> =20 >> ; 30 : CpuPause (); >> =20 >> 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 >> =20 >> =20 >> =20 >>=20 >=20 --Apple-Mail=_672C66FD-F1A4-452B-BA75-990D19CF61B5 Content-Type: multipart/related; type="text/html"; boundary="Apple-Mail=_09AEAA86-0DEE-46E0-AAB3-1FA51B24E2EA" --Apple-Mail=_09AEAA86-0DEE-46E0-AAB3-1FA51B24E2EA Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 Mike,

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

<= /div>

Sorry I=E2=80=99m traveling and in Cupertino with lot= s of meetings so I did not have time to adjust the compiler flags=E2=80=A6.=

Thanks,

Andrew Fish
<= br>
On May 18, 2023, at 10:24 AM, Andrew (EFI= ) Fish <afish@apple.com> wrote:

Mike,

I guess my othe= r question=E2=80=A6 If this turns out to be a compiler bug should we scope = the change to the broken toolchain. I=E2=80=99m not sure what the right ans= wer is for that, but I want to ask the question? 

=
Thanks,

Andrew Fish

On May 18, 2023, at 10:19 AM, Michael D Kinney <michae= l.d.kinney@intel.com> wrote:

Andrew,
 <= /div>
This might work for XIP.  Set non const global to initial val= ue that is expected value to stay in dead loop.
&= nbsp;
UINTN  mDeadLoopCount =3D 0;
=  
VOID
CpuDeadLoop(=
  VOID
  ) 
{
 = while (mDeadLoopCount =3D=3D 0) {
    &= nbsp; CpuPause();
  }
}
 
When deadloop is entered, dev= eloper can not change value of mDeadLoopCount, but they can use debugger to= force exit loop and return from function.
 <= /o:p>
Mike
 
&= nbsp;
<= div>


 
Static global will n= ot work for XIP
 
Mike
 
=
From: Andrew (EFI) Fish <afish@apple.com> <= /span>
Sent: Th= ursday, May 18, 2023 9:49 AM
To: edk2-devel-groups-io <devel@edk2.group= s.io>; Kinney, Michael D <michael.d.kinney@= intel.com>
Cc: = Ni, Ray <ray.ni@intel.com>; Rebecca Cran <<= a href=3D"mailto:rebecca@bsdio.com" style=3D"color: blue; text-decoration: = underline;">rebecca@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=E2=80=99ve NOT gotten feedback from anyone= on the spec committee yet. 
 
If we move Index to a sta= tic global that would likely work around the compiler issue.
 
 
=
Andrew Fish
<= br>

On May 18, 2023, at 8:36 AM, Michael D Kinn= ey <michael.d.kinney@intel.com> wrote:=
 
Hi Ray,
 
So the code generated does deadloop, but is j= ust 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 condi= tion with no reason to ever continue.
 
The 2nd is a debug aide for develop= ers to halt the system at a specific location and then continue from that p= oint, usually with a debugger, to step through code to an area to evaluate = unexpected behavior.
 <= /o:p>
We may have to do a NASM implementatio= n of CpuDeadloop() to make sure it meets both use cases.
 
Mi= ke
 
<= /div>
F= rom: Ni, Ray <ray.ni@intel.com> = ;
Sent: = Thursday, May 18, 2023 3:00 AM
To: devel@edk2.groups.io
Cc:<= span class=3D"apple-converted-space"> Kinney, Michael D <michael.d.kinney@intel.com>; Rebecca Cran <rebecca@bsdio.com>; Ni, Ray <ray.ni@intel.c= om>
Subject: CpuDeadLoop() is optimized by compiler
 
Hi,=
Starting from certain version of= Visual Studio C compiler (I don=E2=80=99t have the exact version. I am usi= ng VS2019), CpuDeadLoop is now optimized quite well by compiler.=
 
The optimization is so =E2=80=9Cgood=E2=80=9D that it becomes harder = for developers to break out of the deadloop.
 
I copied the a= ssembly 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:=
  1. Manually adjust rsp by incre= asing 40
  2. Manually =E2=80=9Cret= =E2=80=9D
 
I am not sure if anyone has interest to re-write this fun= ction so that compiler can be =E2=80=9Cfooled=E2=80=9D again.
Thanks,
Ray
 
=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
; Function compile flags: /Ogspy
; File e:\work\edk2\MdePkg\Library\BaseLib\CpuDeadLoo= p.c
;    &nbs= p;         COMDAT CpuDeadLoop<= /o:p>
_TEXT    SEGMENT
Index$ =3D 48
CpuDeadLoop PROC       =             &nb= sp;            =             &nb= sp;            =            ; COMDAT<= /o:p>
 
; 26   : {
&= nbsp;
$LN12:
  00000  48 83 ec 28    = ;     sub        rsp= , 40            = ;            &n= bsp;       ; 00000028H
=
 
; 27&n= bsp;  :   volatile UINTN  Index;
=
; 28   : 
; 29   :=    for (Index =3D 0; Index =3D=3D 0;) {
 
  00= 004  48 c7 44 24 30
 =             &nb= sp; 00 00 00 00        mov  &n= bsp;   QWORD PTR Index$[rsp], 0
=
$LN10@CpuDeadLoo:
 =
; 30   :  &n= bsp;  CpuPause ();
 
  0000d  48 8b 44 24 30&n= bsp;  mov      rax, QWORD PTR Index$[rsp]
  00012  e8 00 00 00 00&nb= sp;  call        CpuPause
  00017  eb f4   =             &nb= sp;     jmp       SHORT $= LN10@CpuDeadLoo
CpuDeadLoop ENDP<= o:p>
_TEXT    ENDS=
END
=
 
 =
 =


--Apple-Mail=_09AEAA86-0DEE-46E0-AAB3-1FA51B24E2EA Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=favicon.png Content-Type: image/png; x-unix-mode=0666; name="favicon.png" Content-Id: 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 --Apple-Mail=_09AEAA86-0DEE-46E0-AAB3-1FA51B24E2EA-- --Apple-Mail=_672C66FD-F1A4-452B-BA75-990D19CF61B5--