Annotation of embedaddon/nginx/src/core/ngx_cpuinfo.c, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * Copyright (C) Igor Sysoev
                      4:  * Copyright (C) Nginx, Inc.
                      5:  */
                      6: 
                      7: 
                      8: #include <ngx_config.h>
                      9: #include <ngx_core.h>
                     10: 
                     11: 
                     12: #if (( __i386__ || __amd64__ ) && ( __GNUC__ || __INTEL_COMPILER ))
                     13: 
                     14: 
                     15: static ngx_inline void ngx_cpuid(uint32_t i, uint32_t *buf);
                     16: 
                     17: 
                     18: #if ( __i386__ )
                     19: 
                     20: static ngx_inline void
                     21: ngx_cpuid(uint32_t i, uint32_t *buf)
                     22: {
                     23: 
                     24:     /*
                     25:      * we could not use %ebx as output parameter if gcc builds PIC,
                     26:      * and we could not save %ebx on stack, because %esp is used,
                     27:      * when the -fomit-frame-pointer optimization is specified.
                     28:      */
                     29: 
                     30:     __asm__ (
                     31: 
                     32:     "    mov    %%ebx, %%esi;  "
                     33: 
                     34:     "    cpuid;                "
                     35:     "    mov    %%eax, (%1);   "
                     36:     "    mov    %%ebx, 4(%1);  "
                     37:     "    mov    %%edx, 8(%1);  "
                     38:     "    mov    %%ecx, 12(%1); "
                     39: 
                     40:     "    mov    %%esi, %%ebx;  "
                     41: 
                     42:     : : "a" (i), "D" (buf) : "ecx", "edx", "esi", "memory" );
                     43: }
                     44: 
                     45: 
                     46: #else /* __amd64__ */
                     47: 
                     48: 
                     49: static ngx_inline void
                     50: ngx_cpuid(uint32_t i, uint32_t *buf)
                     51: {
                     52:     uint32_t  eax, ebx, ecx, edx;
                     53: 
                     54:     __asm__ (
                     55: 
                     56:         "cpuid"
                     57: 
                     58:     : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (i) );
                     59: 
                     60:     buf[0] = eax;
                     61:     buf[1] = ebx;
                     62:     buf[2] = edx;
                     63:     buf[3] = ecx;
                     64: }
                     65: 
                     66: 
                     67: #endif
                     68: 
                     69: 
                     70: /* auto detect the L2 cache line size of modern and widespread CPUs */
                     71: 
                     72: void
                     73: ngx_cpuinfo(void)
                     74: {
                     75:     u_char    *vendor;
                     76:     uint32_t   vbuf[5], cpu[4], model;
                     77: 
                     78:     vbuf[0] = 0;
                     79:     vbuf[1] = 0;
                     80:     vbuf[2] = 0;
                     81:     vbuf[3] = 0;
                     82:     vbuf[4] = 0;
                     83: 
                     84:     ngx_cpuid(0, vbuf);
                     85: 
                     86:     vendor = (u_char *) &vbuf[1];
                     87: 
                     88:     if (vbuf[0] == 0) {
                     89:         return;
                     90:     }
                     91: 
                     92:     ngx_cpuid(1, cpu);
                     93: 
                     94:     if (ngx_strcmp(vendor, "GenuineIntel") == 0) {
                     95: 
                     96:         switch ((cpu[0] & 0xf00) >> 8) {
                     97: 
                     98:         /* Pentium */
                     99:         case 5:
                    100:             ngx_cacheline_size = 32;
                    101:             break;
                    102: 
                    103:         /* Pentium Pro, II, III */
                    104:         case 6:
                    105:             ngx_cacheline_size = 32;
                    106: 
                    107:             model = ((cpu[0] & 0xf0000) >> 8) | (cpu[0] & 0xf0);
                    108: 
                    109:             if (model >= 0xd0) {
                    110:                 /* Intel Core, Core 2, Atom */
                    111:                 ngx_cacheline_size = 64;
                    112:             }
                    113: 
                    114:             break;
                    115: 
                    116:         /*
                    117:          * Pentium 4, although its cache line size is 64 bytes,
                    118:          * it prefetches up to two cache lines during memory read
                    119:          */
                    120:         case 15:
                    121:             ngx_cacheline_size = 128;
                    122:             break;
                    123:         }
                    124: 
                    125:     } else if (ngx_strcmp(vendor, "AuthenticAMD") == 0) {
                    126:         ngx_cacheline_size = 64;
                    127:     }
                    128: }
                    129: 
                    130: #else
                    131: 
                    132: 
                    133: void
                    134: ngx_cpuinfo(void)
                    135: {
                    136: }
                    137: 
                    138: 
                    139: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>