Re: [PATCH v3 04/29] x86: assembly, use ENDPROC for functions

From: Josh Poimboeuf
Date: Tue Apr 25 2017 - 21:42:29 EST


On Fri, Apr 21, 2017 at 04:12:40PM +0200, Jiri Slaby wrote:
> Somewhere END was used to end a function. It is not intended to be used
> for functions, because it does not mark the actual symbols as functions.
> Use ENDPROC in such cases which does the right job.
>
> Signed-off-by: Jiri Slaby <jslaby@xxxxxxx>
> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
> Cc: Ingo Molnar <mingo@xxxxxxxxxx>
> Cc: "H. Peter Anvin" <hpa@xxxxxxxxx>
> Cc: <x86@xxxxxxxxxx>
> Cc: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
> Cc: Juergen Gross <jgross@xxxxxxxx>
> Reviewed-by: Juergen Gross <jgross@xxxxxxxx> [xen parts]
> Cc: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
> ---
> arch/x86/entry/entry_32.S | 58 ++++++++++++++++++++--------------------
> arch/x86/entry/entry_64.S | 40 +++++++++++++--------------
> arch/x86/entry/entry_64_compat.S | 4 +--
> arch/x86/kernel/ftrace_32.S | 8 +++---
> arch/x86/kernel/ftrace_64.S | 10 +++----
> arch/x86/xen/xen-pvh.S | 2 +-
> 6 files changed, 61 insertions(+), 61 deletions(-)
>
> diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
> index 50bc26949e9e..a546b84aec01 100644
> --- a/arch/x86/entry/entry_32.S
> +++ b/arch/x86/entry/entry_32.S
> @@ -249,7 +249,7 @@ ENTRY(__switch_to_asm)
> popl %ebp
>
> jmp __switch_to
> -END(__switch_to_asm)
> +ENDPROC(__switch_to_asm)
>
> /*
> * A newly forked process directly context switches into this address.
> @@ -289,7 +289,7 @@ ENTRY(ret_from_fork)
> */
> movl $0, PT_EAX(%esp)
> jmp 2b
> -END(ret_from_fork)
> +ENDPROC(ret_from_fork)
>
> /*
> * Return to user mode is not as complex as all this looks,
> @@ -323,7 +323,7 @@ ENTRY(resume_userspace)
> movl %esp, %eax
> call prepare_exit_to_usermode
> jmp restore_all
> -END(ret_from_exception)
> +ENDPROC(ret_from_exception)

What exactly is the motivation of this patch? It would be good to
describe that in the commit message.

Is the point to allow objtool to generate CFI for it? If so, I don't
really see how that would work. Today, objtool considers ENDPROC to
annotate a *callable* function which conforms to the C calling ABI and
can be called by another function. The stack is in a known state at
function entry, and so the CFI (or frame pointer info) can be reliably
determined.

But entry code is different. In most cases, the global symbols aren't
actually called, and they don't follow any conventions. The code is
spaghetti-esque, with HW handlers and jumps everywhere. The state of
the stack at symbol entry varies per "function". That's why objtool
ignores these files.

For special cases (like entry code), I was thinking we'd need manual CFI
annotations, like we had before. Or maybe there's another way, like
some new macros which tell objtool about the HW entry points and the
state of the registers there.

But I'm having trouble seeing how marking these code snippets with
ENTRY/ENDPROC would help objtool make any sense of the code and where
things are on the stack.

--
Josh