forked from mirrors/linux
		
	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_KGDB | ||||
| 	select HAVE_ARCH_TRACEHOOK | ||||
| 	select HAVE_C_RECORDMCOUNT | ||||
| 	select HAVE_DEBUG_BUGVERBOSE | ||||
| 	select HAVE_DEBUG_KMEMLEAK | ||||
| 	select HAVE_DMA_API_DEBUG | ||||
| 	select HAVE_DMA_ATTRS | ||||
| 	select HAVE_DMA_CONTIGUOUS | ||||
| 	select HAVE_EFFICIENT_UNALIGNED_ACCESS | ||||
| 	select HAVE_FTRACE_MCOUNT_RECORD | ||||
| 	select HAVE_GENERIC_DMA_COHERENT | ||||
| 	select HAVE_HW_BREAKPOINT if PERF_EVENTS | ||||
| 	select HAVE_MEMBLOCK | ||||
|  |  | |||
|  | @ -40,6 +40,11 @@ | |||
| #define R_METAG_NONE                     3 | ||||
| #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 mmap_failed; /* Boolean flag. */ | ||||
| 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; | ||||
| 			 altmcount = "__gnu_mcount_nc"; | ||||
| 			 break; | ||||
| 	case EM_AARCH64: | ||||
| 			 reltype = R_AARCH64_ABS64; gpfx = '_'; break; | ||||
| 	case EM_IA_64:	 reltype = R_IA64_IMM64;   gpfx = '_'; break; | ||||
| 	case EM_METAG:	 reltype = R_METAG_ADDR32; | ||||
| 			 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)" . | ||||
| 			"\\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") { | ||||
|     $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; | ||||
|     $type = "data8"; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 AKASHI Takahiro
						AKASHI Takahiro