Andrew:
  I agree this is a generic feature. Your change is OK. If we add it, I think 
we should apply them for all similar functions, and apply them in MSFT and GCC 
assembly code both.

  So far, I find the following APIs have the similar usage.
SwitchStack()
AsmEnablePaging32()
AsmEnablePaging64()
AsmDisablePaging32()
AsmDisablePaging64()

Thanks
Liming
From: Andrew Fish [mailto:[email protected]]
Sent: Friday, June 20, 2014 11:57 PM
To: [email protected]
Subject: Re: [edk2] MdePkg maintainer: We need InternalX86EnablePaging64() to 
work like SwitchStack CpuExceptionHandlerLib


On Jun 20, 2014, at 3:15 AM, Gao, Liming 
<[email protected]<mailto:[email protected]>> wrote:


Andrew:
  Seemly, this is a debug feature. Which debugger supports it? Or, this is a 
generic function (stop walking the frame) in debugger?


Xcode clang/lldb use this. This is what the C runtime does on OS X.
The compiler maintains a frame pointer so you can unwind the stack without 
symbols.
                pushq      %rbp
                movq       %rsp, %rbp
        ...
                popq        %rbp
                ret

If you know the PC and frame pointer (RBP) you can walk the stack, as the stack 
has the PC and FP of the caller. Hitting a return address of zero is used by 
the algorithm to terminate the stack walk. If you don't hit the zero the stack 
walk sees the return address from the call and keeps going. In any frame 
pointer scheme you need a way to stop, and this is usually hitting a PC of 
zero. So I think this is a generic feature.

This means that a stack walk is possible without the debug information. For 
example it is possible for a CpuExceptionHandlerLib to print the complete stack 
frame on an exception, and lookup the module name, and offset in the module of 
the PC for the entire frame.  This means you get a full stack trace printed out 
for every ASSERT()! We have an lldb script that walks the frame and loads 
symbols for only the modules in the frame. It is also a useful feature for 
profiling, and leak detection.

You can only walk the stack in Visual Studio if you have symbols. I'm guessing 
that the stack unwind just stops when you hit an address that does not have 
symbols.

I assume there is a flag in GCC to emit a frame pointer for X64, so this would 
be useful in that case too.

Thanks,

Andrew Fish

~/work/Compiler>cat a.c
int
main ()
{
  return 0;
}
~/work/Compiler>clang -S -Os a.c
~/work/Compiler>cat a.S
                .section    __TEXT,__text,regular,pure_instructions
                .globl       _main
_main:                                  ## @main
                .cfi_startproc
## BB#0:
                pushq      %rbp
Ltmp2:
                .cfi_def_cfa_offset 16
Ltmp3:
                .cfi_offset %rbp, -16
                movq       %rsp, %rbp
Ltmp4:
                .cfi_def_cfa_register %rbp
                xorl          %eax, %eax
                popq        %rbp
                ret



Thanks
Liming
From: Andrew Fish [mailto:[email protected]]
Sent: Wednesday, June 18, 2014 10:55 PM
To: [email protected]<mailto:[email protected]>
Subject: [edk2] MdePkg maintainer: We need InternalX86EnablePaging64() to work 
like SwitchStack

InternalX86EnablePaging64() does a call to the new 64-bit entry point. This 
call breaks our debugger stack walking code. We need it to be a push $0/jmp. In 
place of a call. The push $0/jmp makes the return address from the call be 0, 
and this tells the debugger to stop walking the frame. In clang and some 
flavors of GCC all C functions spill enough state to the stack so that you can 
walk the stack via an algorithm (on VC++ for X64 you need symbols).

If this change is OK with folks I can submit a patch.

https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdePkg/Library/BaseLib/X64/SwitchStack.S

    #

    # Reserve space for register parameters (rcx, rdx, r8 & r9) on the stack,

    # in case the callee wishes to spill them.

    #

    lea     -0x20(%r9), %rsp

    pushq   $0        // stop gdb stack unwind

    jmp     *%rax     // call EntryPoint ()

https://svn.code.sf.net/p/edk2/code/trunk/edk2/MdePkg/Library/BaseLib/Ia32/EnablePaging64.S

    .byte   0x48

    addl    $0x-0x20, %esp              # add rsp, -20h

    call    *%ebx                       # call rbx

    jmp     .                           # no one should get here
So what we would like to see is:

    .byte   0x48

    addl    $0x-0x20, %esp              # add rsp, -20h

    push    $0        // stop gdb stack unwind

    jmp     *%ebx     // call EntryPoint ()





Thanks,

Andrew Fish
------------------------------------------------------------------------------
HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
Find What Matters Most in Your Big Data with HPCC Systems
Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
Leverages Graph Analysis for Fast Processing & Easy Data Exploration
http://p.sf.net/sfu/hpccsystems_______________________________________________
edk2-devel mailing list
[email protected]<mailto:[email protected]>
https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to