Source
static unsigned char push_bl_mcount_thumb_le[6] = { 0x00, 0xb5, 0xff, 0xf7, 0xfe, 0xff }; /* push {lr}, bl */
/*
* recordmcount.c: construct a table of the locations of calls to 'mcount'
* so that ftrace can find them quickly.
* Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved.
* Licensed under the GNU General Public License, version 2 (GPLv2).
*
* Restructured to fit Linux format, as well as other updates:
* Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
*/
/*
* Strategy: alter the .o file in-place.
*
* Append a new STRTAB that has the new section names, followed by a new array
* ElfXX_Shdr[] that has the new section headers, followed by the section
* contents for __mcount_loc and its relocations. The old shstrtab strings,
* and the old ElfXX_Shdr[] array, remain as "garbage" (commonly, a couple
* kilobytes.) Subsequent processing by /bin/ld (or the kernel module loader)
* will ignore the garbage regions, because they are not designated by the
* new .e_shoff nor the new ElfXX_Shdr[]. [In order to remove the garbage,
* then use "ld -r" to create a new file that omits the garbage.]
*/
static int fd_map; /* File descriptor for file being modified. */
static int mmap_failed; /* Boolean flag. */
static char gpfx; /* prefix for global symbol name (sometimes '_') */
static struct stat sb; /* Remember .st_size, etc. */
static jmp_buf jmpenv; /* setjmp/longjmp per-file error escape */
static const char *altmcount; /* alternate mcount symbol name */
static int warn_on_notrace_sect; /* warn when section has mcount not being recorded */
static void *file_map; /* pointer of the mapped file */
static void *file_end; /* pointer to the end of the mapped file */
static int file_updated; /* flag to state file was changed */
static void *file_ptr; /* current file pointer location */
static void *file_append; /* added to the end of the file */
static size_t file_append_size; /* how much is added to end of file */
/* setjmp() return values */
enum {
SJ_SETJMP = 0, /* hardwired first return */
SJ_FAIL,
SJ_SUCCEED
};
/* Per-file resource cleanup when multiple files. */