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.web11.30951.1684513894457523691 for ; Fri, 19 May 2023 09:31:34 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@apple.com header.s=20180706 header.b=AvIOXGMd; spf=pass (domain: apple.com, ip: 17.32.222.22, mailfrom: afish@apple.com) Received: from rn-mailsvcp-mta-lapp03.rno.apple.com (rn-mailsvcp-mta-lapp03.rno.apple.com [10.225.203.151]) by ma-mailsvcp-mx-lapp01.apple.com (Oracle Communications Messaging Server 8.1.0.22.20230228 64bit (built Feb 28 2023)) with ESMTPS id <0RUW00PJ5Z8KGI30@ma-mailsvcp-mx-lapp01.apple.com> for devel@edk2.groups.io; Fri, 19 May 2023 09:31:33 -0700 (PDT) X-Proofpoint-ORIG-GUID: 82kybQNDpoI75OkzG2VRFVU94FT5sjaR X-Proofpoint-GUID: 82kybQNDpoI75OkzG2VRFVU94FT5sjaR X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.573,18.0.942 definitions=2023-05-10_04:2023-05-05,2023-05-10 signatures=0 X-Proofpoint-Spam-Details: rule=interactive_user_notspam policy=interactive_user score=0 mlxlogscore=999 phishscore=0 suspectscore=0 spamscore=0 adultscore=0 mlxscore=0 bulkscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2304280000 definitions=main-2305100143 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=jvYyyBmsBoYYBbjMPzttp6/6Dob+QLpDMIffYvxTaDc=; b=AvIOXGMddFelmAtPkX1Yh9ZuXV3Z2VSbFmovLyubXtXIK0XZ7IlZSL+xZ5bIOsfdwCIk QDi7hMSwsSZVQAycF3aWDvwwVO3ob6ouF2XRPm1ckDL4dIjT7sjjc2T6RBqolHQRzQ+3 O9hai2TQSn+lYZY2ly5WcYavNS7Sd8g852Y3Oj6PIL5CnumWOk+Wa/fqjxGUx9JGGXEm XtVrjLtgwHCpr378K2qeiHH1zDgaTKfJZJDfxSGYZTSDYns+2DdSYWVUdPct8EbG0c06 7zJ5P8yde8+Ho2DeqaRzPPykDGMJpw2qwfDy+kJdo4D/0IEGNGfu6/88DPc2UBRB+HoH Wg== Received: from rn-mailsvcp-mmp-lapp01.rno.apple.com (rn-mailsvcp-mmp-lapp01.rno.apple.com [17.179.253.14]) by rn-mailsvcp-mta-lapp03.rno.apple.com (Oracle Communications Messaging Server 8.1.0.22.20230228 64bit (built Feb 28 2023)) with ESMTPS id <0RUW00ZQ7Z8J2300@rn-mailsvcp-mta-lapp03.rno.apple.com>; Fri, 19 May 2023 09:31:32 -0700 (PDT) Received: from process_milters-daemon.rn-mailsvcp-mmp-lapp01.rno.apple.com by rn-mailsvcp-mmp-lapp01.rno.apple.com (Oracle Communications Messaging Server 8.1.0.22.20230228 64bit (built Feb 28 2023)) id <0RUW00E00YX7V700@rn-mailsvcp-mmp-lapp01.rno.apple.com>; Fri, 19 May 2023 09:31:31 -0700 (PDT) X-Va-A: X-Va-T-CD: fbf76c96845af0e32e156b5cd91de891 X-Va-E-CD: 156d5ae2ad5b70872c2d8b4f187426ab X-Va-R-CD: faed37d9f0280288bcb510df700d8485 X-Va-ID: 5c223d22-f815-40dd-9493-a4716b94484b X-Va-CD: 0 X-V-A: X-V-T-CD: fbf76c96845af0e32e156b5cd91de891 X-V-E-CD: 156d5ae2ad5b70872c2d8b4f187426ab X-V-R-CD: faed37d9f0280288bcb510df700d8485 X-V-ID: 65e422cc-fa8d-49be-abb5-3bd7170bd737 X-V-CD: 0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.573,18.0.957 definitions=2023-05-19_12:2023-05-17,2023-05-19 signatures=0 Received: from smtpclient.apple (unknown [17.11.159.249]) by rn-mailsvcp-mmp-lapp01.rno.apple.com (Oracle Communications Messaging Server 8.1.0.22.20230228 64bit (built Feb 28 2023)) with ESMTPSA id <0RUW00P4DZ8IUI00@rn-mailsvcp-mmp-lapp01.rno.apple.com>; Fri, 19 May 2023 09:31:30 -0700 (PDT) From: "Andrew Fish" Message-id: <31286A1F-3497-478E-A938-50EEB1F61774@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: Fri, 19 May 2023 09:31:19 -0700 In-reply-to: <24bf3d19-a292-11df-c84b-5d941cf2e19d@bsdio.com> Cc: "Ni, Ray" , Mike Kinney To: edk2-devel-groups-io , Rebecca Cran References: <7C9FD4BA-328C-4CFE-AF5A-3A795BB147E4@apple.com> <0EECE39F-0B65-4BFE-8668-CB59448C578D@apple.com> <17605136DCF3E084.26337@groups.io> <69A704CE-16A4-4C8D-9A32-9BBD22C00475@apple.com> <24bf3d19-a292-11df-c84b-5d941cf2e19d@bsdio.com> X-Mailer: Apple Mail (2.3731.600.7) X-Groupsio-MsgNum: 105083 Content-type: multipart/alternative; boundary="Apple-Mail=_C72B190B-1CAE-4F3F-97DA-B01BB0DB3F52" --Apple-Mail=_C72B190B-1CAE-4F3F-97DA-B01BB0DB3F52 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 I don=E2=80=99t think the atomic is going to help. The compiler honored the= volatile by doing a read, but assumed it would never change due to scoping= . As you can see in my example if the compiler thinks DeadLoopCount can be = changed it will put the check back in and assume the function can return. S= o an assembly function that does nothing called IncreaseScope() would fix = this issue too.=20 void IncreaseScope(int *ptr); void CpuDeadLoopFix(void) { volatile int DeadLoopCount =3D 0; while(DeadLoopCount =3D=3D 0) { IncreaseScope(&DeadLoopCount); } } void CpuDeadLoop(void) { volatile int DeadLoopCount =3D 0; while(DeadLoopCount =3D=3D 0); } Gives us: voltbl SEGMENT voltbl ENDS voltbl SEGMENT voltbl ENDS DeadLoopCount$ =3D 48 CpuDeadLoopFix PROC ; COMDAT $LN12: sub rsp, 40 ; 00000028H mov DWORD PTR DeadLoopCount$[rsp], 0 jmp SHORT $LN10@CpuDeadLoo $LL2@CpuDeadLoo: lea rcx, QWORD PTR DeadLoopCount$[rsp] call IncreaseScope $LN10@CpuDeadLoo: mov eax, DWORD PTR DeadLoopCount$[rsp] test eax, eax je SHORT $LL2@CpuDeadLoo add rsp, 40 ; 00000028H ret 0 CpuDeadLoopFix ENDP DeadLoopCount$ =3D 8 CpuDeadLoop PROC ; COMDAT mov DWORD PTR DeadLoopCount$[rsp], 0 $LL2@CpuDeadLoo: mov eax, DWORD PTR DeadLoopCount$[rsp] jmp SHORT $LL2@CpuDeadLoo CpuDeadLoop ENDP 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 Thanks, Andrew Fish PS I=E2=80=99m still not 100% sure it is a compiler bug. Some times things = like this are due to the order the compiler applies the optimizations, and = changing the order can change the behavior.=20 > On May 19, 2023, at 8:31 AM, Rebecca Cran wrote: >=20 > Just to add more data, I also tried with "volatile sig_atomic_t" as someo= ne suggested and both "/volatile:iso" and "/volatile:ms" with no change in = results. >=20 >=20 > --=20 >=20 > Rebecca Cran >=20 >=20 > On 5/18/23 20:53, Ni, Ray wrote: >>=20 >> I think all the options we considered are workarounds. These might break= again if compiler is =E2=80=9Ccleverer=E2=80=9D in future. Unless some Cxx= spec clearly guarantees that. >>=20 >> I like Mike=E2=80=99s idea to use assembly implementation for CpuDeadLoo= p. The assembly can simply =E2=80=9Cjmp $=E2=80=9D then =E2=80=9Cret=E2=80= =9D. >>=20 >> I didn=E2=80=99t find a dead-loop intrinsic function in MSVC. >>=20 >> Any better idea? >>=20 >> Thanks, >>=20 >> Ray >>=20 >> *From:* Andrew (EFI) Fish >> *Sent:* Friday, May 19, 2023 8:42 AM >> *To:* devel@edk2.groups.io; Kinney, Michael D >> *Cc:* Ni, Ray ; Rebecca Cran >> *Subject:* Re: [edk2-devel] CpuDeadLoop() is optimized by compiler >>=20 >> Mike, >>=20 >> Sorry static was just to scope the name to the file since it is a lib, n= ot to make it work. >>=20 >> That is a cool site. I learned about it complaining about stuff to the c= ompiler team on our internal clang Slack channel as they use it to answer m= y questions. >>=20 >> Thanks, >>=20 >> Andrew Fish >>=20 >>=20 >>=20 >> On May 18, 2023, at 2:42 PM, Michael D Kinney >> wrote: >>=20 >> Using that tool, the following fragment seems to generate the >> right code. Volatile is required. Static is optional. >>=20 >> staticvolatileint mDeadLoopCount =3D0; >>=20 >> void >>=20 >> CpuDeadLoop( >>=20 >> void >>=20 >> ) >>=20 >> { >>=20 >> while(mDeadLoopCount =3D=3D0); >>=20 >> } >>=20 >> GCC >>=20 >> =3D=3D=3D >>=20 >> CpuDeadLoop(): >>=20 >> .L2: >>=20 >> moveax,DWORDPTRmDeadLoopCount[rip] >>=20 >> testeax,eax >>=20 >> je.L2 >>=20 >> ret >>=20 >> CLANG >>=20 >> =3D=3D=3D=3D=3D >>=20 >> CpuDeadLoop():# @CpuDeadLoop() >>=20 >> .LBB0_1: # =3D>This Inner Loop Header:Depth= =3D1 >>=20 >> cmpdwordptr[rip+_ZL14mDeadLoopCount],0 >>=20 >> je.LBB0_1 >>=20 >> ret >>=20 >> Mike >>=20 >> *From:*Andrew (EFI) Fish >> *Sent:*Thursday, May 18, 2023 1:45 PM >> *To:*edk2-devel-groups-io ; Andrew Fish >> >> *Cc:*Kinney, Michael D ; Ni, Ray >> ; Rebecca Cran >> *Subject:*Re: [edk2-devel] CpuDeadLoop() is optimized by compiler >>=20 >> Whoops wrong compiler. Here is an update. I added the flags so >> this one reproduces the issue. >>=20 >> Compiler Explorer >> >>=20 >> godbolt.org >> >>=20 >> =09 >>=20 >> >> >>=20 >> Thanks, >>=20 >> Andrew Fish >>=20 >>=20 >>=20 >>=20 >> On May 18, 2023, at 11:45 AM, Andrew Fish viagroups.io >> > wrote: >>=20 >> Mike, >>=20 >> 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. >>=20 >> Compiler Explorer >> >>=20 >> godbolt.org >> >>=20 >> =09 >>=20 >> >> >>=20 >> Sorry I=E2=80=99m traveling and in Cupertino with lots of meeting= s so >> I did not have time to adjust the compiler flags=E2=80=A6. >>=20 >> Thanks, >>=20 >> Andrew Fish >>=20 >>=20 >>=20 >>=20 >> 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 what the right answer is for = that, >> but I want to ask the question? >>=20 >> Thanks, >>=20 >> Andrew Fish >>=20 >>=20 >>=20 >>=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 >>=20 >> CpuDeadLoop( >>=20 >> VOID >>=20 >> ) >>=20 >> { >>=20 >> while (mDeadLoopCount =3D=3D 0) { >>=20 >> CpuPause(); >>=20 >> } >>=20 >> } >>=20 >> When deadloop is entered, developer can not change >> value of mDeadLoopCount, but they can use debugger to >> force exit loop and return from function. >>=20 >> Mike >>=20 >> *From:*Andrew (EFI) Fish > >> *Sent:*Thursday, May 18, 2023 10:09 AM >> *To:*Kinney, Michael D > >> *Cc:*edk2-devel-groups-io >; Ni, >> Ray >; Rebecca= Cran > >> *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 some inline assembler, or an asm >> no op function, to give it a side effect the compiler >> can=E2=80=99t resolve. >>=20 >> Thanks, >>=20 >> Andrew Fish >>=20 >>=20 >>=20 >>=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 > >> *Sent:*Thursday, May 18, 2023 9:49 AM >> *To:*edk2-devel-groups-io >; >> Kinney, Michael D > >> *Cc:*Ni, Ray >; Rebecca Cran >> > >> *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 >> If we move Index to a static global that would >> likely work around the compiler issue. >>=20 >> Thanks, >>=20 >> Andrew Fish >>=20 >>=20 >>=20 >>=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 no reason to ever >> continue. >>=20 >> The 2^nd 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. >>=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 > >> *Sent:*Thursday, May 18, 2023 3:00 AM >> *To:*devel@edk2.groups.io >> *Cc:*Kinney, Michael D >> >; Rebecca Cran >> >; N= i, Ray > >> *Subject:*CpuDeadLoop() is optimized by compiler >>=20 >> Hi, >>=20 >> Starting from certain version of Visual Studio >> C compiler (I don=E2=80=99t have the exact versio= n. I >> am using VS2019), CpuDeadLoop is now optimized >> quite well by compiler. >>=20 >> The optimization is so =E2=80=9Cgood=E2=80=9D tha= t it becomes >> harder for developers to break out of the >> deadloop. >>=20 >> I copied the assembly instructions as below >> for your reference. >>=20 >> The compiler does not generate instructions >> that jump out of the loop when the Index is >> not zero. >>=20 >> So in order to break out of the loop, >> developers need to: >>=20 >> 1. Manually adjust rsp by increasing 40 >> 2. Manually =E2=80=9Cret=E2=80=9D >>=20 >> I am not sure if anyone has interest to >> re-write this function so that compiler can be >> =E2=80=9Cfooled=E2=80=9D again. >>=20 >> 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 >>=20 >> ; Function compile flags: /Ogspy >>=20 >> ; File >> e:\work\edk2\MdePkg\Library\BaseLib\CpuDeadLoop.c >>=20 >> ; COMDAT CpuDeadLoop >>=20 >> _TEXT SEGMENT >>=20 >> Index$ =3D 48 >>=20 >> CpuDeadLoop PROC ; COMDAT >>=20 >> ; 26 : { >>=20 >> $LN12: >>=20 >> 00000 48 83 ec 28 sub rsp, 40 ; 00000028H >>=20 >> ; 27 : volatile UINTN Index; >>=20 >> ; 28 : >>=20 >> ; 29 : for (Index =3D 0; Index =3D=3D 0;) { >>=20 >> 00004 48 c7 44 24 30 >>=20 >> 00 00 00 00 mov QWORD PTR Index$[rsp], 0 >>=20 >> $LN10@CpuDeadLoo: >>=20 >> ; 30 : CpuPause (); >>=20 >> 0000d 48 8b 44 24 30 mov rax, QWORD PTR >> Index$[rsp] >>=20 >> 00012 e8 00 00 00 00 call CpuPause >>=20 >> 00017 eb f4 jmp SHORT $LN10@CpuDeadLoo >>=20 >> CpuDeadLoop ENDP >>=20 >> _TEXT ENDS >>=20 >> END >>=20 >> =20 >=20 >=20 >=20 --Apple-Mail=_C72B190B-1CAE-4F3F-97DA-B01BB0DB3F52 Content-Type: multipart/related; type="text/html"; boundary="Apple-Mail=_9E2A2D25-B7B6-4F12-87A1-267322923EF2" --Apple-Mail=_9E2A2D25-B7B6-4F12-87A1-267322923EF2 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 I don=E2=80=99t think the atomic = is going to help. The compiler honored the volatile by doing a read, but as= sumed it would never change due to scoping. As you can see in my example if= the compiler thinks DeadLoopCount can be changed it will put the check= back in and assume the function can return. So an assembly function that d= oes nothing called IncreaseScope()  would fix this issue too. 
void IncreaseScope(int *ptr);
void CpuDeadLoopF= ix(void) {
volatile int DeadLoopCount =3D 0;
while(DeadLoopCount =3D=3D 0= ) {
IncreaseScope(&DeadLoopCount);
}
}

