kernel - Fix bug in x86-64 version of bzeront()
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 3 Dec 2010 02:11:29 +0000 (18:11 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 3 Dec 2010 02:42:54 +0000 (18:42 -0800)
* The x86-64 bzeront code was subtracting the wrong value from the count
  when looping.  Note that prior to this commit the code was not being
  used anyway.

* Rearrange the way movnti support is detected and enable for x86-64.

sys/cpu/x86_64/misc/bzeront.s
sys/kern/init_main.c
sys/platform/pc32/i386/identcpu.c
sys/platform/pc32/isa/npx.c
sys/platform/pc64/x86_64/identcpu.c
sys/sys/param.h
sys/sys/systm.h
sys/vm/vm_zeroidle.c

index 4acfefb..2bbc2a1 100644 (file)
@@ -50,6 +50,6 @@ ENTRY(bzeront)
 1:
        movnti %rax,(%rdi)
        addq $8,%rdi
-       subq $8,%rsi
+       subq $1,%rsi
        jne 1b
-       ret
+       retq
index d2c1e6b..d4e54f6 100644 (file)
@@ -96,6 +96,7 @@ struct lwp lwp0;
 struct thread thread0;
 
 int cmask = CMASK;
+u_int cpu_mi_feature;
 extern struct user *proc0paddr;
 extern int fallback_elf_brand;
 
index 1655763..17145e4 100644 (file)
@@ -1174,7 +1174,7 @@ finishidentcpu(void)
                                strcpy(cpu_vendor, "IBM");
                                cpu_vendor_id = CPU_VENDOR_IBM;
                                cpu = CPU_BLUE;
-                               return;
+                               goto finish;
                        }
                }
                switch (cpu_id & 0xf00) {
@@ -1248,9 +1248,17 @@ finishidentcpu(void)
                        strcpy(cpu_vendor, "IBM");
                        cpu_vendor_id = CPU_VENDOR_IBM;
                        cpu = CPU_BLUE;
-                       return;
                }
        }
+
+       /*
+        * Set MI flags for MI procedures implemented using machine-specific
+        * features.
+        */
+finish:
+       if (cpu_feature & CPUID_SSE2)
+               cpu_mi_feature |= CPU_MI_BZERONT;
+
 }
 
 static u_int
index fd94b57..6c3033f 100644 (file)
@@ -153,8 +153,6 @@ static      void    fpurstor        (union savefpu *);
 
 int    hw_float;               /* XXX currently just alias for npx_exists */
 
-extern int bzeront_avail;
-
 SYSCTL_INT(_hw,HW_FLOATINGPT, floatingpoint,
        CTLFLAG_RD, &hw_float, 0, 
        "Floatingpoint instructions executed in hardware");
@@ -495,8 +493,6 @@ npx_attach(device_t dev)
                }
        }
 
-       if ((cpu_feature & CPUID_SSE2) && mmxopt)
-               bzeront_avail = 1;
 #endif
 #if 0
        if (cpu_class == CPUCLASS_586 && npx_ex16 && npx_exists &&
index 52e8d5c..a6e5747 100644 (file)
@@ -481,6 +481,10 @@ identify_cpu(void)
 
        /* XXX */
        cpu = CPU_CLAWHAMMER;
+
+       if (cpu_feature & CPUID_SSE2)
+               cpu_mi_feature |= CPU_MI_BZERONT;
+
 }
 
 static u_int
index 95a4906..10c9107 100644 (file)
 #endif
 
 /*
+ * cpu_mi_feature bits
+ */
+#define CPU_MI_BZERONT 0x00000001
+
+/*
  * File system parameters and macros.
  *
  * MAXBSIZE -  Filesystems are made out of blocks of at most MAXBSIZE bytes
index 40a48d9..ca580db 100644 (file)
@@ -98,6 +98,7 @@ extern int clocks_running;    /* timing/timeout subsystem is operational */
 /* XXX TGEN these don't belong here, they're MD on i386/x86_64 */
 extern u_int cpu_feature;      /* CPUID_* features */
 extern u_int cpu_feature2;     /* CPUID2_* features */
+extern u_int cpu_mi_feature;   /* CPU_MI_XXX machine-nonspecific features */
 
 extern int nfs_diskless_valid; /* NFS diskless params were obtained */
 extern vm_paddr_t Maxmem;      /* Highest physical memory address in system */
index 3d181a3..c99dee9 100644 (file)
@@ -75,8 +75,7 @@ SYSCTL_INT(_vm, OID_AUTO, idlezero_enable, CTLFLAG_RW, &idlezero_enable, 0,
 static int idlezero_rate = NPAGES_RUN;
 SYSCTL_INT(_vm, OID_AUTO, idlezero_rate, CTLFLAG_RW, &idlezero_rate, 0,
           "Maximum pages per second to zero");
-int bzeront_avail = 0;
-static int idlezero_nocache = 0;
+static int idlezero_nocache = -1;
 SYSCTL_INT(_vm, OID_AUTO, idlezero_nocache, CTLFLAG_RW, &idlezero_nocache, 0,
           "Maximum pages per second to zero");
 
@@ -237,7 +236,8 @@ pagezero_start(void __unused *arg)
        int error;
        struct thread *td;
 
-       idlezero_nocache = bzeront_avail;
+       if (idlezero_nocache < 0 && (cpu_mi_feature & CPU_MI_BZERONT))
+               idlezero_nocache = 1;
 
        error = kthread_create(vm_pagezero, NULL, &td, "pagezero");
        if (error)