Skip to content

Commit

Permalink
Revert "x86/orc: Make it callthunk aware"
Browse files Browse the repository at this point in the history
Commit 396e0b8 ("x86/orc: Make it callthunk aware") attempted to
deal with the fact that function prefix code didn't have ORC coverage.
However, it didn't work as advertised.  Use of the "null" ORC entry just
caused affected unwinds to end early.

The root cause has now been fixed with commit 5743654 ("objtool:
Generate ORC data for __pfx code").

Revert most of commit 396e0b8 ("x86/orc: Make it callthunk aware").
The is_callthunk() function remains as it's now used by other code.

Link: https://lore.kernel.org/r/a05b916ef941da872cbece1ab3593eceabd05a79.1684245404.git.jpoimboe@kernel.org
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
  • Loading branch information
Josh Poimboeuf committed Jun 7, 2023
1 parent 4a03aa3 commit 0201262
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 26 deletions.
5 changes: 0 additions & 5 deletions arch/x86/include/asm/alternative.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ extern void callthunks_patch_builtin_calls(void);
extern void callthunks_patch_module_calls(struct callthunk_sites *sites,
struct module *mod);
extern void *callthunks_translate_call_dest(void *dest);
extern bool is_callthunk(void *addr);
extern int x86_call_depth_emit_accounting(u8 **pprog, void *func);
#else
static __always_inline void callthunks_patch_builtin_calls(void) {}
Expand All @@ -124,10 +123,6 @@ static __always_inline void *callthunks_translate_call_dest(void *dest)
{
return dest;
}
static __always_inline bool is_callthunk(void *addr)
{
return false;
}
static __always_inline int x86_call_depth_emit_accounting(u8 **pprog,
void *func)
{
Expand Down
2 changes: 1 addition & 1 deletion arch/x86/kernel/callthunks.c
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ void *callthunks_translate_call_dest(void *dest)
return target ? : dest;
}

bool is_callthunk(void *addr)
static bool is_callthunk(void *addr)
{
unsigned int tmpl_size = SKL_TMPL_SIZE;
void *tmpl = skl_call_thunk_template;
Expand Down
21 changes: 1 addition & 20 deletions arch/x86/kernel/unwind_orc.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,21 +183,6 @@ static struct orc_entry null_orc_entry = {
.type = ORC_TYPE_CALL
};

#ifdef CONFIG_CALL_THUNKS
static struct orc_entry *orc_callthunk_find(unsigned long ip)
{
if (!is_callthunk((void *)ip))
return NULL;

return &null_orc_entry;
}
#else
static struct orc_entry *orc_callthunk_find(unsigned long ip)
{
return NULL;
}
#endif

/* Fake frame pointer entry -- used as a fallback for generated code */
static struct orc_entry orc_fp_entry = {
.type = ORC_TYPE_CALL,
Expand Down Expand Up @@ -250,11 +235,7 @@ static struct orc_entry *orc_find(unsigned long ip)
if (orc)
return orc;

orc = orc_ftrace_find(ip);
if (orc)
return orc;

return orc_callthunk_find(ip);
return orc_ftrace_find(ip);
}

#ifdef CONFIG_MODULES
Expand Down

0 comments on commit 0201262

Please sign in to comment.