When I use CpuDeadLoop for debugging on Aarch64 I have symbols loaded so I can just do ‘set Index=1’ and resume, but it sounds like the issue is that people want to sometimes debug without symbols/source, and the generated assembly is making that difficult.
Rebecca On Thu, May 18, 2023, at 9:36 AM, Michael D Kinney 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> > *Sent:* Thursday, May 18, 2023 3:00 AM > *To:* devel@edk2.groups.io > *Cc:* Kinney, Michael D <michael.d.kin...@intel.com>; Rebecca Cran > <rebe...@bsdio.com>; Ni, Ray <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: > 1. Manually adjust rsp by increasing 40 > 2. 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 (#105045): https://edk2.groups.io/g/devel/message/105045 Mute This Topic: https://groups.io/mt/98987896/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-