mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	ftrace: Add arm64 support to recordmcount
Recordmcount utility under scripts is run, after compiling each object, to find out all the locations of calling _mcount() and put them into specific seciton named __mcount_loc. Then linker collects all such information into a table in the kernel image (between __start_mcount_loc and __stop_mcount_loc) for later use by ftrace. This patch adds arm64 specific definitions to identify such locations. There are two types of implementation, C and Perl. On arm64, only C version is used to build the kernel now that CONFIG_HAVE_C_RECORDMCOUNT is on. But Perl version is also maintained. This patch also contains a workaround just in case where a header file, elf.h, on host machine doesn't have definitions of EM_AARCH64 nor R_AARCH64_ABS64. Without them, compiling C version of recordmcount will fail. Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
		
							parent
							
								
									26e2ae3999
								
							
						
					
					
						commit
						af64d2aa87
					
				
					 3 changed files with 14 additions and 0 deletions
				
			
		|  | @ -30,12 +30,14 @@ config ARM64 | ||||||
| 	select HAVE_ARCH_JUMP_LABEL | 	select HAVE_ARCH_JUMP_LABEL | ||||||
| 	select HAVE_ARCH_KGDB | 	select HAVE_ARCH_KGDB | ||||||
| 	select HAVE_ARCH_TRACEHOOK | 	select HAVE_ARCH_TRACEHOOK | ||||||
|  | 	select HAVE_C_RECORDMCOUNT | ||||||
| 	select HAVE_DEBUG_BUGVERBOSE | 	select HAVE_DEBUG_BUGVERBOSE | ||||||
| 	select HAVE_DEBUG_KMEMLEAK | 	select HAVE_DEBUG_KMEMLEAK | ||||||
| 	select HAVE_DMA_API_DEBUG | 	select HAVE_DMA_API_DEBUG | ||||||
| 	select HAVE_DMA_ATTRS | 	select HAVE_DMA_ATTRS | ||||||
| 	select HAVE_DMA_CONTIGUOUS | 	select HAVE_DMA_CONTIGUOUS | ||||||
| 	select HAVE_EFFICIENT_UNALIGNED_ACCESS | 	select HAVE_EFFICIENT_UNALIGNED_ACCESS | ||||||
|  | 	select HAVE_FTRACE_MCOUNT_RECORD | ||||||
| 	select HAVE_GENERIC_DMA_COHERENT | 	select HAVE_GENERIC_DMA_COHERENT | ||||||
| 	select HAVE_HW_BREAKPOINT if PERF_EVENTS | 	select HAVE_HW_BREAKPOINT if PERF_EVENTS | ||||||
| 	select HAVE_MEMBLOCK | 	select HAVE_MEMBLOCK | ||||||
|  |  | ||||||
|  | @ -40,6 +40,11 @@ | ||||||
| #define R_METAG_NONE                     3 | #define R_METAG_NONE                     3 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifndef EM_AARCH64 | ||||||
|  | #define EM_AARCH64	183 | ||||||
|  | #define R_AARCH64_ABS64	257 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static int fd_map;	/* File descriptor for file being modified. */ | static int fd_map;	/* File descriptor for file being modified. */ | ||||||
| static int mmap_failed; /* Boolean flag. */ | static int mmap_failed; /* Boolean flag. */ | ||||||
| static void *ehdr_curr; /* current ElfXX_Ehdr *  for resource cleanup */ | static void *ehdr_curr; /* current ElfXX_Ehdr *  for resource cleanup */ | ||||||
|  | @ -347,6 +352,8 @@ do_file(char const *const fname) | ||||||
| 	case EM_ARM:	 reltype = R_ARM_ABS32; | 	case EM_ARM:	 reltype = R_ARM_ABS32; | ||||||
| 			 altmcount = "__gnu_mcount_nc"; | 			 altmcount = "__gnu_mcount_nc"; | ||||||
| 			 break; | 			 break; | ||||||
|  | 	case EM_AARCH64: | ||||||
|  | 			 reltype = R_AARCH64_ABS64; gpfx = '_'; break; | ||||||
| 	case EM_IA_64:	 reltype = R_IA64_IMM64;   gpfx = '_'; break; | 	case EM_IA_64:	 reltype = R_IA64_IMM64;   gpfx = '_'; break; | ||||||
| 	case EM_METAG:	 reltype = R_METAG_ADDR32; | 	case EM_METAG:	 reltype = R_METAG_ADDR32; | ||||||
| 			 altmcount = "_mcount_wrapper"; | 			 altmcount = "_mcount_wrapper"; | ||||||
|  |  | ||||||
|  | @ -279,6 +279,11 @@ if ($arch eq "x86_64") { | ||||||
|     $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_ARM_(CALL|PC24|THM_CALL)" . |     $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_ARM_(CALL|PC24|THM_CALL)" . | ||||||
| 			"\\s+(__gnu_mcount_nc|mcount)\$"; | 			"\\s+(__gnu_mcount_nc|mcount)\$"; | ||||||
| 
 | 
 | ||||||
|  | } elsif ($arch eq "arm64") { | ||||||
|  |     $alignment = 3; | ||||||
|  |     $section_type = '%progbits'; | ||||||
|  |     $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_AARCH64_CALL26\\s+_mcount\$"; | ||||||
|  |     $type = ".quad"; | ||||||
| } elsif ($arch eq "ia64") { | } elsif ($arch eq "ia64") { | ||||||
|     $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; |     $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; | ||||||
|     $type = "data8"; |     $type = "data8"; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 AKASHI Takahiro
						AKASHI Takahiro