1cda07865SPeter Wemm /*- 24536af6aSKATO Takenori * Copyright (c) KATO Takenori, 1997, 1998. 3a8e282d6SKATO Takenori * 4a8e282d6SKATO Takenori * All rights reserved. Unpublished rights reserved under the copyright 5a8e282d6SKATO Takenori * laws of Japan. 6a8e282d6SKATO Takenori * 7a8e282d6SKATO Takenori * Redistribution and use in source and binary forms, with or without 8a8e282d6SKATO Takenori * modification, are permitted provided that the following conditions 9a8e282d6SKATO Takenori * are met: 10a8e282d6SKATO Takenori * 11a8e282d6SKATO Takenori * 1. Redistributions of source code must retain the above copyright 12a8e282d6SKATO Takenori * notice, this list of conditions and the following disclaimer as 13a8e282d6SKATO Takenori * the first lines of this file unmodified. 14a8e282d6SKATO Takenori * 2. Redistributions in binary form must reproduce the above copyright 15a8e282d6SKATO Takenori * notice, this list of conditions and the following disclaimer in the 16a8e282d6SKATO Takenori * documentation and/or other materials provided with the distribution. 17a8e282d6SKATO Takenori * 18a8e282d6SKATO Takenori * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19a8e282d6SKATO Takenori * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20a8e282d6SKATO Takenori * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21a8e282d6SKATO Takenori * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22a8e282d6SKATO Takenori * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23a8e282d6SKATO Takenori * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24a8e282d6SKATO Takenori * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25a8e282d6SKATO Takenori * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26a8e282d6SKATO Takenori * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27a8e282d6SKATO Takenori * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28a8e282d6SKATO Takenori */ 29a8e282d6SKATO Takenori 3056ae44c5SDavid E. O'Brien #include <sys/cdefs.h> 3156ae44c5SDavid E. O'Brien __FBSDID("$FreeBSD$"); 3256ae44c5SDavid E. O'Brien 33a8e282d6SKATO Takenori #include "opt_cpu.h" 34a8e282d6SKATO Takenori 35a8e282d6SKATO Takenori #include <sys/param.h> 36a8e282d6SKATO Takenori #include <sys/kernel.h> 37a8e282d6SKATO Takenori #include <sys/systm.h> 389d146ac5SPeter Wemm #include <sys/sysctl.h> 39a8e282d6SKATO Takenori 40a8e282d6SKATO Takenori #include <machine/cputypes.h> 41a8e282d6SKATO Takenori #include <machine/md_var.h> 42a8e282d6SKATO Takenori #include <machine/specialreg.h> 43a8e282d6SKATO Takenori 44a8e282d6SKATO Takenori void initializecpu(void); 4520916c1fSKATO Takenori 4610deca7eSJohn Baldwin static int hw_instruction_sse; 479d146ac5SPeter Wemm SYSCTL_INT(_hw, OID_AUTO, instruction_sse, CTLFLAG_RD, 4810deca7eSJohn Baldwin &hw_instruction_sse, 0, "SIMD/MMX2 instructions available in CPU"); 499d146ac5SPeter Wemm 50afa88623SPeter Wemm int cpu; /* Are we 386, 386sx, 486, etc? */ 51afa88623SPeter Wemm u_int cpu_feature; /* Feature flags */ 52afa88623SPeter Wemm u_int cpu_high; /* Highest arg to CPUID */ 53afa88623SPeter Wemm u_int cpu_id; /* Stepping ID */ 54afa88623SPeter Wemm u_int cpu_procinfo; /* HyperThreading Info / Brand Index / CLFUSH */ 55afa88623SPeter Wemm char cpu_vendor[20]; /* CPU Origin code */ 5610deca7eSJohn Baldwin u_int cpu_fxsr; /* SSE enabled */ 574faa812aSPeter Wemm 589d146ac5SPeter Wemm /* 599d146ac5SPeter Wemm * Initialize CR4 (Control register 4) to enable SSE instructions. 609d146ac5SPeter Wemm */ 619d146ac5SPeter Wemm void 629d146ac5SPeter Wemm enable_sse(void) 639d146ac5SPeter Wemm { 649d146ac5SPeter Wemm if ((cpu_feature & CPUID_XMM) && (cpu_feature & CPUID_FXSR)) { 659d146ac5SPeter Wemm load_cr4(rcr4() | CR4_FXSR | CR4_XMM); 669d146ac5SPeter Wemm cpu_fxsr = hw_instruction_sse = 1; 679d146ac5SPeter Wemm } 689d146ac5SPeter Wemm } 699d146ac5SPeter Wemm 70a8e282d6SKATO Takenori void 71a8e282d6SKATO Takenori initializecpu(void) 72a8e282d6SKATO Takenori { 73a8e282d6SKATO Takenori 74a8e282d6SKATO Takenori switch (cpu) { 75a8e282d6SKATO Takenori default: 76a8e282d6SKATO Takenori break; 77a8e282d6SKATO Takenori } 78aa32e9a9SPeter Wemm enable_sse(); 79a8e282d6SKATO Takenori } 80