From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753263AbbHNS5t (ORCPT ); Fri, 14 Aug 2015 14:57:49 -0400 Received: from mail-ig0-f175.google.com ([209.85.213.175]:35368 "EHLO mail-ig0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751100AbbHNS5r (ORCPT ); Fri, 14 Aug 2015 14:57:47 -0400 MIME-Version: 1.0 In-Reply-To: References: <20150814071500.GA2678@gmail.com> Date: Fri, 14 Aug 2015 11:57:46 -0700 X-Google-Sender-Auth: pb2RXQZYOr-cud_gIw47ToGd_us Message-ID: Subject: Re: [GIT PULL] x86 fixes From: Linus Torvalds To: Andy Lutomirski Cc: Ingo Molnar , Juergen Gross , Andy Lutomirski , Linux Kernel Mailing List , Thomas Gleixner , "H. Peter Anvin" , Peter Zijlstra , Brian Gerst , Denys Vlasenko , Andrew Morton Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Aug 14, 2015 at 11:46 AM, Andy Lutomirski wrote: > > I think it's only slightly broken. > > This bit: > > if ((FPU_CS & 4) != 4) { /* Must be in the LDT */ > /* Can only handle segmented addressing via the LDT > for now, and it must be 16 bit */ > printk("FPU emulator: Unsupported addressing mode\n"); > math_abort(FPU_info, SIGILL); > } > > code_descriptor = FPU_get_ldt_descriptor(FPU_CS); > > is buggy, but no buggier than the old code. That code seems fine to me (and explicitly errors out when it's not in the LDT). FPU_CS is actually the CS selector value. So testing that for being in the LDT by checking bit #2, and then using FPU_get_ldt_descriptor() on it actually seems *correct*. It's the actual instruction data segment handling that looks entirely broken, and was explicitly made *more* broken by that commit. The FPU emulation code has two different kinds of segment defines: - the PREFIX_xx_ defines are the segment register numbers (well, prefix numbers) - the FPU_CS/SS/DS defines are the current selector values for those. and yes, it's confusing how it tends to use the variable name "segment" for the prefix number, when in the rest of the kernel we tend to always track the selector value. Linus