]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - scripts/recordmcount.c
Merge remote-tracking branch 'coresight/next'
[karo-tx-linux.git] / scripts / recordmcount.c
index 8cc020bbe85941b6a3a3f628712f736440af998a..698768bdc5815021b61814ddabc408d4310c3c0e 100644 (file)
@@ -42,6 +42,7 @@
 
 #ifndef EM_AARCH64
 #define EM_AARCH64     183
+#define R_AARCH64_NONE         0
 #define R_AARCH64_ABS64        257
 #endif
 
@@ -160,6 +161,22 @@ static int make_nop_x86(void *map, size_t const offset)
        return 0;
 }
 
+static unsigned char ideal_nop4_arm64[4] = {0x1f, 0x20, 0x03, 0xd5};
+static int make_nop_arm64(void *map, size_t const offset)
+{
+       uint32_t *ptr;
+
+       ptr = map + offset;
+       /* bl <_mcount> is 0x94000000 before relocation */
+       if (*ptr != 0x94000000)
+               return -1;
+
+       /* Convert to nop */
+       ulseek(fd_map, offset, SEEK_SET);
+       uwrite(fd_map, ideal_nop, 4);
+       return 0;
+}
+
 /*
  * Get the whole file as a programming convenience in order to avoid
  * malloc+lseek+read+free of many pieces.  If successful, then mmap
@@ -354,7 +371,12 @@ do_file(char const *const fname)
                         altmcount = "__gnu_mcount_nc";
                         break;
        case EM_AARCH64:
-                        reltype = R_AARCH64_ABS64; gpfx = '_'; break;
+                       reltype = R_AARCH64_ABS64;
+                       make_nop = make_nop_arm64;
+                       rel_type_nop = R_AARCH64_NONE;
+                       ideal_nop = ideal_nop4_arm64;
+                       gpfx = '_';
+                       break;
        case EM_IA_64:   reltype = R_IA64_IMM64;   gpfx = '_'; break;
        case EM_METAG:   reltype = R_METAG_ADDR32;
                         altmcount = "_mcount_wrapper";