annotate src/core/ngx_cpuinfo.c @ 166:fef68f68bcfd NGINX_0_3_30

nginx 0.3.30 *) Change: the ECONNABORTED error log level was changed to "error" from "crit". *) Bugfix: the ngx_http_perl_module could not be build without the ngx_http_ssi_filter_module. *) Bugfix: nginx could not be built on i386 platform, if the PIC was used; bug appeared in 0.3.27.
author Igor Sysoev <http://sysoev.ru>
date Wed, 22 Feb 2006 00:00:00 +0300
parents 73e8476f9142
children d2ae1c9f1fd3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 #include <ngx_config.h>
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 #include <ngx_core.h>
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11 #if (( __i386__ || __amd64__ ) && ( __GNUC__ || __INTEL_COMPILER ))
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 static ngx_inline void ngx_cpuid(uint32_t i, uint32_t *buf);
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16
166
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
17 #if ( __i386__ )
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
18
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
19 static ngx_inline void
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
20 ngx_cpuid(uint32_t i, uint32_t *buf)
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
21 {
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
22
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
23 /*
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
24 * we could not use %ebx as output parameter if gcc builds PIC,
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
25 * and we could not save %ebx on stack, because %esp is used,
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
26 * when the -fomit-frame-pointer optimization is specified.
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
27 */
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
28
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
29 __asm__ (
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
30
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
31 " mov %%ebx, %%esi; "
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
32
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
33 " cpuid; "
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
34 " mov %%eax, %0; "
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
35 " mov %%ebx, %1; "
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
36 " mov %%edx, %2; "
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
37 " mov %%ecx, %3; "
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
38
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
39 " mov %%esi, %%ebx; "
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
40
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
41 : "=m" (buf[0]), "=m" (buf[1]), "=m" (buf[2]), "=m" (buf[3])
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
42 : "a" (i)
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
43 : "ecx", "edx", "esi" );
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
44 }
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
45
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
46
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
47 #else /* __amd64__ */
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
48
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
49
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50 static ngx_inline void
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 ngx_cpuid(uint32_t i, uint32_t *buf)
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52 {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 uint32_t eax, ebx, ecx, edx;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 __asm__ (
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 "cpuid"
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (i) );
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 buf[0] = eax;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62 buf[1] = ebx;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 buf[2] = edx;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 buf[3] = ecx;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67
166
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
68 #endif
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
69
fef68f68bcfd nginx 0.3.30
Igor Sysoev <http://sysoev.ru>
parents: 160
diff changeset
70
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
71 /* auto detect the L2 cache line size of modern and widespread CPUs */
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
72
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
73 void
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
74 ngx_cpuinfo(void)
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
75 {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
76 u_char *vendor;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
77 uint32_t vbuf[5], cpu[4];
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
78
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
79 vbuf[0] = 0;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
80 vbuf[1] = 0;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
81 vbuf[2] = 0;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
82 vbuf[3] = 0;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
83 vbuf[4] = 0;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
84
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
85 ngx_cpuid(0, vbuf);
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
86
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
87 vendor = (u_char *) &vbuf[1];
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
88
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
89 if (vbuf[0] == 0) {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
90 return;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
91 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
92
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
93 ngx_cpuid(1, cpu);
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
94
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
95 if (ngx_strcmp(vendor, "GenuineIntel") == 0) {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
96
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
97 switch (cpu[0] & 0xf00) {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
98
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
99 /* Pentium */
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
100 case 5:
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
101 /* Pentium Pro, II, III */
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
102 case 6:
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
103 ngx_cacheline_size = 32;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
104 break;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
105
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
106 /*
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
107 * Pentium 4, although its cache line size is 64 bytes,
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
108 * it prefetches up to two cache lines during memory read
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
109 */
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
110 case 15:
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
111 ngx_cacheline_size = 128;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
112 break;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
113 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
114
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
115 } else if (ngx_strcmp(vendor, "AuthenticAMD") == 0) {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
116 ngx_cacheline_size = 64;
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
117 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
118 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
119
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
120 #else
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
121
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
122
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
123 void
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
124 ngx_cpuinfo(void)
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
125 {
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
126 }
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
127
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
128
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
129 #endif