void CpuDea= dLoop(void) {
volatile int DeadLoopCount =3D 0;
whil= e(DeadLoopCount =3D=3D 0);
}

Gives us:

voltbl SEGMENT
voltbl ENDS
voltbl SEGMENT
voltbl ENDS

Dea= dLoopCount$ =3D 48
CpuDeadLoopFix PROC ; COMDAT=
$LN12:
sub rsp, 40 ; 00000028H
mov = DWORD PTR DeadLoopCount$[rsp], = 0
jmp SHORT $LN10@CpuDeadLoo
$LL2@CpuDeadLoo:
lea rcx, QWORD<= /span> PTR DeadLoopCount$[rsp]
call IncreaseS= cope
$LN10@CpuDea= dLoo:
mov eax, DWORD PTR DeadLoopCo= unt$[rsp]
test eax, eax
je SHORT $LL2@CpuDeadLoo
= add rsp, ; 00000028H
ret 0
<= div>CpuDeadLoopFix ENDP
DeadLoopCount$ =3D 8
CpuDeadLoop PROC = ; COMDAT
mov DWORD PTR Dead= LoopCount$[rsp], 0
$LL2@CpuDeadLoo:
mov eax, DWORD PTR DeadLoopCount$[rsp]
jmp SHORT= $LL2@CpuDeadLoo
= CpuDeadLoop ENDP



Thanks,

Andrew Fish

PS I=E2=80=99m still not 100%= sure it is a compiler bug. Some times things like this are due to the orde= r the compiler applies the optimizations, and changing the order can change= the behavior. 


On May 19, 2023, at 8:31 AM, Rebecca Cran <rebecca@bsdio.com&= gt; wrote:

Just to add more data, I also tried with "volatile sig_atomic_t" as som= eone suggested and both "/volatile:iso" and "/volatile:ms" with no change i= n results.


-- 

Rebecca Cran


On 5/18/23 20:53, Ni, Ray= wrote:

I think all the options we considered are workarounds. The= se might break again if compiler is =E2=80=9Ccleverer=E2=80=9D in future. U= nless some Cxx spec clearly guarantees that.

I like Mike=E2=80=99s i= dea to use assembly implementation for CpuDeadLoop. The assembly can simply= =E2=80=9Cjmp $=E2=80=9D then =E2=80=9Cret=E2=80=9D.

I didn=E2=80=99= t find a dead-loop intrinsic function in MSVC.

Any better idea?
<= br>Thanks,

Ray

*From:* Andrew (EFI) Fish <afish@apple.com&= gt;
*Sent:* Friday, May 19, 2023 8:42 AM
*To:* devel@edk2.groups.io; = Kinney, Michael D <michael.d.kinney@intel.com>
*Cc:* Ni, Ray <r= ay.ni@intel.com>; Rebecca Cran <rebecca@bsdio.com>
*Subject:* R= e: [edk2-devel] CpuDeadLoop() is optimized by compiler

Mike,

= Sorry static was just to scope the name to the file since it is a lib, not = to make it work.

That is a cool site. I learned about it complaining= about stuff to the compiler team on our internal clang Slack channel as th= ey use it to answer my questions.

Thanks,

Andrew Fish

=

   On May 18, 2023, at 2:42 PM, Michael D Kinney
=    <michael.d.kinney@intel.com> wrote:

 &n= bsp; Using that tool, the following fragment seems to generate the
=    right code. Volatile is required.  Static is optiona= l.

   staticvolatileint mDeadLoopCount =3D0;
=
   void

   CpuDeadLoop(

&nb= sp;  void

     )

  &n= bsp;{

   while(mDeadLoopCount =3D=3D0);

 =   }

   GCC

   =3D=3D= =3D

   CpuDeadLoop():

   .L2:
   moveax,DWORDPTRmDeadLoopCount[rip]

 &nb= sp; testeax,eax

   je.L2

  &nbs= p;ret

   CLANG

   =3D=3D=3D=3D= =3D

   CpuDeadLoop():# @CpuDeadLoop()

 &n= bsp; .LBB0_1:                 =          # =3D>This Inner Loop Header:Depth=3D1=

   cmpdwordptr[rip+_ZL14mDeadLoopCount],0

