Received: by 10.223.185.116 with SMTP id b49csp2589365wrg; Mon, 5 Mar 2018 05:39:33 -0800 (PST) X-Google-Smtp-Source: AG47ELtN+fwgJjDm424qwjLBxJOfmOtqauk14gJ6JCPdx7EI0mhCCDS2CGFBQz7+l9KJry3RmVCR X-Received: by 10.99.127.69 with SMTP id p5mr12136901pgn.346.1520257172908; Mon, 05 Mar 2018 05:39:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520257172; cv=none; d=google.com; s=arc-20160816; b=ZtVYoZMHrygnnBYnSBxFbYwJ7yyNAIAH4AyILL+ATJP8eRZBQsqT0zP9fzPuF7sO4R fAuuM9C0fCftgJhWYRx2CEZpfnXZ4FqyfNGIECPO10dUUw+MJYwnsBgTUgw+zNokViva ggYerNBnAP9Gmoo3vw4EungZQXbfL1RXjxx3h458/B5mNgz1u0ZlHL4X6zfeQR5JmCC4 8pKA+RoEA3XmeqZLEakKTTCTvj/QmnkiU8tjq6wbX/6yFqNZI81U8qqGFZS6X1FFZnZj b3FJDnEwiL8jas9X2gqgt8B1qwEutA3Lx9ooItVoEDKWVzlT9n0kBhegR8zP8mKjoWox yfUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=FsHr9cyDtWkPGmYU2PDo95OfsWWzAjreN/HkHHuHYlM=; b=XtD3LEGOuB6H7mn7Rr4z3wkIHlHw40PT6T2NvnQZMc32cCDh2Xb/eCoOXRMnISyDB5 jUoYbsFr/uFQ3R7h32nugwz5gzazAhPRm/ZAr7vku8tV0HZ/8sr0biqmnuf1xSikkyp9 Rj+VIMOxNjDibUZZhFdHTW2i1h1q+cCH9qMI1hh93AGAHjD1yiFBZb+Sz4Rv1jN8E3lb bobJJwWYOjlhl02KeWPp3I3jVwkXzgVjUpaCL14BnB7IZO0fMTJfziRqVvomSHyUQoIy dNHdjc6ZHpfGFoH4OKsO9Ds9l3xdQVBVKmIMmCuEuHU18DNf+9Iajvu7iGTAQgHvYOdr el1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail (test mode) header.i=@8bytes.org header.s=mail-1 header.b=IbBmpPRF; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w61-v6si9378292plb.733.2018.03.05.05.39.18; Mon, 05 Mar 2018 05:39:32 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail (test mode) header.i=@8bytes.org header.s=mail-1 header.b=IbBmpPRF; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934313AbeCEKct (ORCPT + 99 others); Mon, 5 Mar 2018 05:32:49 -0500 Received: from 8bytes.org ([81.169.241.247]:54420 "EHLO theia.8bytes.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933519AbeCEK0N (ORCPT ); Mon, 5 Mar 2018 05:26:13 -0500 Received: by theia.8bytes.org (Postfix, from userid 1000) id 4920E875; Mon, 5 Mar 2018 11:26:05 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=8bytes.org; s=mail-1; t=1520245566; bh=K/VCNAYFb+z4VILmScdW8838Jrj7mRY5+JOhSGxmt30=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=IbBmpPRFJHk9b9CcPDIOLeNOBUx7M3xpAfUgZ3/mbdH2MVpk3O2sx+1j/AkQCTjcK nA2OscuTGmfybJohxBfkQmiDP+nlAHzDmvYqSKph7bg+h0iGfSUUh/cfsDGYCPlV2F gZ1gkM2lWhamYZ1G6YjXbfvgR3Q2dLwPdjvMVhGZtm1ESIp/ALP8PiBG8pM2pPAcw5 ndgL9qcOHYzgP5PaV1QfRVJMLFIhLk0EG0lhaBci/50xZ53bY59FLCGboCSaepp9pb ulphL9WqaikobPAKffhVWthEL8h+tjaA1i+yVAovizA6oWMTUxTrlR0RdaqqDFFTkW 3zwZIDroysG2w== From: Joerg Roedel To: Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" Cc: x86@kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Linus Torvalds , Andy Lutomirski , Dave Hansen , Josh Poimboeuf , Juergen Gross , Peter Zijlstra , Borislav Petkov , Jiri Kosina , Boris Ostrovsky , Brian Gerst , David Laight , Denys Vlasenko , Eduardo Valentin , Greg KH , Will Deacon , aliguori@amazon.com, daniel.gruss@iaik.tugraz.at, hughd@google.com, keescook@google.com, Andrea Arcangeli , Waiman Long , Pavel Machek , jroedel@suse.de, joro@8bytes.org Subject: [PATCH 07/34] x86/entry/32: Restore segments before int registers Date: Mon, 5 Mar 2018 11:25:36 +0100 Message-Id: <1520245563-8444-8-git-send-email-joro@8bytes.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1520245563-8444-1-git-send-email-joro@8bytes.org> References: <1520245563-8444-1-git-send-email-joro@8bytes.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joerg Roedel Restoring the segments can cause exceptions that need to be handled. With PTI enabled, we still need to be on kernel cr3 when the exception happens. For the cr3-switch we need at least one integer scratch register, so we can't switch with the user integer registers already loaded. Avoid a push/pop cycle to free a register for the cr3 switch by restoring the segments first. That way the integer registers are not live yet and we can use them for the cr3 switch. This also helps in the NMI path, where we need to leave with the same cr3 as we entered. There we still have the callee-saved registers live when switching cr3s. Signed-off-by: Joerg Roedel --- arch/x86/entry/entry_32.S | 50 ++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S index 9bd7718..b39c5e2 100644 --- a/arch/x86/entry/entry_32.S +++ b/arch/x86/entry/entry_32.S @@ -92,11 +92,6 @@ .macro PUSH_GS pushl $0 .endm -.macro POP_GS pop=0 - addl $(4 + \pop), %esp -.endm -.macro POP_GS_EX -.endm /* all the rest are no-op */ .macro PTGS_TO_GS @@ -116,20 +111,6 @@ pushl %gs .endm -.macro POP_GS pop=0 -98: popl %gs - .if \pop <> 0 - add $\pop, %esp - .endif -.endm -.macro POP_GS_EX -.pushsection .fixup, "ax" -99: movl $0, (%esp) - jmp 98b -.popsection - _ASM_EXTABLE(98b, 99b) -.endm - .macro PTGS_TO_GS 98: mov PT_GS(%esp), %gs .endm @@ -201,24 +182,35 @@ popl %eax .endm -.macro RESTORE_REGS pop=0 - RESTORE_INT_REGS -1: popl %ds -2: popl %es -3: popl %fs - POP_GS \pop +.macro RESTORE_SEGMENTS +1: mov PT_DS(%esp), %ds +2: mov PT_ES(%esp), %es +3: mov PT_FS(%esp), %fs + PTGS_TO_GS .pushsection .fixup, "ax" -4: movl $0, (%esp) +4: movl $0, PT_DS(%esp) jmp 1b -5: movl $0, (%esp) +5: movl $0, PT_ES(%esp) jmp 2b -6: movl $0, (%esp) +6: movl $0, PT_FS(%esp) jmp 3b .popsection _ASM_EXTABLE(1b, 4b) _ASM_EXTABLE(2b, 5b) _ASM_EXTABLE(3b, 6b) - POP_GS_EX + PTGS_TO_GS_EX +.endm + +.macro RESTORE_SKIP_SEGMENTS pop=0 + /* Jump over the segments stored on stack */ + addl $((4 * 4) + \pop), %esp +.endm + +.macro RESTORE_REGS pop=0 + RESTORE_SEGMENTS + RESTORE_INT_REGS + /* Skip over already restored segment registers */ + RESTORE_SKIP_SEGMENTS \pop .endm .macro CHECK_AND_APPLY_ESPFIX -- 2.7.4