]>
Commit | Line | Data |
---|---|---|
55e303ae A |
1 | /* |
2 | * Copyright (c) 2003 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
e5568f75 A |
6 | * The contents of this file constitute Original Code as defined in and |
7 | * are subject to the Apple Public Source License Version 1.1 (the | |
8 | * "License"). You may not use this file except in compliance with the | |
9 | * License. Please obtain a copy of the License at | |
10 | * http://www.apple.com/publicsource and read it before using this file. | |
55e303ae | 11 | * |
e5568f75 A |
12 | * This Original Code and all software distributed under the License are |
13 | * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
55e303ae A |
14 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
15 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
e5568f75 A |
16 | * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the |
17 | * License for the specific language governing rights and limitations | |
18 | * under the License. | |
55e303ae A |
19 | * |
20 | * @APPLE_LICENSE_HEADER_END@ | |
21 | */ | |
22 | ||
23 | #include <sys/param.h> | |
24 | #include <sys/kernel.h> | |
25 | #include <sys/sysctl.h> | |
26 | #include <i386/cpuid.h> | |
27 | ||
28 | static int | |
29 | hw_cpu_sysctl SYSCTL_HANDLER_ARGS | |
30 | { | |
31 | i386_cpu_info_t cpu_info; | |
32 | void *ptr = (uint8_t *)&cpu_info + (uint32_t)arg1; | |
33 | int value; | |
34 | ||
35 | cpuid_get_info(&cpu_info); | |
36 | ||
37 | if (arg2 == sizeof(uint8_t)) { | |
38 | value = (uint32_t) *(uint8_t *)ptr; | |
39 | ptr = &value; | |
40 | arg2 = sizeof(uint32_t); | |
41 | } | |
42 | return SYSCTL_OUT(req, ptr, arg2 ? arg2 : strlen((char *)ptr)+1); | |
43 | return 0; | |
44 | } | |
45 | ||
46 | static int | |
47 | hw_cpu_features SYSCTL_HANDLER_ARGS | |
48 | { | |
49 | i386_cpu_info_t cpu_info; | |
50 | char buf[256]; | |
51 | vm_size_t size; | |
52 | ||
53 | cpuid_get_info(&cpu_info); | |
54 | buf[0] = '\0'; | |
55 | cpuid_get_feature_names(cpu_info.cpuid_features, buf, sizeof(buf)); | |
56 | ||
57 | return SYSCTL_OUT(req, buf, strlen(buf) + 1); | |
58 | } | |
59 | ||
60 | SYSCTL_NODE(_machdep, OID_AUTO, cpu, CTLFLAG_RW, 0, | |
61 | "CPU info"); | |
62 | ||
63 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, vendor, CTLTYPE_STRING | CTLFLAG_RD, | |
64 | (void *)offsetof(i386_cpu_info_t, cpuid_vendor), 0, | |
65 | hw_cpu_sysctl, "A", "CPU vendor"); | |
66 | ||
67 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, brand_string, CTLTYPE_STRING | CTLFLAG_RD, | |
68 | (void *)offsetof(i386_cpu_info_t, cpuid_brand_string), 0, | |
69 | hw_cpu_sysctl, "A", "CPU brand string"); | |
70 | ||
71 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, value, CTLTYPE_INT | CTLFLAG_RD, | |
72 | (void *)offsetof(i386_cpu_info_t, cpuid_value), sizeof(uint32_t), | |
73 | hw_cpu_sysctl, "I", "CPU value"); | |
74 | ||
75 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, family, CTLTYPE_INT | CTLFLAG_RD, | |
76 | (void *)offsetof(i386_cpu_info_t, cpuid_family), sizeof(uint8_t), | |
77 | hw_cpu_sysctl, "I", "CPU family"); | |
78 | ||
79 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, model, CTLTYPE_INT | CTLFLAG_RD, | |
80 | (void *)offsetof(i386_cpu_info_t, cpuid_model), sizeof(uint8_t), | |
81 | hw_cpu_sysctl, "I", "CPU model"); | |
82 | ||
83 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, extmodel, CTLTYPE_INT | CTLFLAG_RD, | |
84 | (void *)offsetof(i386_cpu_info_t, cpuid_extmodel), sizeof(uint8_t), | |
85 | hw_cpu_sysctl, "I", "CPU extended model"); | |
86 | ||
87 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, extfamily, CTLTYPE_INT | CTLFLAG_RD, | |
88 | (void *)offsetof(i386_cpu_info_t, cpuid_extfamily), sizeof(uint8_t), | |
89 | hw_cpu_sysctl, "I", "CPU extended family"); | |
90 | ||
91 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, stepping, CTLTYPE_INT | CTLFLAG_RD, | |
92 | (void *)offsetof(i386_cpu_info_t, cpuid_stepping), sizeof(uint8_t), | |
93 | hw_cpu_sysctl, "I", "CPU stepping"); | |
94 | ||
95 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, feature_bits, CTLTYPE_INT | CTLFLAG_RD, | |
96 | (void *)offsetof(i386_cpu_info_t, cpuid_features), sizeof(uint32_t), | |
97 | hw_cpu_sysctl, "I", "CPU features"); | |
98 | ||
99 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, signature, CTLTYPE_INT | CTLFLAG_RD, | |
100 | (void *)offsetof(i386_cpu_info_t, cpuid_signature), sizeof(uint32_t), | |
101 | hw_cpu_sysctl, "I", "CPU signature"); | |
102 | ||
103 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, brand, CTLTYPE_INT | CTLFLAG_RD, | |
104 | (void *)offsetof(i386_cpu_info_t, cpuid_brand), sizeof(uint8_t), | |
105 | hw_cpu_sysctl, "I", "CPU brand"); | |
106 | ||
107 | #if 0 | |
108 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, model_string, CTLTYPE_STRING | CTLFLAG_RD, | |
109 | (void *)offsetof(i386_cpu_info_t, model_string), 0, | |
110 | hw_cpu_sysctl, "A", "CPU model string"); | |
111 | #endif | |
112 | ||
113 | SYSCTL_PROC(_machdep_cpu, OID_AUTO, features, CTLTYPE_STRING | CTLFLAG_RD, | |
114 | 0, 0, | |
115 | hw_cpu_features, "A", "CPU feature names"); | |
116 | ||
117 | ||
118 | struct sysctl_oid *machdep_sysctl_list[] = | |
119 | { | |
120 | &sysctl__machdep_cpu, | |
121 | &sysctl__machdep_cpu_vendor, | |
122 | &sysctl__machdep_cpu_brand_string, | |
123 | &sysctl__machdep_cpu_value, | |
124 | &sysctl__machdep_cpu_family, | |
125 | &sysctl__machdep_cpu_model, | |
126 | &sysctl__machdep_cpu_extmodel, | |
127 | &sysctl__machdep_cpu_extfamily, | |
128 | &sysctl__machdep_cpu_feature_bits, | |
129 | &sysctl__machdep_cpu_stepping, | |
130 | &sysctl__machdep_cpu_signature, | |
131 | &sysctl__machdep_cpu_brand, | |
132 | &sysctl__machdep_cpu_features, | |
133 | (struct sysctl_oid *) 0 | |
134 | }; | |
135 |