&nb= sp;  je.LBB0_1

   ret

  &n= bsp;Mike

   *From:*Andrew (EFI) Fish <afish@apple.= com>
   *Sent:*Thursday, May 18, 2023 1:45 PM
 = ;  *To:*edk2-devel-groups-io <devel@edk2.groups.io>; Andrew= Fish
   <afish@apple.com>
   *Cc= :*Kinney, Michael D <michael.d.kinney@intel.com>; Ni, Ray
 &n= bsp; <ray.ni@intel.com>; Rebecca Cran <rebecca@bsdio.com><= br>   *Subject:*Re: [edk2-devel] CpuDeadLoop() is optimized = by compiler

   Whoops wrong compiler. Here is an upda= te. I added the flags so
   this one reproduces the issue= .

   Compiler Explorer
   <https://godb= olt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQ= YEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGI= M6SuADJ4DJgAcj4ARpjEINIADqgKhE4MHt6%2B/qRJKY4CIWGRLDFx0naYDmlCBEzEBBk%2BfgE= VVQI1dQSFEdGx8ba19Y1ZLYNdoT0lfZIAlLaoXsTI7BwA9KsA1AAqAJ4JmBs7C8QbaFgbCLGYpB= skG7SoTOgbhhuYqqwJ9AB0JhoAgqECBsFABHLx1TAQIEbBg%2BGYbEwAdisAI26I2xEwBEWDFhP= g2ACp8SwTABmVH/ZEAEQ4c1onAArLw/BwtKRUJw3NZrCDjstEWYyTxSARNHS5gBrECMjT6TiSFn= ijmcXgKEBysVsumkOCwJBoFgJOixciUQ3G%2BhxYBcMxcPh0AixdUQKLKqKhOo7Tgiw1sQQAeQY= tG92tIWBYhmA4jD%2BCxVQAbph1WH3pUvE6fbwgZgGWHaHgosQvR4sMqCMQ8Cws3MqAZgAoAGp4= TAAdwD%2B1ZIv4ghEYnYUhkgkUKnUYd09oMRhQPMs%2BkL6sgc1QCXyDBTAFoA2SNhvI0sEOTqQ= pJTsDJLMGrc5U1y4GO5PE09MEJsVSnpcqkBMM/PbP2vujfPp7VaNcOiGR8shA682gYcDxiKXo4h= AsYfz0BQxkApCJDmBR%2BQHUUsRWHh6SZJUw05DhVAADgANg3WjJA2YBkGQDZbW%2BLgNggblLG= sG5cEIO5zGFG4PCNE0ThErgZl4LUtDmCADVQCSrTNCALUklApxtSQNDlGhaCdYgXTdMMPWYYhQ1= 9FT/QIIMQ2VCMoxjdk4xvPAkxTdk02QDNiOzQRc2VAsixLDAVnZCsqxrPh6ybFt207LMh2EURxE= HHt5CUNRlV0AIdJnPi51CxcIGXVc0k3bdd33ZBDzJY9T3PS9bBg28IFcND7RfRCpmQnJki/dJIN= /Qa8jSLD%2BvQ9rqlQ0aZvsMDMNfbCUM6bqBk6Kb3xk%2BZFmWPQK0wALSI4ZlSFZdlKJo%2BjG= NOHT2Mkb4NBe7jeKsOcNkEogpKFe0NnEy1YkFMkzFk0VxUUpB8CoKh1KyvsMukLKR1y/MEHVSdM= dhqgCD2dg5WITHsmJhRcfx/YNTOi6rt4SjqTwOGNmbNsQduhimJYtiOK4hMFA2Dn7uQR6pBel65= KhqUZTlPNFUu5VKLVbJ5IleUODMcjrtVSHtRmOYkxMtJ4iAA>

  = ; godbolt.org
   <= ht= tps://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtM= QByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdA= GFUtAK4sGIM6SuADJ4DJgAcj4ARpjEINIADqgKhE4MHt6%2B/qRJKY4CIWGRLDFx0naYDmlCBEz= EBBk%2BfgEVVQI1dQSFEdGx8ba19Y1ZLYNdoT0lfZIAlLaoXsTI7BwA9KsA1AAqAJ4JmBs7C8Qb= aFgbCLGYpBskG7SoTOgbhhuYqqwJ9AB0JhoAgqECBsFABHLx1TAQIEbBg%2BGYbEwAdisAI26I2= xEwBEWDFhPg2ACp8SwTABmVH/ZEAEQ4c1onAArLw/BwtKRUJw3NZrCDjstEWYyTxSARNHS5gBrE= CMjT6TiSFnijmcXgKEBysVsumkOCwJBoFgJOixciUQ3G%2BhxYBcMxcPh0AixdUQKLKqKhOo7Tg= iw1sQQAeQYtG92tIWBYhmA4jD%2BCxVQAbph1WH3pUvE6fbwgZgGWHaHgosQvR4sMqCMQ8Cws3M= qAZgAoAGp4TAAdwD%2B1ZIv4ghEYnYUhkgkUKnUYd09oMRhQPMs%2BkL6sgc1QCXyDBTAFoA2SN= hvI0sEOTqQpJTsDJLMGrc5U1y4GO5PE09MEJsVSnpcqkBMM/PbP2vujfPp7VaNcOiGR8shA682g= YcDxiKXo4hAsYfz0BQxkApCJDmBR%2BQHUUsRWHh6SZJUw05DhVAADgANg3WjJA2YBkGQDZbW%2= BLgNggblLGsG5cEIO5zGFG4PCNE0ThErgZl4LUtDmCADVQCSrTNCALUklApxtSQNDlGhaCdYgXT= dMMPWYYhQ19FT/QIIMQ2VCMoxjdk4xvPAkxTdk02QDNiOzQRc2VAsixLDAVnZCsqxrPh6ybFt20= 7LMh2EURxEHHt5CUNRlV0AIdJnPi51CxcIGXVc0k3bdd33ZBDzJY9T3PS9bBg28IFcND7RfRCpm= QnJki/dJIN/Qa8jSLD%2BvQ9rqlQ0aZvsMDMNfbCUM6bqBk6Kb3xk%2BZFmWPQK0wALSI4ZlSFZ= dlKJo%2BjGNOHT2Mkb4NBe7jeKsOcNkEogpKFe0NnEy1YkFMkzFk0VxUUpB8CoKh1KyvsMukLKR= 1y/MEHVSdMdhqgCD2dg5WITHsmJhRcfx/YNTOi6rt4SjqTwOGNmbNsQduhimJYtiOK4hMFA2Dn7= uQR6pBel65KhqUZTlPNFUu5VKLVbJ5IleUODMcjrtVSHtRmOYkxMtJ4iAA>

&= nbsp;  

   <image001.png>
   <= ;h= ttps://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFt= MQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjd= AGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEINIADqgKhE4MHt6%2B/qRJKY4CIWGRLDFx0naYDmlCBE= zEBBk%2BfgEVVQI1dQSFEdGx8ba19Y1ZLYNdoT0lfZIAlLaoXsTI7BwA9KsA1AAqAJ4JmBs7C8Q= baFgbCLGYpBskG7SoTOgbhhuYqqwJ9AB0JhoAgqECBsFABHLx1TAQIEbBg%2BGYbEwAdisAI26I= 2xEwBEWDFhPg2ACp8SwTABmVH/ZEAEQ4c1onAArLw/BwtKRUJw3NZrCDjstEWYyTxSARNHS5gBr= ECMjT6TiSFnijmcXgKEBysVsumkOCwJBoFgJOixciUQ3G%2BhxYBcMxcPh0AixdUQKLKqKhOo7T= giw1sQQAeQYtG92tIWBYhmA4jD%2BCxVQAbph1WH3pUvE6fbwgZgGWHaHgosQvR4sMqCMQ8Cws3= MqAZgAoAGp4TAAdwD%2B1ZIv4ghEYnYUhkgkUKnUYd09oMRhQPMs%2BkL6sgc1QCXyDBTAFoA2S= NhvI0sEOTqQpJTsDJLMGrc5U1y4GO5PE09MEJsVSnpcqkBMM/PbP2vujfPp7VaNcOiGR8shA682= gYcDxiKXo4hAsYfz0BQxkApCJDmBR%2BQHUUsRWHh6SZJUw05DhVAADgANg3WjJA2YBkGQDZbW%= 2BLgNggblLGsG5cEIO5zGFG4PCNE0ThErgZl4LUtDmCADVQCSrTNCALUklApxtSQNDlGhaCdYgX= TdMMPWYYhQ19FT/QIIMQ2VCMoxjdk4xvPAkxTdk02QDNiOzQRc2VAsixLDAVnZCsqxrPh6ybFt2= 07LMh2EURxEHHt5CUNRlV0AIdJnPi51CxcIGXVc0k3bdd33ZBDzJY9T3PS9bBg28IFcND7RfRCp= mQnJki/dJIN/Qa8jSLD%2BvQ9rqlQ0aZvsMDMNfbCUM6bqBk6Kb3xk%2BZFmWPQK0wALSI4ZlSF= ZdlKJo%2BjGNOHT2Mkb4NBe7jeKsOcNkEogpKFe0NnEy1YkFMkzFk0VxUUpB8CoKh1KyvsMukLK= R1y/MEHVSdMdhqgCD2dg5WITHsmJhRcfx/YNTOi6rt4SjqTwOGNmbNsQduhimJYtiOK4hMFA2Dn= 7uQR6pBel65KhqUZTlPNFUu5VKLVbJ5IleUODMcjrtVSHtRmOYkxMtJ4iAA>

=    Thanks,

   Andrew Fish


<= br>
       On May 18, 2023, at 11:45 = AM, Andrew Fish viagroups.io
     = ;  <http://groups.io/><= ;afish=3Dapple.com@groups.io= > wrote:

       Mike,
