x86/fpu, lguest: Remove CR0.TS support
authorAndy Lutomirski <luto@kernel.org>
Mon, 31 Oct 2016 22:18:46 +0000 (15:18 -0700)
committerIngo Molnar <mingo@kernel.org>
Tue, 1 Nov 2016 06:47:54 +0000 (07:47 +0100)
Now that Linux never sets CR0.TS, lguest doesn't need to support it.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: kvm list <kvm@vger.kernel.org>
Link: http://lkml.kernel.org/r/8a7bf2c11231c082258fd67705d0f275639b8475.1477951965.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/include/asm/lguest_hcall.h
arch/x86/lguest/boot.c
drivers/lguest/hypercalls.c
drivers/lguest/lg.h
drivers/lguest/x86/core.c

index ef01fef3eebc6556f24fe69aff32bf64a907925d..6c119cfae218bb6cce5b53d1bbae9427835f207c 100644 (file)
@@ -9,7 +9,6 @@
 #define LHCALL_FLUSH_TLB       5
 #define LHCALL_LOAD_IDT_ENTRY  6
 #define LHCALL_SET_STACK       7
-#define LHCALL_TS              8
 #define LHCALL_SET_CLOCKEVENT  9
 #define LHCALL_HALT            10
 #define LHCALL_SET_PMD         13
index 25da5bc8d83dc2ac8c84e8de6084acea77eb1ad3..d74afcdbc580f9f269602fb9fc5634e5c5ca5cad 100644 (file)
@@ -497,27 +497,24 @@ static void lguest_cpuid(unsigned int *ax, unsigned int *bx,
  * a whole series of functions like read_cr0() and write_cr0().
  *
  * We start with cr0.  cr0 allows you to turn on and off all kinds of basic
- * features, but Linux only really cares about one: the horrifically-named Task
- * Switched (TS) bit at bit 3 (ie. 8)
+ * features, but the only cr0 bit that Linux ever used at runtime was the
+ * horrifically-named Task Switched (TS) bit at bit 3 (ie. 8)
  *
  * What does the TS bit do?  Well, it causes the CPU to trap (interrupt 7) if
  * the floating point unit is used.  Which allows us to restore FPU state
- * lazily after a task switch, and Linux uses that gratefully, but wouldn't a
- * name like "FPUTRAP bit" be a little less cryptic?
+ * lazily after a task switch if we wanted to, but wouldn't a name like
+ * "FPUTRAP bit" be a little less cryptic?
  *
- * We store cr0 locally because the Host never changes it.  The Guest sometimes
- * wants to read it and we'd prefer not to bother the Host unnecessarily.
+ * Fortunately, Linux keeps it simple and doesn't use TS, so we can ignore
+ * cr0.
  */
-static unsigned long current_cr0;
 static void lguest_write_cr0(unsigned long val)
 {
-       lazy_hcall1(LHCALL_TS, val & X86_CR0_TS);
-       current_cr0 = val;
 }
 
 static unsigned long lguest_read_cr0(void)
 {
-       return current_cr0;
+       return 0;
 }
 
 /*
index 19a32280731db99e05661d3ae5c46b6a8f168dd2..601f81c04873375763e078ee1d7b2847c426e6ec 100644 (file)
@@ -109,10 +109,6 @@ static void do_hcall(struct lg_cpu *cpu, struct hcall_args *args)
        case LHCALL_SET_CLOCKEVENT:
                guest_set_clockevent(cpu, args->arg1);
                break;
-       case LHCALL_TS:
-               /* This sets the TS flag, as we saw used in run_guest(). */
-               cpu->ts = args->arg1;
-               break;
        case LHCALL_HALT:
                /* Similarly, this sets the halted flag for run_guest(). */
                cpu->halted = 1;
index 69b3814afd2f63c7fabe82dde698fae44b2d1862..2356a2318034568ae34a2b307e0bef87dbd82f22 100644 (file)
@@ -43,7 +43,6 @@ struct lg_cpu {
        struct mm_struct *mm;   /* == tsk->mm, but that becomes NULL on exit */
 
        u32 cr2;
-       int ts;
        u32 esp1;
        u16 ss1;
 
index 6e9042e3d2a944db17c37bf9f3fda675c1f0bdd6..743253fc638feced540c31871149cc96ae81be0a 100644 (file)
@@ -246,14 +246,6 @@ unsigned long *lguest_arch_regptr(struct lg_cpu *cpu, size_t reg_off, bool any)
  */
 void lguest_arch_run_guest(struct lg_cpu *cpu)
 {
-       /*
-        * Remember the awfully-named TS bit?  If the Guest has asked to set it
-        * we set it now, so we can trap and pass that trap to the Guest if it
-        * uses the FPU.
-        */
-       if (cpu->ts && fpregs_active())
-               stts();
-
        /*
         * SYSENTER is an optimized way of doing system calls.  We can't allow
         * it because it always jumps to privilege level 0.  A normal Guest
@@ -282,10 +274,6 @@ void lguest_arch_run_guest(struct lg_cpu *cpu)
         if (boot_cpu_has(X86_FEATURE_SEP))
                wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
 
-       /* Clear the host TS bit if it was set above. */
-       if (cpu->ts && fpregs_active())
-               clts();
-
        /*
         * If the Guest page faulted, then the cr2 register will tell us the
         * bad virtual address.  We have to grab this now, because once we
@@ -421,12 +409,7 @@ void lguest_arch_handle_trap(struct lg_cpu *cpu)
                        kill_guest(cpu, "Writing cr2");
                break;
        case 7: /* We've intercepted a Device Not Available fault. */
-               /*
-                * If the Guest doesn't want to know, we already restored the
-                * Floating Point Unit, so we just continue without telling it.
-                */
-               if (!cpu->ts)
-                       return;
+               /* No special handling is needed here. */
                break;
        case 32 ... 255:
                /* This might be a syscall. */