Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 121179
b: refs/heads/master
c: 8fd6e5a
h: refs/heads/master
i:
  121177: 7fc5fea
  121175: c87ab2e
v: v3
  • Loading branch information
Steven Rostedt committed Nov 20, 2008
1 parent 730c59f commit 59ba939
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6d07bb47354174a9b52d3b03f9e38b069a93d341
refs/heads/master: 8fd6e5a8c81e2e9b912ea33c8425a10729db469b
14 changes: 13 additions & 1 deletion trunk/arch/powerpc/include/asm/ftrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,19 @@

#ifndef __ASSEMBLY__
extern void _mcount(void);
#endif

#ifdef CONFIG_DYNAMIC_FTRACE
static inline unsigned long ftrace_call_adjust(unsigned long addr)
{
/* reloction of mcount call site is the same as the address */
return addr;
}

struct dyn_arch_ftrace {
/* nothing yet */
};
#endif /* CONFIG_DYNAMIC_FTRACE */
#endif /* __ASSEMBLY__ */

#endif

Expand Down
67 changes: 62 additions & 5 deletions trunk/arch/powerpc/kernel/ftrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ static unsigned int ftrace_calc_offset(long ip, long addr)
return (int)(addr - ip);
}

unsigned char *ftrace_nop_replace(void)
static unsigned char *ftrace_nop_replace(void)
{
return (char *)&ftrace_nop;
}

unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
static unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
{
static unsigned int op;

Expand Down Expand Up @@ -68,7 +68,7 @@ unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
# define _ASM_PTR " .long "
#endif

int
static int
ftrace_modify_code(unsigned long ip, unsigned char *old_code,
unsigned char *new_code)
{
Expand Down Expand Up @@ -113,6 +113,62 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code,
return faulted;
}

static int test_24bit_addr(unsigned long ip, unsigned long addr)
{
long diff;

/*
* Can we get to addr from ip in 24 bits?
* (26 really, since we mulitply by 4 for 4 byte alignment)
*/
diff = addr - ip;

/*
* Return true if diff is less than 1 << 25
* and greater than -1 << 26.
*/
return (diff < (1 << 25)) && (diff > (-1 << 26));
}

int ftrace_make_nop(struct module *mod,
struct dyn_ftrace *rec, unsigned long addr)
{
unsigned char *old, *new;

/*
* If the calling address is more that 24 bits away,
* then we had to use a trampoline to make the call.
* Otherwise just update the call site.
*/
if (test_24bit_addr(rec->ip, addr)) {
/* within range */
old = ftrace_call_replace(rec->ip, addr);
new = ftrace_nop_replace();
return ftrace_modify_code(rec->ip, old, new);
}

return 0;
}

int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
{
unsigned char *old, *new;

/*
* If the calling address is more that 24 bits away,
* then we had to use a trampoline to make the call.
* Otherwise just update the call site.
*/
if (test_24bit_addr(rec->ip, addr)) {
/* within range */
old = ftrace_nop_replace();
new = ftrace_call_replace(rec->ip, addr);
return ftrace_modify_code(rec->ip, old, new);
}

return 0;
}

int ftrace_update_ftrace_func(ftrace_func_t func)
{
unsigned long ip = (unsigned long)(&ftrace_call);
Expand All @@ -128,9 +184,10 @@ int ftrace_update_ftrace_func(ftrace_func_t func)

int __init ftrace_dyn_arch_init(void *data)
{
/* This is running in kstop_machine */
/* caller expects data to be zero */
unsigned long *p = data;

ftrace_mcount_set(data);
*p = 0;

return 0;
}
Expand Down

0 comments on commit 59ba939

Please sign in to comment.