<= br>       This is a good way to play aro= und with fixes, and to report
       = bugs. You can see the assembler for different compilers with
  = ;     different flag.

   &nb= sp;   Compiler Explorer
     &nb= sp; <https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtM= A7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9Z= ATwDKjdAGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEINIADqgKhE4MHt6%2B/qRJKY4CIWGRLDFx0na= YDmlCBEzEBBk%2BfgEVVQI1dQSFEdGx8ba19Y1ZLYNdoT0lfZIAlLaoXsTI7BwA9KsA1AAqAJ4J= mBs7C8QbaFgbCLGYpBskG7SoTOgbhhuYqqwJ9AB0JhoAgqECBsFABHLx1TAQIEbBg%2BGYbEwAd= isAI26I2xEwBEWDFhPg2ACp8SwTABmVH/ZEAEQ4c1onAArLw/BwtKRUJw3NZrCDjstEWYyTxSAR= NHS5gBrECMjT6TiSFnijmcXgKEBysVsumkOCwJBoFgJOixciUQ3G%2BhxYBcMxcPh0AixdUQKLK= qKhOo7Tgiw1sQQAeQYtG92tIWBYhmA4jD%2BCxVQAbph1WH3pUvE6fbwgZgGWHaHgosQvR4sMqC= MQ8Cws3MqAZgAoAGp4TAAdwD%2B1ZIv4ghEYnYUhkgkUKnUYd09oMRhQPMs%2BkL6sgc1QCXyDB= TAFoA2SNhvI0sEOTqQpJTsDJLMGrc5U1y4GO5PE09MEJsVSnpcqkBMM/PbP2vujfPp7VaNcOiGR= 8shA682gYcDxiKXo4hAsYfz0BQxkApCJDmBR%2BQHUUsRWHh6SZJUw05DhVAADgANg3WjJA2YBk= GQDZbW%2BLgNggblLGsG5cEIO5zGFG4PCNE0ThErgZl4LUtDmCADVQCSrTNCALUklApxtSQNDlG= haCdYgXTdMMPWYYhQ19FT/QIIMQ2VCMoxjdk4xvPAkxTdk02QDNiOzQRc2VAsixLDAVnZCsqxrP= h6ybFt207LMh2EURxEHHt5CUNRlV0AIdJnPi51CxcIGXVc0k3bdd33ZBDzJY9T3PS9bBg28IFcN= D7RfRCpmQnJki/dJIN/Qa8jSLD%2BvQ9rqlQ0aZvsMDMNfbCUM6bqBk6Kb3xk%2BZFmWPQK0wAL= SI4ZlSFZdlKJo%2BjGNOHT2Mkb4NBe7jeKsOcNkEogpKFe0NnEy1YkFMkzFk0VxUUpB8CoKh1Ky= vsMukLKR1y/MEHVSdMdhqgCD2dg5WITHsmJhRcfx/YNTOi6rt4SjqTwOGNmbNsQduhimJYtiOK4= hMFA2Dn7uQR6pBel65KhqUZTlPNFUu5VKLVbJ5IleUODMcjrtVSHtRmOYkxMtJ4iAA><= br>
       godbolt.org
       <https://g= odbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9= KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4= sGIM6SuADJ4DJgAcj4ARpjEINIADqgKhE4MHt6%2B/qRJKY4CIWGRLDFx0naYDmlCBEzEBBk%2B= fgEVVQI1dQSFEdGx8ba19Y1ZLYNdoT0lfZIAlLaoXsTI7BwA9KsA1AAqAJ4JmBs7C8QbaFgbCLG= YpBskG7SoTOgbhhuYqqwJ9AB0JhoAgqECBsFABHLx1TAQIEbBg%2BGYbEwAdisAI26I2xEwBEWD= FhPg2ACp8SwTABmVH/ZEAEQ4c1onAArLw/BwtKRUJw3NZrCDjstEWYyTxSARNHS5gBrECMjT6Ti= SFnijmcXgKEBysVsumkOCwJBoFgJOixciUQ3G%2BhxYBcMxcPh0AixdUQKLKqKhOo7Tgiw1sQQA= eQYtG92tIWBYhmA4jD%2BCxVQAbph1WH3pUvE6fbwgZgGWHaHgosQvR4sMqCMQ8Cws3MqAZgAoA= Gp4TAAdwD%2B1ZIv4ghEYnYUhkgkUKnUYd09oMRhQPMs%2BkL6sgc1QCXyDBTAFoA2SNhvI0sEO= TqQpJTsDJLMGrc5U1y4GO5PE09MEJsVSnpcqkBMM/PbP2vujfPp7VaNcOiGR8shA682gYcDxiKX= o4hAsYfz0BQxkApCJDmBR%2BQHUUsRWHh6SZJUw05DhVAADgANg3WjJA2YBkGQDZbW%2BLgNggb= lLGsG5cEIO5zGFG4PCNE0ThErgZl4LUtDmCADVQCSrTNCALUklApxtSQNDlGhaCdYgXTdMMPWYY= hQ19FT/QIIMQ2VCMoxjdk4xvPAkxTdk02QDNiOzQRc2VAsixLDAVnZCsqxrPh6ybFt207LMh2EU= RxEHHt5CUNRlV0AIdJnPi51CxcIGXVc0k3bdd33ZBDzJY9T3PS9bBg28IFcND7RfRCpmQnJki/d= JIN/Qa8jSLD%2BvQ9rqlQ0aZvsMDMNfbCUM6bqBk6Kb3xk%2BZFmWPQK0wALSI4ZlSFZdlKJo%2= BjGNOHT2Mkb4NBe7jeKsOcNkEogpKFe0NnEy1YkFMkzFk0VxUUpB8CoKh1KyvsMukLKR1y/MEHV= SdMdhqgCD2dg5WITHsmJhRcfx/YNTOi6rt4SjqTwOGNmbNsQduhimJYtiOK4hMFA2Dn7uQR6pBe= l65KhqUZTlPNFUu5VKLVbJ5IleUODMcjrtVSHtRmOYkxMtJ4iAA>

 &n= bsp;     

       = ;<favicon.png>
       <https://godb= olt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQ= YEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGI= M6SuADJ4DJgAcj4ARpjEINIADqgKhE4MHt6%2B/qRJKY4CIWGRLDFx0naYDmlCBEzEBBk%2BfgE= VVQI1dQSFEdGx8ba19Y1ZLYNdoT0lfZIAlLaoXsTI7BwA9KsA1AAqAJ4JmBs7C8QbaFgbCLGYpB= skG7SoTOgbhhuYqqwJ9AB0JhoAgqECBsFABHLx1TAQIEbBg%2BGYbEwAdisAI26I2xEwBEWDFhP= g2ACp8SwTABmVH/ZEAEQ4c1onAArLw/BwtKRUJw3NZrCDjstEWYyTxSARNHS5gBrECMjT6TiSFn= ijmcXgKEBysVsumkOCwJBoFgJOixciUQ3G%2BhxYBcMxcPh0AixdUQKLKqKhOo7Tgiw1sQQAeQY= tG92tIWBYhmA4jD%2BCxVQAbph1WH3pUvE6fbwgZgGWHaHgosQvR4sMqCMQ8Cws3MqAZgAoAGp4= TAAdwD%2B1ZIv4ghEYnYUhkgkUKnUYd09oMRhQPMs%2BkL6sgc1QCXyDBTAFoA2SNhvI0sEOTqQ= pJTsDJLMGrc5U1y4GO5PE09MEJsVSnpcqkBMM/PbP2vujfPp7VaNcOiGR8shA682gYcDxiKXo4h= AsYfz0BQxkApCJDmBR%2BQHUUsRWHh6SZJUw05DhVAADgANg3WjJA2YBkGQDZbW%2BLgNggblLG= sG5cEIO5zGFG4PCNE0ThErgZl4LUtDmCADVQCSrTNCALUklApxtSQNDlGhaCdYgXTdMMPWYYhQ1= 9FT/QIIMQ2VCMoxjdk4xvPAkxTdk02QDNiOzQRc2VAsixLDAVnZCsqxrPh6ybFt207LMh2EURxE= HHt5CUNRlV0AIdJnPi51CxcIGXVc0k3bdd33ZBDzJY9T3PS9bBg28IFcND7RfRCpmQnJki/dJIN= /Qa8jSLD%2BvQ9rqlQ0aZvsMDMNfbCUM6bqBk6Kb3xk%2BZFmWPQK0wALSI4ZlSFZdlKJo%2BjG= NOHT2Mkb4NBe7jeKsOcNkEogpKFe0NnEy1YkFMkzFk0VxUUpB8CoKh1KyvsMukLKR1y/MEHVSdM= dhqgCD2dg5WITHsmJhRcfx/YNTOi6rt4SjqTwOGNmbNsQduhimJYtiOK4hMFA2Dn7uQR6pBel65= KhqUZTlPNFUu5VKLVbJ5IleUODMcjrtVSHtRmOYkxMtJ4iAA>

  = ;     Sorry I=E2=80=99m traveling and in Cupertino= with lots of meetings so
       I di= d not have time to adjust the compiler flags=E2=80=A6.

  &= nbsp;    Thanks,

     &= nbsp; Andrew Fish




     &nb= sp;     On May 18, 2023, at 10:24 AM, Andrew (EFI)= Fish
           = <afish@apple.com> wrote:
           Mike,
           I g= uess my other question=E2=80=A6 If this turns out to be a
  &n= bsp;        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,
         &= nbsp; but I want to ask the question?

    &= nbsp;      Thanks,

   &= nbsp;       Andrew Fish



<= br>            =    On May 18, 2023, at 10:19 AM, Michael D Kinney
 &= nbsp;           &nbs= p; <michael.d.kinney@= intel.com> wrote:

       &= nbsp;       Andrew,

  &= nbsp;           &nbs= p;This might work for XIP.  Set non const global to
  &nb= sp;            = initial value that is expected value to stay in dead loop.

 &nb= sp;            =  UINTN  mDeadLoopCount =3D 0;

    &nbs= p;          VOID

&= nbsp;           &nbs= p;  CpuDeadLoop(

       = ;        VOID

  &n= bsp;            = ;)

           = ;    {

       = ;        while (mDeadLoopCount =3D= =3D 0) {

          = ;         CpuPause();

&= nbsp;           &nbs= p;  }

        &nbs= p;      }

    &nbs= p;          When deadloop= is entered, developer can not change
     &nbs= p;         value of mDeadLoopC= ount, but they can use debugger to
      &= nbsp;        force exit loop and re= turn from function.

        =        Mike

   &nb= sp;           *From:= *Andrew (EFI) Fish <afish@apple.com>
           = ;    *Sent:*Thursday, May 18, 2023 10:09 AM
 &n= bsp;            = ; *To:*Kinney, Michael D <
michael.d.kinney@intel.com>
     &n= bsp;         *Cc:*edk2-devel-g= roups-io <devel@edk2.groups.io>; Ni,
          =      Ray <
r= ay.ni@intel.com>; Rebecca Cran <rebecca@bsdio.com>
       =         *Subject:*Re: [edk2-devel] = CpuDeadLoop() is optimized
       &nb= sp;       by compiler

  = ;            &n= bsp;Mike,

         &nbs= p;     Good point, that is why we are using the st= ack =E2=80=A6.

         = ;      The only other thing I can think of is= to pass the
          = ;     address of Index to some inline assembler, o= r an asm
          &nb= sp;    no op function, to give it a side effect the com= piler
           =     can=E2=80=99t resolve.

   &nb= sp;           Thanks= ,

           =     Andrew Fish





  &nbs= p;            &= nbsp;   On May 18, 2023, at 10:05 AM, Kinney, Michael D
&= nbsp;           &nbs= p;      <michael.d.kinney@intel.com> wrote:

  &= nbsp;           &nbs= p;    Static global will not work for XIP

 =             &nb= sp;     Mike

     =             &nb= sp; *From:*Andrew (EFI) Fish <af= ish@apple.com>
        &n= bsp;          *Sent:*Thur= sday, May 18, 2023 9:49 AM
       &nb= sp;           *To:*e= dk2-devel-groups-io <devel@edk2.= groups.io>;
         = ;          Kinney, Michae= l D <michael.d.kinney@inte= l.com>
         &nbs= p;         *Cc:*Ni, Ray <ray.ni@intel.com>; Rebecca Cran            &n= bsp;      <rebecca@bsdio.com>
      &nbs= p;            *= Subject:*Re: [edk2-devel] CpuDeadLoop() is
     = ;            &n= bsp; optimized by compiler

      =             &nb= sp;Mike,

          = ;         I pinged some compil= er experts to see if our code
       =             is = correct, or if the compiler has an issue. Seems
    =             &nb= sp;  to be trending compiler issue right now, but I=E2=80=99ve            &n= bsp;      NOT gotten feedback from anyone on = the spec
          &nb= sp;        committee yet.

&n= bsp;            = ;      If we move Index to a static global th= at would
          &nb= sp;        likely work around the c= ompiler issue.

         = ;          Thanks,
            &n= bsp;      Andrew Fish





=
            = ;           On May 1= 8, 2023, at 8:36 AM, Michael D Kinney
     &nbs= p;            &= nbsp;    <michael.d.kinney@intel.com> wrote:

   &nbs= p;            &= nbsp;      Hi Ray,

   &= nbsp;           &nbs= p;       So the code generated does dead= loop, but is
          = ;            &n= bsp;just not easy to resume from as we have been
    = ;            &n= bsp;      able to do in the past.

&nbs= p;            &= nbsp;         We use CpuDeadlo= op() for 2 purposes.  One is a
      =             &nb= sp;    terminal condition with no reason to ever
