[libcxx-commits] [PATCH] D102912: [libunwind] AARCH64 use inline assembly for pointer authentication

Maksim Kita via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Fri May 21 14:30:56 PDT 2021


kitaisreal updated this revision to Diff 347127.
kitaisreal added a comment.

Fixed code review issues.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D102912/new/

https://reviews.llvm.org/D102912

Files:
  libunwind/src/DwarfInstructions.hpp


Index: libunwind/src/DwarfInstructions.hpp
===================================================================
--- libunwind/src/DwarfInstructions.hpp
+++ libunwind/src/DwarfInstructions.hpp
@@ -67,7 +67,7 @@
       return (pint_t)((sint_t)registers.getRegister((int)prolog.cfaRegister) +
              prolog.cfaRegisterOffset);
     if (prolog.cfaExpression != 0)
-      return evaluateExpression((pint_t)prolog.cfaExpression, addressSpace, 
+      return evaluateExpression((pint_t)prolog.cfaExpression, addressSpace,
                                 registers, 0);
     assert(0 && "getCFA(): unknown location");
     __builtin_unreachable();
@@ -218,17 +218,29 @@
 #if !defined(_LIBUNWIND_IS_NATIVE_ONLY)
         return UNW_ECROSSRASIGNING;
 #else
-        register unsigned long long x17 __asm("x17") = returnAddress;
-        register unsigned long long x16 __asm("x16") = cfa;
-
         // These are the autia1716/autib1716 instructions. The hint instructions
         // are used here as gcc does not assemble autia1716/autib1716 for pre
         // armv8.3a targets.
-        if (cieInfo.addressesSignedWithBKey)
-          asm("hint 0xe" : "+r"(x17) : "r"(x16)); // autib1716
-        else
-          asm("hint 0xc" : "+r"(x17) : "r"(x16)); // autia1716
-        returnAddress = x17;
+
+        if (use_key_b) {
+          static const uint16_t autib1716 = 0xe;
+          asm volatile("mov x17, %x0;\n\t"
+                       "mov x16, %x1;\n\t"
+                       "hint %[key];\n\t"
+                       "mov %0, x17\n\t"
+                       : "+r"(pointer)
+                       : "r"(modifier), [key] "i"(autib1716)
+                       : "x16", "x17");
+        } else {
+          static const uint16_t autia1716 = 0xc;
+          asm volatile("mov x17, %x0;\n\t"
+                       "mov x16, %x1;\n\t"
+                       "hint %[key];\n\t"
+                       "mov %0, x17\n\t"
+                       : "+r"(pointer)
+                       : "r"(modifier), [key] "i"(autia1716)
+                       : "x16", "x17");
+        }
 #endif
       }
 #endif


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D102912.347127.patch
Type: text/x-patch
Size: 2111 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20210521/b260b8e1/attachment.bin>


More information about the libcxx-commits mailing list