linux/tools/objtool
Josh Poimboeuf bf4d1a8375 objtool: Track DRAP separately from callee-saved registers
When GCC realigns a function's stack, it sometimes uses %r13 as the DRAP
register, like:

  push	%r13
  lea	0x10(%rsp), %r13
  and	$0xfffffffffffffff0, %rsp
  pushq	-0x8(%r13)
  push	%rbp
  mov	%rsp, %rbp
  push	%r13
  ...
  mov	-0x8(%rbp),%r13
  leaveq
  lea	-0x10(%r13), %rsp
  pop	%r13
  retq

Since %r13 was pushed onto the stack twice, its two stack locations need
to be stored separately.  The first push of %r13 is its original value,
and the second push of %r13 is the caller's stack frame address.

Since %r13 is a callee-saved register, we need to track the stack
location of its original value separately from the DRAP register.

This fixes the following false positive warning:

  lib/ubsan.o: warning: objtool: val_to_string.constprop.7()+0x97: leave instruction with modified stack frame

Reported-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Fixes: baa41469a7 ("objtool: Implement stack validation 2.0")
Link: http://lkml.kernel.org/r/3da23a6d4c5b3c1e21fc2ccc21a73941b97ff20a.1502401017.git.jpoimboe@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2017-08-11 14:06:15 +02:00
..
Documentation objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
arch/x86 objtool: Fix '-mtune=atom' decoding support in objtool 2.0 2017-07-28 08:33:32 +02:00
.gitignore objtool: Add 'fixdep' to objtool/.gitignore 2016-07-27 11:07:11 +02:00
Build objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
Makefile objtool: Disable GCC '-Wpacked' warnings 2017-07-28 08:33:32 +02:00
arch.h objtool: Assume unannotated UD2 instructions are dead ends 2017-07-28 08:33:32 +02:00
builtin-check.c objtool: Fix gcov check for older versions of GCC 2017-07-25 11:12:45 +02:00
builtin-orc.c objtool: Fix gcov check for older versions of GCC 2017-07-25 11:12:45 +02:00
builtin.h objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
cfi.h objtool: Implement stack validation 2.0 2017-06-30 10:19:19 +02:00
check.c objtool: Track DRAP separately from callee-saved registers 2017-08-11 14:06:15 +02:00
check.h objtool: Track DRAP separately from callee-saved registers 2017-08-11 14:06:15 +02:00
elf.c objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
elf.h objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
objtool.c objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
orc.h objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
orc_dump.c objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
orc_gen.c objtool: Add ORC unwind table generation 2017-07-18 10:57:43 +02:00
orc_types.h objtool, x86: Add facility for asm code to provide unwind hints 2017-07-18 10:57:44 +02:00
special.c objtool: Implement stack validation 2.0 2017-06-30 10:19:19 +02:00
special.h objtool: Add tool to perform compile-time stack metadata validation 2016-02-29 08:35:12 +01:00
warn.h objtool: Implement stack validation 2.0 2017-06-30 10:19:19 +02:00