[compiler-rt] r355738 - [HWASan] Save + print registers when tag mismatch occurs in AArch64.

Mitch Phillips via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 11 09:31:14 PDT 2019


Hi Adhemerval,

I'm taking a look, will resolve this ASAP.

- Mitch

On Mon, Mar 11, 2019 at 6:44 AM Adhemerval Zanella <
adhemerval.zanella at linaro.org> wrote:

>
>
> On 08/03/2019 18:22, Mitch Phillips via llvm-commits wrote:
> > Author: hctim
> > Date: Fri Mar  8 13:22:35 2019
> > New Revision: 355738
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=355738&view=rev
> > Log:
> > [HWASan] Save + print registers when tag mismatch occurs in AArch64.
> >
>
> [...]
>
> > Added: compiler-rt/trunk/lib/hwasan/hwasan_tag_mismatch_aarch64.S
> > URL:
> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_tag_mismatch_aarch64.S?rev=355738&view=auto
> >
> ==============================================================================
> > --- compiler-rt/trunk/lib/hwasan/hwasan_tag_mismatch_aarch64.S (added)
> > +++ compiler-rt/trunk/lib/hwasan/hwasan_tag_mismatch_aarch64.S Fri Mar
> 8 13:22:35 2019
> > @@ -0,0 +1,108 @@
> > +#include "sanitizer_common/sanitizer_asm.h"
> > +
> > +// The content of this file is AArch64-only:
> > +#if defined(__aarch64__)
> > +
> > +// The responsibility of the HWASan entry point in compiler-rt is to
> primarily
> > +// readjust the stack from the callee and save the current register
> values to
> > +// the stack.
> > +// This entry point function should be called from a __hwasan_check_*
> symbol.
> > +// These are generated during a lowering pass in the backend, and are
> found in
> > +// AArch64AsmPrinter::EmitHwasanMemaccessSymbols(). Please look there
> for
> > +// further information.
> > +// The __hwasan_check_* caller of this function should have expanded
> the stack
> > +// and saved the previous values of x0, x1, x29, and x30. This function
> will
> > +// "consume" these saved values and treats it as part of its own stack
> frame.
> > +// In this sense, the __hwasan_check_* callee and this function "share"
> a stack
> > +// frame. This allows us to omit having unwinding information (.cfi_*)
> present
> > +// in every __hwasan_check_* function, therefore reducing binary size.
> This is
> > +// particularly important as hwasan_check_* instances are duplicated in
> every
> > +// translation unit where HWASan is enabled.
> > +// This function calls HwasanTagMismatch to step back into the C++ code
> that
> > +// completes the stack unwinding and error printing. This function is
> is not
> > +// permitted to return.
> > +
> > +
> > +// Frame from __hwasan_check_:
> > +// |              ...                |
> > +// |              ...                |
> > +// | Previous stack frames...        |
> > +// +=================================+
> > +// | Unused 8-bytes for maintaining  |
> > +// | 16-byte SP alignment.           |
> > +// +---------------------------------+
> > +// | Return address (x30) for caller |
> > +// | of __hwasan_check_*.            |
> > +// +---------------------------------+
> > +// | Frame address (x29) for caller  |
> > +// | of __hwasan_check_*             |
> > +// +---------------------------------+ <-- [SP + 232]
> > +// |              ...                |
> > +// |                                 |
> > +// | Stack frame space for x2 - x28. |
> > +// |                                 |
> > +// |              ...                |
> > +// +---------------------------------+ <-- [SP + 16]
> > +// |                                 |
> > +// | Saved x1, as __hwasan_check_*   |
> > +// | clobbers it.                    |
> > +// +---------------------------------+
> > +// | Saved x0, likewise above.       |
> > +// +---------------------------------+ <-- [x30 / SP]
> > +
> > +// This function takes two arguments:
> > +//   * x0: The address of read/write instruction that caused HWASan
> check fail.
> > +//   * x1: The tag size.
> > +
> > +.section .text
> > +.file "hwasan_tag_mismatch_aarch64.S"
> > +.global __hwasan_tag_mismatch
> > +.type __hwasan_tag_mismatch, %function
> > +__hwasan_tag_mismatch:
> > +  CFI_STARTPROC
> > +
> > +  // Set the CFA to be the return address for caller of
> __hwasan_check_*. Note
> > +  // that we do not emit CFI predicates to describe the contents of
> this stack
> > +  // frame, as this proxy entry point should never be debugged. The
> contents
> > +  // are static and are handled by the unwinder after calling
> > +  // __hwasan_tag_mismatch. The frame pointer is already correctly setup
> > +  // by __hwasan_check_*.
> > +  add x29, sp, #232
> > +  CFI_DEF_CFA(w29, 16)
> > +  CFI_OFFSET(w30, -8)
> > +  CFI_OFFSET(w29, -16)
> > +
> > +  // Save the rest of the registers into the preallocated space left by
> > +  // __hwasan_check.
> > +  str     x28,      [sp, #224]
> > +  stp     x26, x27, [sp, #208]
> > +  stp     x24, x25, [sp, #192]
> > +  stp     x22, x23, [sp, #176]
> > +  stp     x20, x21, [sp, #160]
> > +  stp     x18, x19, [sp, #144]
> > +  stp     x16, x17, [sp, #128]
> > +  stp     x14, x15, [sp, #112]
> > +  stp     x12, x13, [sp, #96]
> > +  stp     x10, x11, [sp, #80]
> > +  stp     x8,  x9,  [sp, #64]
> > +  stp     x6,  x7,  [sp, #48]
> > +  stp     x4,  x5,  [sp, #32]
> > +  stp     x2,  x3,  [sp, #16]
> > +
> > +  // Pass the address of the frame to __hwasan_tag_mismatch_stub, so
> that it can
> > +  // extract the saved registers from this frame without having to
> worry about
> > +  // finding this frame.
> > +  mov x2, sp
> > +
> > +  bl __hwasan_tag_mismatch_stub
> > +  CFI_ENDPROC
> > +
> > +.Lfunc_end0:
> > +  .size __hwasan_tag_mismatch, .Lfunc_end0-__hwasan_tag_mismatch
> > +
> > +.addrsig
>
> This is causing a regression on llvm aarch bots [1] on the case of using
> system
> compiler (in this case gcc/binutils) to build compiler-rt.
>
> My understanding it should be ok to just remove the the assembly directive.
>
>
> [1] http://lab.llvm.org:8011/builders/clang-cmake-aarch64-lld/builds/6162
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190311/f40a2f2a/attachment-0001.html>


More information about the llvm-commits mailing list