lkml.org 
[lkml]   [2018]   [Jan]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    From
    Subject[PATCH 12/35] x86/paravirt: Annotate indirect calls
    Paravirt emits indirect calls which get flagged by objtool retpoline
    checks, annotate it away because all these indirect calls will be
    patched out before we start userspace.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    arch/x86/include/asm/paravirt.h | 22 ++++++++++++++++++----
    arch/x86/include/asm/paravirt_types.h | 7 ++++++-
    2 files changed, 24 insertions(+), 5 deletions(-)

    --- a/arch/x86/include/asm/paravirt.h
    +++ b/arch/x86/include/asm/paravirt.h
    @@ -828,6 +828,12 @@ extern void default_banner(void);
    .short clobbers; \
    .popsection

    +#define PARA_RETPOLINE_SAFE \
    + 773:; \
    + .pushsection .discard.retpoline_safe; \
    + _ASM_PTR 773b; \
    + .popsection
    +

    #define COND_PUSH(set, mask, reg) \
    .if ((~(set)) & mask); push %reg; .endif
    @@ -879,23 +885,27 @@ extern void default_banner(void);

    #define INTERRUPT_RETURN \
    PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_iret), CLBR_NONE, \
    - jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_iret))
    + PARA_RETPOLINE_SAFE; \
    + jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_iret);)

    #define DISABLE_INTERRUPTS(clobbers) \
    PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_disable), clobbers, \
    PV_SAVE_REGS(clobbers | CLBR_CALLEE_SAVE); \
    + PARA_RETPOLINE_SAFE; \
    call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_disable); \
    PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);)

    #define ENABLE_INTERRUPTS(clobbers) \
    PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_enable), clobbers, \
    PV_SAVE_REGS(clobbers | CLBR_CALLEE_SAVE); \
    + PARA_RETPOLINE_SAFE; \
    call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_enable); \
    PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);)

    #ifdef CONFIG_X86_32
    #define GET_CR0_INTO_EAX \
    push %ecx; push %edx; \
    + PARA_RETPOLINE_SAFE; \
    call PARA_INDIRECT(pv_cpu_ops+PV_CPU_read_cr0); \
    pop %edx; pop %ecx
    #else /* !CONFIG_X86_32 */
    @@ -917,21 +927,25 @@ extern void default_banner(void);
    */
    #define SWAPGS \
    PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_swapgs), CLBR_NONE, \
    - call PARA_INDIRECT(pv_cpu_ops+PV_CPU_swapgs) \
    + PARA_RETPOLINE_SAFE; \
    + call PARA_INDIRECT(pv_cpu_ops+PV_CPU_swapgs); \
    )

    #define GET_CR2_INTO_RAX \
    - call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2)
    + PARA_RETPOLINE_SAFE; \
    + call PARA_INDIRECT(pv_mmu_ops+PV_MMU_read_cr2);

    #define USERGS_SYSRET64 \
    PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_usergs_sysret64), \
    CLBR_NONE, \
    - jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_usergs_sysret64))
    + PARA_RETPOLINE_SAFE; \
    + jmp PARA_INDIRECT(pv_cpu_ops+PV_CPU_usergs_sysret64);)

    #ifdef CONFIG_DEBUG_ENTRY
    #define SAVE_FLAGS(clobbers) \
    PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_save_fl), clobbers, \
    PV_SAVE_REGS(clobbers | CLBR_CALLEE_SAVE); \
    + PARA_RETPOLINE_SAFE; \
    call PARA_INDIRECT(pv_irq_ops+PV_IRQ_save_fl); \
    PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);)
    #endif
    --- a/arch/x86/include/asm/paravirt_types.h
    +++ b/arch/x86/include/asm/paravirt_types.h
    @@ -392,7 +392,12 @@ int paravirt_disable_iospace(void);
    * offset into the paravirt_patch_template structure, and can therefore be
    * freely converted back into a structure offset.
    */
    -#define PARAVIRT_CALL "call *%c[paravirt_opptr];"
    +#define PARAVIRT_CALL \
    + "773:;\n" \
    + ".pushsection .discard.retpoline_safe\n" \
    + _ASM_PTR " 773b\n" \
    + ".popsection\n" \
    + "call *%c[paravirt_opptr];"

    /*
    * These macros are intended to wrap calls through one of the paravirt

    \
     
     \ /
      Last update: 2018-01-18 16:07    [W:4.075 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site