xref: /freebsd/sys/amd64/amd64/initcpu.c (revision cda078658e6fb14d86529be6ca93ff465fc858a0)
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