From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AH8x224eguqYfxqM883tBeqle8tppyJ9VHlT7QWNUNIbLi9fEraHS73MkSTTW570hYOtZbTJghXw ARC-Seal: i=1; a=rsa-sha256; t=1516721577; cv=none; d=google.com; s=arc-20160816; b=GbTzCQkaaAfLUM/FYqsdeUoBnzhPPlHt8DW+ZRARDyu5MoB7yp1a6xAKoEDruaqISC dZTmYLKoA2qS7KWWl6BYZTuKmN/mYen394thmVS4Dp6zKiF9KIlPvoreXKkqq6O/vgcX nyaxUp9NNhASekQ9SqGvwUfUCRR27+FVcgqBh51i4en/uT9svfiZBIO3zvRFkmLRwIiE ta49a9tcgol1vCHGwpeUuocwmFEGkiY+IX9X3MkOQn2jxwwyGm2204sd4GSrXvOWevVP 2RHiFj8Qr6s+wcO9RYnThV8fl/B7VFsJGNnRS08P/dOhyB+6aL7a9G4bXX8F3Vum3OnI lN4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-disposition:mime-version:references:subject:cc:to:from:date :user-agent:message-id:dkim-signature:arc-authentication-results; bh=1FEkCPPtxnXnZNHDTJYGV4riqQuYqFiRczTI0p0tOSE=; b=MlJR297DDVDcYgzbgPy+epaWBMF4rd8AhtxdoULpya2mGNA6EqYes5yuEDI7IND3Hr kTEDOEuWRXNAFFWapvsSUtwJv6GHr9nen1x1vT3N7G8FiX//jNDLQ4h5Ymxg1G/FpRTJ K0V0dB3ZCAyH4y96hHEN9ZTEGSLaB1+49Ha8xaTCqr6TnhToBQYxnB5aTcxDyESBiKjO uBOxXvn1PRK/c95mFxcrhyuwtQMBsQyIMgf5hKqzPL8vN3Xrl3TdE70SvhbJCLAQxg5N mYmSQJTCw9CizL1ThKpssuzqhyQc6raWnTS/0oIPzYY5P0NI9JphL//Hfrnc8T9c77os x/Hw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@infradead.org header.s=bombadil.20170209 header.b=Ufh+On6r; spf=pass (google.com: best guess record for domain of peterz@infradead.org designates 65.50.211.133 as permitted sender) smtp.mailfrom=peterz@infradead.org Authentication-Results: mx.google.com; dkim=pass header.i=@infradead.org header.s=bombadil.20170209 header.b=Ufh+On6r; spf=pass (google.com: best guess record for domain of peterz@infradead.org designates 65.50.211.133 as permitted sender) smtp.mailfrom=peterz@infradead.org Message-Id: <20180123152638.162540737@infradead.org> User-Agent: quilt/0.63-1 Date: Tue, 23 Jan 2018 16:25:42 +0100 From: Peter Zijlstra To: David Woodhouse , Thomas Gleixner , Josh Poimboeuf Cc: linux-kernel@vger.kernel.org, Dave Hansen , Ashok Raj , Tim Chen , Andy Lutomirski , Linus Torvalds , Greg KH , Andrea Arcangeli , Andi Kleen , Arjan Van De Ven , Dan Williams , Paolo Bonzini , Jun Nakajima , Asit Mallick , Jason Baron , Peter Zijlstra Subject: [PATCH 03/24] x86/paravirt: Annotate indirect calls References: <20180123152539.374360046@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline; filename=peterz-retpoline-annotate-pv.patch X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1590397845189698377?= X-GMAIL-MSGID: =?utf-8?q?1590397845189698377?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: 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) --- 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