Syscall: Fix Syscall::Call's X86-64 implementation for CFI unwinding
commit77a224a0aacac5bff5af234b5a583f499ebb146f
authormdempsky <mdempsky@chromium.org>
Mon, 20 Oct 2014 23:19:23 +0000 (20 16:19 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 20 Oct 2014 23:19:42 +0000 (20 23:19 +0000)
tree60b564f00053141ec8dd651adb8fcd350f0a3c3c
parentdddb7ae7a29cc6e9b14e155b50deebf2bc9e13f2
Syscall: Fix Syscall::Call's X86-64 implementation for CFI unwinding

The LEA instruction within the inline assembly statement was throwing
off glibc's backtrace() function, because it lost track of where the
stack was.  The easy fix for this is to convert SyscallAsm() to simply
use the standard C calling convention on X86-64, and make it into a
normal C function call so the compiler can ensure CFI information is
correct for us.

While here, there's no need to use the "call/pop/addq" trick to
compute a PC-relative address because we have %rip-based addressing.
So simply use "lea 2f(%rip), %rax" to compute the return address (and
avoid branch mispredictions from desync'ing the call stack).

BUG=424973

Review URL: https://codereview.chromium.org/661393004

Cr-Commit-Position: refs/heads/master@{#300374}
sandbox/linux/seccomp-bpf-helpers/baseline_policy_unittest.cc
sandbox/linux/seccomp-bpf/syscall.cc