&nb= sp;            =           continue.
            &= nbsp;          The 2^nd i= s a debug aide for developers to
      &nb= sp;            =     halt the system at a specific location and
 = ;            &n= bsp;         then continue fro= m that point, usually with a
       &= nbsp;           &nbs= p;   debugger, to step through code to an area to
 &= nbsp;           &nbs= p;         evaluate unexpected= behavior.

         &nb= sp;            =  We may have to do a NASM implementation of
    = ;            &n= bsp;      CpuDeadloop() to make sure it meets= both use
          &n= bsp;            = ;cases.

          =             &nb= sp;Mike

          =             &nb= sp;*From:*Ni, Ray <ray.ni@intel.com<= /a>>
          &nbs= p;            *= Sent:*Thursday, May 18, 2023 3:00 AM
      = ;            &n= bsp;    *To:*
de= vel@edk2.groups.io
        &= nbsp;           &nbs= p;  *Cc:*Kinney, Michael D
      = ;            &n= bsp;    <michael.d.kinney@intel.com>; Rebecca Cran
   &n= bsp;            = ;       <rebecca@bsdio.com>; Ni, Ray <ray.ni@intel.com>
      &n= bsp;            = ;    *Subject:*CpuDeadLoop() is optimized by compiler
           &nb= sp;           Hi,
           &nbs= p;           Startin= g from certain version of Visual Studio
     &n= bsp;            = ;     C compiler (I don=E2=80=99t have the exact v= ersion. I
          &n= bsp;            = ;am using VS2019), CpuDeadLoop is now optimized
    =             &nb= sp;      quite well by compiler.

 = ;            &n= bsp;         The optimization = is so =E2=80=9Cgood=E2=80=9D that it becomes
    &nb= sp;            =       harder for developers to break out of t= he
           &nb= sp;           deadlo= op.

          &nbs= p;            I= copied the assembly instructions as below
     = ;            &n= bsp;     for your reference.

  &n= bsp;            = ;        The compiler does not gene= rate instructions
         =             &nb= sp; that jump out of the loop when the Index is
   &= nbsp;           &nbs= p;       not zero.

  &n= bsp;            = ;        So in order to break out o= f the loop,
          =             &nb= sp;developers need to:

       &nb= sp;            =     1. Manually adjust rsp by increasing 40
 &n= bsp;            = ;          2. Manually = =E2=80=9Cret=E2=80=9D

       &nbs= p;            &= nbsp;  I am not sure if anyone has interest to
  &nb= sp;            =         re-write this function so t= hat compiler can be
        &nbs= p;            &= nbsp; =E2=80=9Cfooled=E2=80=9D again.

    &= nbsp;           &nbs= p;      Thanks,
    &n= bsp;            = ;      Ray

    &nb= sp;            =       =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

      &= nbsp;           &nbs= p;    ; Function compile flags: /Ogspy

 &nb= sp;            =          ; File
  = ;            &n= bsp;        e:\work\edk2\MdePkg\Lib= rary\BaseLib\CpuDeadLoop.c

       = ;            &n= bsp;   ; COMDAT CpuDeadLoop

    &= nbsp;           &nbs= p;      _TEXT SEGMENT

  &nbs= p;            &= nbsp;       Index$ =3D 48

 &= nbsp;           &nbs= p;         CpuDeadLoop PROC ; = COMDAT

          &= nbsp;           &nbs= p;; 26   : {

       &nb= sp;            =    $LN12:

       &= nbsp;           &nbs= p;   00000  48 83 ec 28 sub rsp, 40 ; 00000028H

=             &nb= sp;          ; 27 &n= bsp; : volatile UINTN  Index;

     &nb= sp;            =      ; 28   :

   &= nbsp;           &nbs= p;       ; 29   :   = for (Index =3D 0; Index =3D=3D 0;) {

     &= nbsp;           &nbs= p;     00004  48 c7 44 24 30

 &nb= sp;            =          00 00 00 00 mov =      QWORD PTR Index$[rsp], 0

   =             &nb= sp;       $LN10@CpuDeadLoo:

 = ;            &n= bsp;         ; 30   = : CpuPause ();

         = ;            &n= bsp; 0000d  48 8b 44 24 30 mov      rax,= QWORD PTR
          &= nbsp;           &nbs= p;Index$[rsp]

         =             &nb= sp; 00012  e8 00 00 00 00 call CpuPause

   =             &nb= sp;       00017  eb f4 jmp SHORT $L= N10@CpuDeadLoo

         = ;            &n= bsp; CpuDeadLoop ENDP

       = ;            &n= bsp;   _TEXT ENDS

      = ;            &n= bsp;    END

   
<= br style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 1= 2px; font-style: normal; font-variant-caps: normal; font-weight: 400; lette= r-spacing: normal; text-align: start; text-indent: 0px; text-transform: non= e; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; = text-decoration: none;">
<= br>
--Apple-Mail=_9E2A2D25-B7B6-4F12-87A1-267322923EF2 Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=favicon.png Content-Type: image/png; x-unix-mode=0666; name="favicon.png" Content-Id: <47A6B659-06DE-4898-A902-36E21E3CE2CB> iVBORw0KGgoAAAANSUhEUgAAAH0AAACACAYAAAAmjGbiAAAABGdBTUEAALGPC/xhBQAACjppQ0NQ UGhvdG9zaG9wIElDQyBwcm9maWxlAABIiZ2Wd1RU1xaHz713eqHNMBQpQ++9DSC9N6nSRGGYGWAo Aw4zNLEhogIRRUQEFUGCIgaMhiKxIoqFgGDBHpAgoMRgFFFReTOyVnTl5b2Xl98fZ31rn733PWfv fda6AJC8/bm8dFgKgDSegB/i5UqPjIqmY/sBDPAAA8wAYLIyMwJCPcOASD4ebvRMkRP4IgiAN3fE KwA3jbyD6HTw/0malcEXiNIEidiCzclkibhQxKnZggyxfUbE1PgUMcMoMfNFBxSxvJgTF9nws88i O4uZncZji1h85gx2GlvMPSLemiXkiBjxF3FRFpeTLeJbItZMFaZxRfxWHJvGYWYCgCKJ7QIOK0nE piIm8cNC3ES8FAAcKfErjv+KBZwcgfhSbukZuXxuYpKArsvSo5vZ2jLo3pzsVI5AYBTEZKUw+Wy6 W3paBpOXC8DinT9LRlxbuqjI1ma21tZG5sZmXxXqv27+TYl7u0ivgj/3DKL1fbH9lV96PQCMWVFt dnyxxe8FoGMzAPL3v9g0DwIgKepb+8BX96GJ5yVJIMiwMzHJzs425nJYxuKC/qH/6fA39NX3jMXp /igP3Z2TwBSmCujiurHSU9OFfHpmBpPFoRv9eYj/ceBfn8MwhJPA4XN4oohw0ZRxeYmidvPYXAE3 nUfn8v5TE/9h2J+0ONciURo+AWqsMZAaoALk1z6AohABEnNAtAP90Td/fDgQv7wI1YnFuf8s6N+z wmXiJZOb+DnOLSSMzhLysxb3xM8SoAEBSAIqUAAqQAPoAiNgDmyAPXAGHsAXBIIwEAVWARZIAmmA D7JBPtgIikAJ2AF2g2pQCxpAE2gBJ0AHOA0ugMvgOrgBboMHYASMg+dgBrwB8xAEYSEyRIEUIFVI CzKAzCEG5Ah5QP5QCBQFxUGJEA8SQvnQJqgEKoeqoTqoCfoeOgVdgK5Cg9A9aBSagn6H3sMITIKp sDKsDZvADNgF9oPD4JVwIrwazoML4e1wFVwPH4Pb4Qvwdfg2PAI/h2cRgBARGqKGGCEMxA0JRKKR BISPrEOKkUqkHmlBupBe5CYygkwj71AYFAVFRxmh7FHeqOUoFmo1ah2qFFWNOoJqR/WgbqJGUTOo T2gyWgltgLZD+6Aj0YnobHQRuhLdiG5DX0LfRo+j32AwGBpGB2OD8cZEYZIxazClmP2YVsx5zCBm DDOLxWIVsAZYB2wglokVYIuwe7HHsOewQ9hx7FscEaeKM8d54qJxPFwBrhJ3FHcWN4SbwM3jpfBa eDt8IJ6Nz8WX4RvwXfgB/Dh+niBN0CE4EMIIyYSNhCpCC+ES4SHhFZFIVCfaEoOJXOIGYhXxOPEK cZT4jiRD0ie5kWJIQtJ20mHSedI90isymaxNdiZHkwXk7eQm8kXyY/JbCYqEsYSPBFtivUSNRLvE kMQLSbyklqSL5CrJPMlKyZOSA5LTUngpbSk3KabUOqkaqVNSw1Kz0hRpM+lA6TTpUumj0lelJ2Ww MtoyHjJsmUKZQzIXZcYoCEWD4kZhUTZRGiiXKONUDFWH6kNNppZQv6P2U2dkZWQtZcNlc2RrZM/I jtAQmjbNh5ZKK6OdoN2hvZdTlnOR48htk2uRG5Kbk18i7yzPkS+Wb5W/Lf9ega7goZCisFOhQ+GR IkpRXzFYMVvxgOIlxekl1CX2S1hLipecWHJfCVbSVwpRWqN0SKlPaVZZRdlLOUN5r/JF5WkVmoqz SrJKhcpZlSlViqqjKle1QvWc6jO6LN2FnkqvovfQZ9SU1LzVhGp1av1q8+o66svVC9Rb1R9pEDQY GgkaFRrdGjOaqpoBmvmazZr3tfBaDK0krT1avVpz2jraEdpbtDu0J3XkdXx08nSadR7qknWddFfr 1uve0sPoMfRS9Pbr3dCH9a30k/Rr9AcMYANrA67BfoNBQ7ShrSHPsN5w2Ihk5GKUZdRsNGpMM/Y3 LjDuMH5homkSbbLTpNfkk6mVaappg+kDMxkzX7MCsy6z3831zVnmNea3LMgWnhbrLTotXloaWHIs D1jetaJYBVhtseq2+mhtY823brGestG0ibPZZzPMoDKCGKWMK7ZoW1fb9banbd/ZWdsJ7E7Y/WZv ZJ9if9R+cqnOUs7ShqVjDuoOTIc6hxFHumOc40HHESc1J6ZTvdMTZw1ntnOj84SLnkuyyzGXF66m rnzXNtc5Nzu3tW7n3RF3L/di934PGY/lHtUejz3VPRM9mz1nvKy81nid90Z7+3nv9B72UfZh+TT5 zPja+K717fEj+YX6Vfs98df35/t3BcABvgG7Ah4u01rGW9YRCAJ9AncFPgrSCVod9GMwJjgouCb4 aYhZSH5IbyglNDb0aOibMNewsrAHy3WXC5d3h0uGx4Q3hc9FuEeUR4xEmkSujbwepRjFjeqMxkaH RzdGz67wWLF7xXiMVUxRzJ2VOitzVl5dpbgqddWZWMlYZuzJOHRcRNzRuA/MQGY9czbeJ35f/AzL jbWH9ZztzK5gT3EcOOWciQSHhPKEyUSHxF2JU0lOSZVJ01w3bjX3ZbJ3cm3yXEpgyuGUhdSI1NY0 XFpc2imeDC+F15Oukp6TPphhkFGUMbLabvXu1TN8P35jJpS5MrNTQBX9TPUJdYWbhaNZjlk1WW+z w7NP5kjn8HL6cvVzt+VO5HnmfbsGtYa1pjtfLX9j/uhal7V166B18eu612usL1w/vsFrw5GNhI0p G38qMC0oL3i9KWJTV6Fy4YbCsc1em5uLJIr4RcNb7LfUbkVt5W7t32axbe+2T8Xs4mslpiWVJR9K WaXXvjH7puqbhe0J2/vLrMsO7MDs4O24s9Np55Fy6fK88rFdAbvaK+gVxRWvd8fuvlppWVm7h7BH uGekyr+qc6/m3h17P1QnVd+uca1p3ae0b9u+uf3s/UMHnA+01CrXltS+P8g9eLfOq669Xru+8hDm UNahpw3hDb3fMr5talRsLGn8eJh3eORIyJGeJpumpqNKR8ua4WZh89SxmGM3vnP/rrPFqKWuldZa chwcFx5/9n3c93dO+J3oPsk42fKD1g/72ihtxe1Qe277TEdSx0hnVOfgKd9T3V32XW0/Gv94+LTa 6ZozsmfKzhLOFp5dOJd3bvZ8xvnpC4kXxrpjux9cjLx4qye4p/+S36Urlz0vX+x16T13xeHK6at2 V09dY1zruG59vb3Pqq/tJ6uf2vqt+9sHbAY6b9je6BpcOnh2yGnowk33m5dv+dy6fnvZ7cE7y+/c HY4ZHrnLvjt5L/Xey/tZ9+cfbHiIflj8SOpR5WOlx/U/6/3cOmI9cmbUfbTvSeiTB2Ossee/ZP7y YbzwKflp5YTqRNOk+eTpKc+pG89WPBt/nvF8frroV+lf973QffHDb86/9c1Ezoy/5L9c+L30lcKr w68tX3fPBs0+fpP2Zn6u+K3C2yPvGO9630e8n5jP/oD9UPVR72PXJ79PDxfSFhb+BQOY8/wldxZ1 AAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAACAASURBVHja7X13 fNzVle859/7KNGlULNlqtsEdTDEGE5YSEmpoIW1JY0MKyb5k376UTfKyn2Tf7kvylpRN4fF2X+pu NpAQUoAAMYEkBAiGYAgYXHCRLUsyqlad9mv37B/zm/Fvfvq1kUayIL6fz/2MZqQZzb3fe849/QCc GCfGifHqH3hivZEHvVo2gf0ZgIw1OuD4aiEU/DOmaKwRZdMJ0BfvmrDK9VOVANMJ0BfHWjACi8YI AJLrNXolA49/BoAHPWIIeOQBppgDNzgB+gIB7gSXRQSePCicXM9FCGc4AfoCrcEL7CgzCPAo8xUF vPRqBrz11LiUapX5+CENhCAUJjESgGQRI7L/ngDLPwOAnCgyg6l+3bSpuQSs8Hh0Aown7vSF/+4l sBkAQOupcWl4V77E0hkAcPv33H6OHuy+TKGxNIfCpFUCvgS05XguXIfCi+LpBOjze4eXQMTUMpll Bg12xS1d7Us3xq9Ehk3CIkEWIVElpZMABKLi+xkCEBh9T2UefeLrg91cQbB0KgFvuSb5gL/ogX+l s/cZ93cJ8Cu/0rWi8+zk/+UKu6TaD0xd13BITrJP/P4LL78Qa+BKYcLSAcB0cAi0gQcfkJ2sHhcb +Ox4gzRHoWvG75MtkgwArO30xM024NVutuAKO6lrS/ImAIgVJiwJABQAUAFAtqdkXxPccX24vyPW YN3zwo3ZcQB7Ln8btEEs3siloRfztP7ahiRXcDMAABEZVUrjAACg1vHXnPXeJacAQIxJEHcBL9mT uaYXYNUe5DBj0isGdKyS8v1+5/c+BgCsYaUqAwDf+Namc5mEpwEAIKJUJQAMAIArrLV5VWwtAMSF CQoAxGzgFRfwfhTP5sD95ko0x/VOj2oHn82Jdm4SBwBmFgS3Je+NyLDRptxZH+x0l7IZALbZ+6S7 Pgu9pH4XV6n2f5NDJvATBOesGrLjCDiGsMcwanSqYhwA+MieAsTSXJHibJOH1azqkVgibVy6Mb7U pnLVMd3U7qR4Pss1ocf7IITLLXrp3WsRsxVa3BvF5TiTjLzgZ3+g5SRJZWfV4lDH0nxV8+pYx9DO fMYBhAB/m7vl+F5U5aEjD2onj+dzpno2T+Ciz3PmZsluanVMyed1r7+TjLzgACCnu5SVXMaTayEA ISJrPyux0UHpMcfPJWpXXFK9FGENfhzCj0uwENnmuIKOIawcAYAvWReTm1apkmtjpJYNsZhjA4Om lFgiKS0bYolYAy9J1MrS0+LpJeviN9ZyQR3npC5PdypNThYfS/MkVzHmkOYVl5DnPATyknWxeLJF qlD55ARTki2Sl1AoOcDnDktimDp4XCxyGMLOGQBgolniuaMmAgC7+hvLV6eWyisLE9bEvf+t50UA wFgD5wAAhQnL05EhxRDVes6zw6YoUcTp72hua90QW96xOfm+WIN0Va1Z19TL+q4DD0/+avCF/KG+ pzJ9AFAAAE1OMJ0E6WaBCragZ9lGHAEAQoohJFtlNtmrmwAAl32hc3W6U+nKHjVHt36idycAkBRD NAvktvGLAHOvgDk6eeYLdLcrk9l6NM+PWwgA7F2/WPOmZIv0RWTYQYKmClPWjw48PPWDbd8Y7AcA 5AqipVOFRGy/BgAAbZsSybNuWrI53aFsiTdKr5Ni7DQPq9hcR8XnaBlrcLJP3z68O//cnnvHnx3r 1sZtsEvTtKdlm3AtAIDN72tZuv7ahrckmqX3MI5tRJSdOmJ84c4bDtzh+D9OgC2X6Zdc4M8JeJxH CvcCnAEAf/tPVl+T7lS+b7O28rAM6p4e0O969JaBOwd35PJei2k9JZ648O+WvaG+Q7lKTrLXIKJy PEyZ2RHjuYnD+pMv3HX04d4nMkNu0AFAMBnhjf+28o3Nq9QPcIWtdX/GeI/2xbve1f0DABBcRrIM ctv3TdcBqImtf75Ar1BBnIDf8ONV16a7lNsQsd71RYV9f4GRs3aM7tfu+uWHe+4v68zLFeWSf+y4 Pt2pXKUk+abyG4kEIiIsjPOIiIgQsSwL6Vmrd6JXf2T7d4Z/2v/H7GgJsCtu6Tq/7YzEDWo9v8Bp 4rX3pPQIo/vyt/z8vYdutw+JEAaZjsPjPERWrYDH+Qa8caUqjfdoCAD8bbevuqpxhfJvyLDeiwW7 AcyPm09MHNae4ApT013Ka9U6fqbjby1784+Hp7AEfvm76lnr0NQR/fHCpDXUeJJ6dqJJugAZyo51 MdcHWIjIAQCGdua+dM+Hen4CABaTwBImGDbYhj39wPc0IS8k6G61jDWuVOXcmMm0KYu9467Vb6pr l/8VEWP2Fw6LUZvN744L+jb4UO33dR6GoV252+75YM/tAGDYwGs24LrjAPgBL6qhdl5jwJ0sXZoe NJilEb/hzlXX13co/4qIcYd5Emd5GBdVDEAI4IHfFxGxdGhSrfKWtk2J/L6tk/tIAGMcuC3GBoV0 zcpIw+eBylmyReK5oxbaQtu16U7lWzbgiw60xXRo6tuUc1tPjWcOPDS5jwiAcUCiijsbfe5xL5s9 1hr0oFAlZuREUUq/c9Vl9Z3KdxExcQLeaOphulM5d8m62ET3b6a6iYCYBECiqoDMBaH0irs82SJx IyfYX96x6qJ0l/Jd29t1YkTYzxKrb1iuntewQhk89PvpQ1KMoTBIQIQYAB+2P2PUyuGCAACpZTLP DBqw+tL6eH27/Clk2LJAgpfn/xAmmXrGGsseNQfzY+aENmVltGmRNwtCFxZZyJBJKspKisdiaZ6K N0qNiWapVa1nzVxm6kILkYiIJMhEhtLy81J/tebK9O79D04ess27TmON0z4vPNh6IPVLc6TyCvae aJYwM2jg2qsaliLHjgURngURsqIETIKENm0dzQyZ/QM7snt6Hps+MNatTRUmLd1194Efe5QTTGpc qaaW/0Vqede5qdNTy+QVsTRfyjhKNjUKG595AR9ZUY2TYqyl6WS1CwCOOAw1kv3I4ZhHjzkOYySB DucIupu1S9kRkylJptz4y7U/lmLsinlUlcrqjmWSNn1EP9i/Pfv87nvGd44f0qbBO07dy4RJPusr HuQlUuzMdzef0XZm8vR0p3KKHGf182kUIkECGbL8mNn98D/0f2HgudwAAOQAIG/PQsn271Dl3Oba QNWtlv50zI6YpKY50yYtGDuo/f+WDbELbSGu5mwRERkR0ciewnPdv53c/sKdYy+59FevGPUo9usK 9TM3aua3fWPoMQB4fMP1javXX91wUfNq9VyusMQ8UToDAOjfnv3DwHO5jJxgipETGoQHaMyaTc+F 0hlUugfVmx5cd5tax98yH5sz0avtf+m+icd3/Ojobh+LlRlyCLykYOd+OBMiKvz+G9/WtPbUNzVe 07BCPXs+1jb1sr735zcd/JqeFZNMxrwwKGtTu5PiZzh5HGuDIOme1wB0r7AnDgBSukvpb14Tu6Fk bpwDK4fSFSossg7+fvp3v/50370vP5sbAACDyShIlE2WhsOSZTg2x/mz7vO6n/mz6DlTUZAF1vDu /Oiee8efqmuXx+o7lFVcxthcBT3HGmnPveO/7N2W6UMGFlkV38XvQFPAVQXzBfqM8CUAkA7/ITO5 /prGFiXFz6iFmTM7agw9eevQndu/NfyspZMuxVAICwyyQPMAULOnPkewy6CTBSYyEEqSoVkgs+fR 6UOZIWNHy/p4h5LirQ5BCmdxXQEAwHiPtvehz/TfDwAmUMV38bLDixAb/MKDDgCSpdOhznNS1zJe vYHGCfjIS/ldD36q784jz2QHAMAABNO2TzvBdf5ccLwWBLrhMU0HRVVOAmHpZCADAQTWWLc2+eJP xh7rek2qPtUqr3Hq29WuV5hkPHXb0F1j3dqYB9ie3Cfkypo30J3gczfoIy8VtJUX1vHkEvm8WbA7 LAo1me2//PDhX2hTVs4G3ACaAaLmA7IRAGyQC9MdyFAZ4ECVm/3SfRPPt26IGeku9YzZqnNDu/I7 tn1zaJsDbK/D6ZbYhc9d7jtqGSOHbuGBy8XFD+zI/cnWb6tmd31PZ55+4KO991Xc1VRB4QXX1ByP muv1IFZvhNz97s91fwdt6yf7ftb3x8ztQepS0Oh7KrPHg1WLgOdQzV0+H6DPCNuxiuZDSDRJKbc/ OcoYfCH3wq8+1nt/iZ17UHTBxdY1H0DD7mvTxU7dP7upzH2VaFxGDQC0X328966Xn8ve5TStRl1v olmKe3AZCri7qwa81qBXGgDUMoujZWckqg5WHO/Ruh/+bP99ZcCpAlC/e1z3YIVRo0/c1CRgZoqy 12HQAUC3DNK4gjoAaPf9zeEfjh0s/KZkWo0KzIoL6jYjD71evKJmquIsrEZsfcYwteIJv+SfOjan WuXrIgkyVpEz5MbM4Ue+cOTu3FEzAwCGA/Cwe9tLyKG5skPX+5wFCpyHwbA1ChMAtLs/cOjW7Kix sxp7SKpVXnHBx9vOhplBEwKCI2bmnb2HZZNWPO/ckvqrqJvKODJhkfX8D0e3juwpjAKCCVjJThFR Y4wZiKgjosEYMxljFmNMMMaIMQaMceS8PJk9Oedc4lxyDtkx3a9JnEsS55L9Ps4dn4Wcc2SMgyRJ hIiiBJRZoAJX0DQ1yj/7/ZH/Z2pioqSJhA0AgJMurrtYSTHhwVWicqnQ6Bk+R8Dd2RcV2SoXfqrt lGWnx/+nI3M09LP7n84++cTXB58AsAGnCh1cAwCNiMoUTkQmERlEZNmzNAQRgWsikUAhKia4nqMQ ggkhkEggkWDF95Vn6TkQEQohymbh8j1uFTd7dG9hsmVdLNu4Uj0PIwwAADnG0mod6+ndlul2cDTD JZ8E6enhV+9cPWs+ljkEALbiL1JvtmPiIo3cmDn06C0vP2QDbtpqWZnSE4mE3N7eeYokSQoRFRhj AhEtABCIaC8aCbG4AfZrPqceI2wQeYZ3E5VfR0RUp6enD/b0HNxvv2YBACAHIAvgob/vf+Dqry+P N6+JXQgACgkQQITkwTG5jEphyhoY2pk/EGCMsSA4ErYmrtWoxQEqKL7pZFVV6/n51bCRg7+dejw7 YmZtI8gMHbWxsam1paX1g5zzTiIqwPEv6UGImFRV9T97eg5+vSSaFFWXMvD0wMd671q6Mf7beJOU tHRiJEgiAg5UQTjEFaSpfn1yolefRAaGy7RsenjSQl3FswE9LFVphkNCijPJzAv+2s+0X8EVXB2Z yo8aL2//zvAzTsHIrTsjMhMRVZvC4rBoBsZc8lEJeIEcJMaRhnbmh8G7kAE63iMAwOQyWpZBmoul e2kfQWydasnevQAv3+NmXjAAkOra5NdXw9r3PjD5sJ4VmkuAmWEnJyJz8YBdTFqwhTDmAsGygbcs iwx7fwyYWbbEWYhIAIBlFRMeDB/txILwUmazpnSsEnCpaZUaH+vWYN1V6RY5zjZG9Tzlx83BvVsn 9gOABQiW7WhwLlQHAIMxtFz39CIZVDJBWzCzjGhp/aXqVKUDgH6ge3A7I0B4q9ryJ9UKcACQxro1 AAD5jHcueZsUY+uj6qiDL+Sen+zVpwHAAvJ0NJgAYNpC22IafsUVvEymXjn6zOc9VohfgHwMNLOW 3sMEN0/AO85J1p/xzubNjSvVyxPN0lttKVcEmF8JAJAEiYHnc90+C7ZBRxOALMY4AkB88YGOcTgW pOimWjc4YXVpne8zXR4/t3l2VgYnqZqTbEe7llgZP/vmltbVl6YvU+vYOVxlp3IZ1zKO6RJ7C7K3 2wGNOD1gdPc9lTkScMJNRDCIwDAMfdKyzGeIeBsR5Yvfi0q1XVmJ1RKFlTShCBYyDKvpTgBAjLGk rmvdHn/jlX7kvu68uAN5WOD8UpmqFuK8QA8swWkDzt5975q3x+r5O5HjOmTQbEvU4KDuKNY+AgAY P6z1TvTqWSYjiWOpuhWg28KbNTAw0JvNZv+RMSbZthcJgDgRScUJEhHZr5W4ETnZKTiL/4Z7+tx1 3rFsly/+Di1EFLquZ1yU6mW3j1KDxi0IhhUomJUZNkyQm6GLv/ehdZ9WkvxzAS7RSKbdUqjvWLfW D1DM5BCGF2svTkQUlmWa4+Nj445rRgJHmQ/HI3dIye67M0ogoV/akBegfr54v7CmML+38DlAIsC9 WpXTJQp7LwN+yT91dMhxdpP7Xp7thahlrPHxHm0MAASZnqysvGElancIQwTVV3CK6ljxAjzMCyd8 2HEQmyeYWTvWKf2H+darltzDpPcyZSRbJJYdMTG5RGqI4mGLOoycyE4c1qbsO97yYYvuTXObG702 hvu4HTHksIYBLkLcrkHPw4IYvYoPAsxDYwEpyn2eHSkWBjI1AiIQtQpgN7IiM3FYzxRFgWCw7axe 4QG2l/RaAt5d+SGqehPE1oUHWzcjsntRhTeMfKgf5gJ4mMo2w5liGVTToAstY2WMnCiyb+G5sbbQ hIKIrJUrT2pfurTt44yxNiLKE5Ft5CjVby8Kbcekd6paePPafMZYzDTNI4cOdf9wfHxs2OdONyIA 7o5li3InR7Gt10yQmwG8MIgB1S5TxcyLotOkSLvu7gkzJFhVjTVIknSJq17NggxJktpVVf258xD6 sHS/SB0rgiBHs6DkmoVLeRX9Q8usLaULq1hyy5b3CYJ7poCtvk0cFyO7EBmiEoBIHqzeCqFwv7y6 sBBmghr3gavG9s5K7TDmwW0RJKVGWfzCmN/Q80DOuI4i6tduAbOatc1pH6pxrSKJecvN9gK36oiQ hSZ+D4k6LJzJ726m+QQ5Knt3n8JjTW5qTTv+7H2GlcqOKlKPD5WjXNoHh6WOqmTPYjGc1jAvW4Ug 5wgTqs0/j6EMACSsyHcWOsy8CzyISoc0QNByU7SIyNkWBehhd29NhpLidcfMsoB+OTClSNGxsaP9 qqr+b0RWL4SgYpCikIQQMlHZBs9Ktvfiz8d6r0U5tMdi7YorRkTBGOOmaU5OTU2OOr/PXEyhi5HS K4QLJcVAzwhicm1JTE2xuoaVSmqiR88hA/AAHR1gsOHhocnh4aGtcCzsyK/stjMsyS95P6wVB3lY 3Qz78ABEb9ITFrQYZU8X9E5HACA9U4zzFQbpiKDU6ovIcZZsXKHWe6mHHlcL+WxSFNOpX9nsyN2b AowjQW21/A7aca2lx6o4YfTYlwd6jIJ4vlZfXE6y+oblagMAIJOQhVCMm1L8zJRu06lXLlgU71WY 67Ii3NtnekXIYMBhCSK+WZUa8Rrcz/rm8YVL0TLPLlkb75RibM3cxCISjDMpN2b2H3p0+gBXmBAG 6Q5DR0U6riMnzDMg0/Hca9OrVcW8DpWfjl66+52Cm9dnVAvsvLXrCrrTnYssOSus528/Ovjyc7lP r7k8/e9Nq9TT65bJW2KN0mmSiktdvvRgtysVza8Ny5UOAAAjJ0QQ9RCR1djYlFy2rH0DY5gsynFC EkJIRFR+tAU67rTL27K3a6PcQt3MxAg7UIJKAh0iCAC0GEM7Xg9Nzjnmcrmevr7D3fZ+eplaS206 nXXfoppha96uS4rI3kuGB85VFMO78tPDu/IvAsB+ANi6ZG2secWFdWu7zk1e1LBcPVut4+0QVooD i1dLwwp13Zor08v3Pzi5349V2pWkxJIlLSsaGxu/yhhbGTEUupZ3pydIiCgXCvk7+voOf9F1XXhJ 924vIYB3ZSs/WQV93jNnhwu5AKugekujUihvOTZ7dF9hfHRfYcez3xvZG0vzH19724qPNJ0cu8BZ IMhDNUJbmKtrOzOxYv+DkwcC2DS3qU1CxJT9/kXTHNiO75cCroQgfT5M78cIZtuqgGdhJxmCw4Tc CfqFwqSV2XHH0Z8ZOTEatQxH+6bkpniTFAOfJnvHWLwgOyByMZliQQgyIbjtVrXTSyBkUKOOTSzk TvfTW72yUMrA73twsjs/bnZH/RL1HfKGlRemusC/R1vpXmeLCHBHImM52cGrF1tYbzav55KPgFqT Vl1RVLYgQ4XhovYC8mJlp+kBY3cV7BFPub7xdR6gV2yYHeEKi4itlwy0zAdUzhWUXFxAgsrebb79 3MC7gW8Yxc8JdC9q96L0iqI7ZBWrGu7bOvE7syBGoxpymlfHtqy7puFk18ZIro1QEbFpMeEOAMAY Jj0oU2IyypZO3LUOxWeqzkcphooH8DwC8KGHQPIR4tz3ljN7o6R+BHEF2PfgZM/m97c8X9+uXBrl iyBDdua7mt+49/6Jr7moouSulDRNy5mm+SxjrAOKRYZKLNYrPAqrZXtVSvBUBJwldV3vcVkVOQCQ KIaX8dd9tn1j++bkZUzCJAl/rYMxjOtZ0f34VwbuPPJsNuMA1vKQ7HG2llGM8JpfcUDmuotKp7J0 WmMXfrLt/FOub/x6xM1EAIA9vxz/7mNfGngEGRRIQB4qqzEYrgBJFnBHRu1QDBGvOAD/AAoDfMKl Lvp02/p1Vzf8B+ORQ7xoeHf+b++++dD9UBmV4w6+9IsuCj0ILII+Sj53u4CZpbgqarBt++bgH7WM tSfi4SMAgFWX1F/fvjnRSgIkrqLqBtMW5rjjuztNsF7JBobP94w6wwoMuvPKkEnFw9a8JpZcdWn9 Z6sAHIRJY4e3TXc72L3i4UDiPs6eSJyNR+QCs2pmTxZA25kJK92lXhzlfUQkJIUlW9fHm3b9Ynw7 WSCwaAsUVZgjvUymYUkIYdMdDmX5PIpS9QkAwOu/tfKjiSb5ykgWSntM9us//81nj/zWwaHcrHxW XRdnA3oU4N2JeQwAMDtsjqy8qO4cSWUtEaVhjDdKHUs3xtn+X0/uBbIjayg0QNAvmsWLPc52BoY3 OwCHa7654qqWdfGPVQO4qYuxP/zL4FcnenQNZrYxcx9mr3XjXEEPAp4i3P2lpEezfVNSpDuVi6tg 85juVDYkW6Sjh5/I9AIBhQAvAq4gvxDlaqYX4BVeOifgr/1M29krL6z7PDJUHJ0iQ8fovsIDT946 9FQI4H7ewJra3tHHCSBcDgQBlX1FLLt3qDWyN3+gc0vSRIZShBNZBn7DdY0fNPIi/+StQ0+QAEJW TooIonCAGocMhwi8yDigHfKFF36ybdOaKxpuYRxTtm0+ctm2wR25fVDs02449tR5cL1UNr/eLb6m 2Sj2a/K5N533jXD9IwEAwk49Fk2rYstswKPKB+XP3vjWpo8ggNh269CTJEDYKc1uCneD7uf0qCYV KEqRJWAScFFUwtgFn1i2cd3VDf/M5XJbsqo0haZV6loA2OF4nxe38uvUhBAxnHouxQODggIYV1Ei C1jjSjVxzs0tn+UKa5vF/yJkyJduTLymcaWSOfjIdLcjpMovgMIv5tyv3qpfckKULsZoN8rDSz/f ef7qy9K3cBmXzNYIEGvgS/ufzv4xd9TUIDyu3u3Tn9ci/5Hq0ZBVVLGu/FLXdelO9cbZslUSxRIm TSfHNnVuSSYPPTK12zLsIDVecc8HBTr4HYKw19yHCQCAmIzMcfjYW/795Bs7zkr8LyZh3VwsP1xh iXSXwvZtndzto4aaHt+z6hIkters4JTYy16yxpVqbPP7Wr7GpNmbTu0mtAIRMbVUXrvm8vR6My96 R/cWJu0lInJAoMixctWER1VsIi+CXUr6wPXXNCx7w1eX/0O6S7kJEXk1QpvfNRpPS63jh7WdE4f1 abt7hAD/tOewhBCcL9ABvAsJSm/+3skfjjdI18EchzNUSknxpV3npV6/bGNCDL+U79UmLRMISEkx LqmIlk5RKyj66bkzuFe8kctqPefatAAA4PEmrlx328q3r7+28V8c/WnEHBsUoX2wYukuJb7n3onn 7EpbYapi1VJ8zUFX6zm3NGJb/rq1o+vc1FeQYR3Upi9bGXhkyNOdyhmrL6vf3Lw6ZmRHzKNTRwzN 0kkgBxZv4JIwy70k/LxRzOOqKvuuuYI8uUSSuYI8P26RkRW4ZF0s+drPtF1w7oeXfq6+XXk3snLV SoLalFEvUnuDtIwEHBrckRuQ4wyESX7dmmZVU66WfdlK6oQEAPJ7tq77cqyev38hXF35cfOlkb2F 3x783dTTex+YOAT+JbMtCG7G53kINt24pHPFBakt6eXqVbF6fvF8roUEWciQT/Rqf/rpjd1fFSZk 4FhPNmdfNg2C68b6aig1bcaXaJak3FGTX/B3y9rXX9N4N5dxAyxMg10AANCzVm921Hxhql/f2fP4 9LMv3TfRF2BO9WvGhwAA669raFlzWfqs+g7lrFiav0aKsQ2wMIMAAC1D5LZ/Z+TLO+44+jwAOJvx FezHkiPKaURasLabjgTHomvTjmxdyFG875N8uZLkyxtXqNe0bUr0nHNzy2Bh0uopTFq9uVFzYHrQ GJoe0Mczw2ZOn7YMOcEwtVSOpbuUVH2H0pJaKneqdbxdrWMncYV1SSquRFZR31YAzG8gh7O9l1kQ AoJDpdzXK1VDsXOV3isEOACQ33X3mo+mWuXPVWsXnuOGiaLJtlKgIiKLLMiRoAIRGEBgUsn5jsAR QUGGKnJIugMu7YoTOB/NdIMAH9qZe/SeD/V826bqrIO1lx4LDvbuVYyJ5pO9O4GX1HouaVOWBADq u+9Z8/fJFvlvFopKXsnDGTk81l147t6P9HxbnxaTTMK8MCnjus/nBHotpXcGAGhpxOQE48Ig/sKd Y0+vv6ahXknxTXCc87deKYAf7S688LP3HPyepVEBWbmlqLv2vQHhPV18R637shEAkJETJMUQAEDc 8eb9t0wP6HfUwOnxqgd8/JC2596/7vmBXfrcIuGrkwPMoqPDfIFeBt8skFDqGAKA+NFbD/zz1Mv6 nS59+wTgDsAnerV99/+Pw/9p5EQBKqN8gkqTzcq1Olf27r7XK6alEyZbJdnICtj507GnVl9e3xxL S6dCxO7Dli60qSP6YT0rpuUEqys1lF+sIzti9GWHzSNSjMW4XFEmZcZanULbxGFt7wMfPfwf2VFz CostyUqdJZ1tPr06PPgZaOYFdD9LlzsbgxlZAYklkmTkBO76I2WRHQAABxZJREFU2fjTay6vb4ml pQ3gHQpU/qyxg4VdT902dNf2b488vm/r5HO5EfNAuktpUOt5k5e6ttDqYQXYo0b/7rvH79n2zaGH dv1s7Jnh3fkX69pkKdEsLbM1CSd3q+i6PNmv7/vVx3u/nxkyJyUVTWFWtBIt/ezVeNCvXNm8qWx+ BhpnpoczOlaR4yxu5IUCALG33b7q400nqX9ZUomcNuvMkLF/58/Htu644+h+8Ej2O/0dzevWviF9 frpTWS+pLFmhrh1TrWquSkExIKLMacyCyGVHjN7u301te+Z7Iy+QNSNAEtZeme46/R3NlzatUjeX vhcJEiWONdGr7fzF+w99y8gJDRlYJMpCWwnwPPg3CfZq8eEFfM1VNvDR151hyeUAfyZBXJigAEDs hh+t+lTDCvX60gcUpqy+3m3Tv37k8y//Abxzyys29JQ3N65ac1n6nPoOZU0szTuZhPJ8UL6rFzrl x83hyT69Z/9Dk9t33z2+32H+9DPxwnl/u3TzqtfXX5FskcvdqyZ6tT/d998Pfyc3auZhZm6gu4tz AWY25vNj8aHCXS0o3Utf94qJlwEgxiRQbeCVq7+x/C2ppfKG7Ig59Mz3Rh4b3JHLwMzWVUFSP9Z3 yMlT3tR02pK1sZOXrIudq6Z4S60p3ciL3NDO3POj+wq9hx6d7h7elT8K3kWAfSlOSTHpok+3vy7d Ka/IDJkDv/8/Lz+sTVk6VGYNudPE3L1lnWpblP7p8wq6G3ivvK4yxUsxjJkFKrH+cg4Xk1Gys0IQ ZmbUkofmUZHwcOqbG9eefXPrh2L1vL1WgFu60J/4xuDte+6d6AanI6fYIdKvc3NF4IVdOYvc3MsO /XIGSji7U5XANjxYehBbD1Xh+Bz3ZDZFdEiYIJiExBUEYYLJFQQAsMickWigQ0ije2RgSQoKYYE5 sqdwtOlk1WheHTu7VqAfeSb7zJO3Dj0NACaTkYg8M3U1l6RdSaEEOjIwuIQGCdC4jCYAGGRVCGqa j/Dm5U0LCuEKHXN1uHhJ35GK5wmTSJhgMQlkSy/nd7OA+9xThiABzNRIYjLKwiBzdG9h/6pLKM9l jNfifj/8xPRLJUq0a+JoPgdQB++OSvaCASxBgBxYKdzLsTavjCF3n3avEOxZJT/UupqDu9SG3yjH pAkTSoC7w3uDPtudVycJgwwAkPuezhw87YamF+uWKVuCKmFEGYVJc2x4V34I/HPx3eCbAaAUpXfL c11eBR+cxZb8PndWxRylGgEdFCItAky2pQ4M7tDeKP8LwRW4wRWkiR59LDdq7qlbpmyZ68Kmjhh9 E336pI+A5ZxOSjc9KD2I45AP8GGNAmad4iTVkMKD2HzQyfbLMI1iQi5NGQAsKc7A0i0+NWC81HoK RU2u8B0jL+UPGFmRd0nQmocapXuA7iVRBwHvFZXrFbE7a5v7fLB3v85DCDMjUJ39VSyYWWgPQtQ1 N3s3AUCydBIAIA0+n9u94vzUYSXBV9mRtLzadRARje4r9AOAhgg6UYWRpOAQuPy6H3uZRjHIUeWh 5/s135tTTdr5tGUHFd7zayJrBEnq4NFe2znNvCgwCfXd94z3GFmxfy5qaWbQODiwI9cPAAWiGZK5 5iupB3/3sN+bAWpZTQCfD9Ap4im2wL+pXZR8cr/XdSXFTADQBnbk7rYMGp9FHDoCAPQ9lfnDZK9+ lCtoeJhCvYD2y2k3IqwhKDkyikOFql7gPI1IuWAwu6I5XpUx3LVdYpd+vvPCtjMT72YcG8gik4gY CWBEgCSAARC6GhEhEVj927PbHv/ywOO2HcCwbeJ+wAexdjEHzggQrZ1XTcqPzCfwEAHsMPMr+tzr ZeC5goqlU7mAj5xgcWGSSgQyAKhAoACQu7oDMAmZWaCyidMBuO7h+dJCrGRhKhVGAFGEgFvzxj3z 4oaEmZUo3UBG7WfiGwFq6ZUvGTkBNiAqHKsRIzsOSrEFmUnOXiwWiRkyhBc7d2ahVBPcENaBMQzY WQeiLESpTQqhXpyF+uH0xaMPK0QPlchyAO42CLl1Zi9BUw+wg3slG8ylE0bNwV5I0MP01CidDiiE JYqAq8MNeglMZxUq5997tdY0Xc4Qw4edz6XDFNXobxYN6F6sHWexMAox7TqT+d3U75SOuZu1w8zi x35lS4Kk7Tl3PJ5PsI8X6H6WJKzRZgR1R+IuK6BXvdWgsqhezXNFlYBTRI42r2OxlM+udrEYIu36 VZoSHmZft73CyxYuqtSj51UQe7WAPlfhkHzYvJtduz15fhE65AM+uQS2MApflKHer1TQo2gF7los 7h4wfn1SgsqCUhW28EUb2/9qSDUKq4HjN1mIQchv+hX2OQH6cV4Duu5qvw5ILIKwST6co6am0ROg 1xb4IHMvRgDd79qIIqGfAP04rSUK0GH2/qhC2isiR++/ADWQVWmmQ17aAAAAAElFTkSuQmCC --Apple-Mail=_9E2A2D25-B7B6-4F12-87A1-267322923EF2-- --Apple-Mail=_C72B190B-1CAE-4F3F-97DA-B01BB0DB3F52--