From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-f200.google.com (mail-wr0-f200.google.com [209.85.128.200]) by kanga.kvack.org (Postfix) with ESMTP id 9638D6B0012 for ; Mon, 5 Mar 2018 11:44:52 -0500 (EST) Received: by mail-wr0-f200.google.com with SMTP id f16so11708103wre.0 for ; Mon, 05 Mar 2018 08:44:52 -0800 (PST) Received: from theia.8bytes.org (8bytes.org. [2a01:238:4383:600:38bc:a715:4b6d:a889]) by mx.google.com with ESMTPS id 35si2305971edm.241.2018.03.05.08.44.49 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 05 Mar 2018 08:44:49 -0800 (PST) Date: Mon, 5 Mar 2018 17:44:48 +0100 From: Joerg Roedel Subject: Re: [PATCH 07/34] x86/entry/32: Restore segments before int registers Message-ID: <20180305164448.GS16484@8bytes.org> References: <1520245563-8444-1-git-send-email-joro@8bytes.org> <1520245563-8444-8-git-send-email-joro@8bytes.org> <20180305131231.GR16484@8bytes.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Sender: owner-linux-mm@kvack.org List-ID: To: Brian Gerst Cc: Linus Torvalds , Thomas Gleixner , Ingo Molnar , Peter Anvin , the arch/x86 maintainers , Linux Kernel Mailing List , linux-mm , Andrew Lutomirski , Dave Hansen , Josh Poimboeuf , =?iso-8859-1?Q?J=FCrgen_Gro=DF?= , Peter Zijlstra , Borislav Petkov , Jiri Kosina , Boris Ostrovsky , David Laight , Denys Vlasenko , Eduardo Valentin , Greg Kroah-Hartman , Will Deacon , "Liguori, Anthony" , Daniel Gruss , Hugh Dickins , Kees Cook , Andrea Arcangeli , Waiman Long , Pavel Machek , Joerg Roedel On Mon, Mar 05, 2018 at 09:51:29AM -0500, Brian Gerst wrote: > For the IRET fault case you will still need to catch it in the > exception code. See the 64-bit code (.Lerror_bad_iret) for example. > For 32-bit, you could just expand that check to cover the whole exit > prologue after the CR3 switch, including the data segment loads. I had a look at the 64 bit code and the exception-in-kernel case seems to be handled differently than on 32 bit. The 64 bit entry code has checks for certain kinds of errors like iret exceptions. On 32 bit this is implemented via the standard exception tables which get an entry for every EIP that might fault (usually segment loading operations, but also iret). So, unless I am missing something, all the exception entry code has to do is to remember the stack and the cr3 with which it was entered (if entered from kernel mode) and restore those before iret. And this is what I implemented in v3 of this patch-set. Regards, Joerg -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org