Annotation of embedaddon/nginx/src/core/ngx_cpuinfo.c, revision 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>