lkml.org 
[lkml]   [2014]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V4 16/16] perf, x86: Discard zero length call entries in LBR call stack
    Date
    "Zero length call" uses the attribute of the call instruction to push
    the immediate instruction pointer on to the stack and then pops off
    that address into a register. This is accomplished without any matching
    return instruction. It confuses the hardware and make the recorded call
    stack incorrect.

    We can partially resolve this issue by: decode call instructions and
    discard any zero length call entry in the LBR stack.

    Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
    ---
    arch/x86/kernel/cpu/perf_event_intel_lbr.c | 13 +++++++++++--
    1 file changed, 11 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/kernel/cpu/perf_event_intel_lbr.c b/arch/x86/kernel/cpu/perf_event_intel_lbr.c
    index dd14f67..20ba2ef 100644
    --- a/arch/x86/kernel/cpu/perf_event_intel_lbr.c
    +++ b/arch/x86/kernel/cpu/perf_event_intel_lbr.c
    @@ -94,7 +94,8 @@ enum {
    X86_BR_ABORT = 1 << 12,/* transaction abort */
    X86_BR_IN_TX = 1 << 13,/* in transaction */
    X86_BR_NO_TX = 1 << 14,/* not in transaction */
    - X86_BR_CALL_STACK = 1 << 15,/* call stack */
    + X86_BR_ZERO_CALL = 1 << 15,/* zero length call */
    + X86_BR_CALL_STACK = 1 << 16,/* call stack */
    };

    #define X86_BR_PLM (X86_BR_USER | X86_BR_KERNEL)
    @@ -111,13 +112,15 @@ enum {
    X86_BR_JMP |\
    X86_BR_IRQ |\
    X86_BR_ABORT |\
    - X86_BR_IND_CALL)
    + X86_BR_IND_CALL |\
    + X86_BR_ZERO_CALL)

    #define X86_BR_ALL (X86_BR_PLM | X86_BR_ANY)

    #define X86_BR_ANY_CALL \
    (X86_BR_CALL |\
    X86_BR_IND_CALL |\
    + X86_BR_ZERO_CALL |\
    X86_BR_SYSCALL |\
    X86_BR_IRQ |\
    X86_BR_INT)
    @@ -662,6 +665,12 @@ static int branch_type(unsigned long from, unsigned long to, int abort)
    ret = X86_BR_INT;
    break;
    case 0xe8: /* call near rel */
    + insn_get_immediate(&insn);
    + if (insn.immediate1.value == 0) {
    + /* zero length call */
    + ret = X86_BR_ZERO_CALL;
    + break;
    + }
    case 0x9a: /* call far absolute */
    ret = X86_BR_CALL;
    break;
    --
    1.9.0


    \
     
     \ /
      Last update: 2014-06-30 12:21    [W:2.918 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site