Yea, but I think you want static and volatile on the global. But good idea as for the non XIP case you can just modify the global. It might be a good idea to document the debugging flow in the header for CpuDeadLoop()...
Thanks, Andrew Fish > On May 18, 2023, at 10:19 AM, Kinney, Michael D <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> > Sent: Thursday, May 18, 2023 10:09 AM > To: Kinney, Michael D <michael.d.kin...@intel.com> > Cc: edk2-devel-groups-io <devel@edk2.groups.io>; Ni, Ray <ray...@intel.com>; > Rebecca Cran <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 (#105043): https://edk2.groups.io/g/devel/message/105043 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] -=-=-=-=-=-=-=-=-=-=-=-