Skip to content

Commit

Permalink
x86/sev: Mark snp_abort() noreturn
Browse files Browse the repository at this point in the history
Mark both the function prototype and definition as noreturn in order to
prevent the compiler from doing transformations which confuse objtool
like so:

  vmlinux.o: warning: objtool: sme_enable+0x71: unreachable instruction

This triggers with gcc-12.

Add it and sev_es_terminate() to the objtool noreturn tracking array
too. Sort it while at it.

Suggested-by: Michael Matz <matz@suse.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Acked-by: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220824152420.20547-1-bp@alien8.de
  • Loading branch information
Borislav Petkov committed Aug 25, 2022
1 parent cdaa0a4 commit c93c296
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 18 deletions.
2 changes: 1 addition & 1 deletion arch/x86/include/asm/sev.h
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ void snp_set_memory_shared(unsigned long vaddr, unsigned int npages);
void snp_set_memory_private(unsigned long vaddr, unsigned int npages);
void snp_set_wakeup_secondary_cpu(void);
bool snp_init(struct boot_params *bp);
void snp_abort(void);
void __init __noreturn snp_abort(void);
int snp_issue_guest_request(u64 exit_code, struct snp_req_data *input, unsigned long *fw_err);
#else
static inline void sev_es_ist_enter(struct pt_regs *regs) { }
Expand Down
2 changes: 1 addition & 1 deletion arch/x86/kernel/sev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2112,7 +2112,7 @@ bool __init snp_init(struct boot_params *bp)
return true;
}

void __init snp_abort(void)
void __init __noreturn snp_abort(void)
{
sev_es_terminate(SEV_TERM_SET_GEN, GHCB_SNP_UNSUPPORTED);
}
Expand Down
34 changes: 18 additions & 16 deletions tools/objtool/check.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,32 +162,34 @@ static bool __dead_end_function(struct objtool_file *file, struct symbol *func,

/*
* Unfortunately these have to be hard coded because the noreturn
* attribute isn't provided in ELF data.
* attribute isn't provided in ELF data. Keep 'em sorted.
*/
static const char * const global_noreturns[] = {
"__invalid_creds",
"__module_put_and_kthread_exit",
"__reiserfs_panic",
"__stack_chk_fail",
"panic",
"__ubsan_handle_builtin_unreachable",
"cpu_bringup_and_idle",
"cpu_startup_entry",
"do_exit",
"do_group_exit",
"do_task_dead",
"kthread_exit",
"make_task_dead",
"__module_put_and_kthread_exit",
"ex_handler_msr_mce",
"fortify_panic",
"kthread_complete_and_exit",
"__reiserfs_panic",
"kthread_exit",
"kunit_try_catch_throw",
"lbug_with_loc",
"fortify_panic",
"usercopy_abort",
"machine_real_restart",
"make_task_dead",
"panic",
"rewind_stack_and_make_dead",
"kunit_try_catch_throw",
"xen_start_kernel",
"cpu_bringup_and_idle",
"do_group_exit",
"sev_es_terminate",
"snp_abort",
"stop_this_cpu",
"__invalid_creds",
"cpu_startup_entry",
"__ubsan_handle_builtin_unreachable",
"ex_handler_msr_mce",
"usercopy_abort",
"xen_start_kernel",
};

if (!func)
Expand Down

0 comments on commit c93c296

Please sign in to comment.