lkml.org 
[lkml]   [2022]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 009/130] x86/xen: Support objtool validation in xen-asm.S
    Date
    From: Josh Poimboeuf <jpoimboe@redhat.com>

    commit cde07a4e4434ddfb9b1616ac971edf6d66329804 upstream.

    The OBJECT_FILES_NON_STANDARD annotation is used to tell objtool to
    ignore a file. File-level ignores won't work when validating vmlinux.o.

    Tweak the ELF metadata and unwind hints to allow objtool to follow the
    code.

    Cc: Juergen Gross <jgross@suse.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
    Link: https://lore.kernel.org/r/8b042a09c69e8645f3b133ef6653ba28f896807d.1611263462.git.jpoimboe@redhat.com
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/xen/Makefile | 1 -
    arch/x86/xen/xen-asm.S | 29 +++++++++++++++++++----------
    2 files changed, 19 insertions(+), 11 deletions(-)

    --- a/arch/x86/xen/Makefile
    +++ b/arch/x86/xen/Makefile
    @@ -1,5 +1,4 @@
    # SPDX-License-Identifier: GPL-2.0
    -OBJECT_FILES_NON_STANDARD_xen-asm.o := y

    ifdef CONFIG_FUNCTION_TRACER
    # Do not profile debug and lowlevel utilities
    --- a/arch/x86/xen/xen-asm.S
    +++ b/arch/x86/xen/xen-asm.S
    @@ -14,6 +14,7 @@
    #include <asm/thread_info.h>
    #include <asm/asm.h>
    #include <asm/frame.h>
    +#include <asm/unwind_hints.h>

    #include <xen/interface/xen.h>

    @@ -147,6 +148,7 @@ SYM_FUNC_END(xen_read_cr2_direct);

    .macro xen_pv_trap name
    SYM_CODE_START(xen_\name)
    + UNWIND_HINT_EMPTY
    pop %rcx
    pop %r11
    jmp \name
    @@ -186,6 +188,7 @@ xen_pv_trap asm_exc_xen_hypervisor_callb
    SYM_CODE_START(xen_early_idt_handler_array)
    i = 0
    .rept NUM_EXCEPTION_VECTORS
    + UNWIND_HINT_EMPTY
    pop %rcx
    pop %r11
    jmp early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE
    @@ -212,11 +215,13 @@ hypercall_iret = hypercall_page + __HYPE
    * rsp->rax }
    */
    SYM_CODE_START(xen_iret)
    + UNWIND_HINT_EMPTY
    pushq $0
    jmp hypercall_iret
    SYM_CODE_END(xen_iret)

    SYM_CODE_START(xen_sysret64)
    + UNWIND_HINT_EMPTY
    /*
    * We're already on the usermode stack at this point, but
    * still with the kernel gs, so we can easily switch back.
    @@ -271,7 +276,8 @@ SYM_CODE_END(xenpv_restore_regs_and_retu
    */

    /* Normal 64-bit system call target */
    -SYM_FUNC_START(xen_syscall_target)
    +SYM_CODE_START(xen_syscall_target)
    + UNWIND_HINT_EMPTY
    popq %rcx
    popq %r11

    @@ -284,12 +290,13 @@ SYM_FUNC_START(xen_syscall_target)
    movq $__USER_CS, 1*8(%rsp)

    jmp entry_SYSCALL_64_after_hwframe
    -SYM_FUNC_END(xen_syscall_target)
    +SYM_CODE_END(xen_syscall_target)

    #ifdef CONFIG_IA32_EMULATION

    /* 32-bit compat syscall target */
    -SYM_FUNC_START(xen_syscall32_target)
    +SYM_CODE_START(xen_syscall32_target)
    + UNWIND_HINT_EMPTY
    popq %rcx
    popq %r11

    @@ -302,10 +309,11 @@ SYM_FUNC_START(xen_syscall32_target)
    movq $__USER32_CS, 1*8(%rsp)

    jmp entry_SYSCALL_compat_after_hwframe
    -SYM_FUNC_END(xen_syscall32_target)
    +SYM_CODE_END(xen_syscall32_target)

    /* 32-bit compat sysenter target */
    -SYM_FUNC_START(xen_sysenter_target)
    +SYM_CODE_START(xen_sysenter_target)
    + UNWIND_HINT_EMPTY
    /*
    * NB: Xen is polite and clears TF from EFLAGS for us. This means
    * that we don't need to guard against single step exceptions here.
    @@ -322,17 +330,18 @@ SYM_FUNC_START(xen_sysenter_target)
    movq $__USER32_CS, 1*8(%rsp)

    jmp entry_SYSENTER_compat_after_hwframe
    -SYM_FUNC_END(xen_sysenter_target)
    +SYM_CODE_END(xen_sysenter_target)

    #else /* !CONFIG_IA32_EMULATION */

    -SYM_FUNC_START_ALIAS(xen_syscall32_target)
    -SYM_FUNC_START(xen_sysenter_target)
    +SYM_CODE_START(xen_syscall32_target)
    +SYM_CODE_START(xen_sysenter_target)
    + UNWIND_HINT_EMPTY
    lea 16(%rsp), %rsp /* strip %rcx, %r11 */
    mov $-ENOSYS, %rax
    pushq $0
    jmp hypercall_iret
    -SYM_FUNC_END(xen_sysenter_target)
    -SYM_FUNC_END_ALIAS(xen_syscall32_target)
    +SYM_CODE_END(xen_sysenter_target)
    +SYM_CODE_END(xen_syscall32_target)

    #endif /* CONFIG_IA32_EMULATION */

    \
     
     \ /
      Last update: 2022-07-12 20:43    [W:4.051 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site