]> granicus.if.org Git - php/commitdiff
Fixed bug #76825 (Undefined symbols ___cpuid_count)
authorXinchen Hui <laruence@gmail.com>
Tue, 4 Sep 2018 09:26:46 +0000 (17:26 +0800)
committerXinchen Hui <laruence@gmail.com>
Tue, 4 Sep 2018 09:26:46 +0000 (17:26 +0800)
NEWS
Zend/Zend.m4
Zend/zend_cpuinfo.c

diff --git a/NEWS b/NEWS
index 10bfe1edcfa8d6b8515506becac816f9bb36dc2e..f9dfe553b15439cbcec377dd5eb4a549fa2f5734 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ PHP                                                                        NEWS
 ?? ??? ????, PHP 7.3.0RC1
 
 - Core:
+  . Fixed bug #76825 (Undefined symbols ___cpuid_count). (Laruence)
   . Fixed bug #76820 (Z_COPYABLE invalid definition). (mvdwerve, cmb)
 
 - intl:
index 8d5cfe53725d688734f468dc37c11fa10c7a367d..20dd0f9a39cd6397defb30206249ac0e7e60e41d 100644 (file)
@@ -58,6 +58,7 @@ sys/time.h \
 signal.h \
 unix.h \
 stdlib.h \
+cpuid.h \
 dlfcn.h)
 
 AC_TYPE_SIZE_T
index 39519c4c1660f2338a234d0b799a8ff57da999a3..ffa370416dc4c4eb5b527c81e7ff0a45a7d59118 100644 (file)
@@ -29,10 +29,20 @@ typedef struct _zend_cpu_info {
 static zend_cpu_info cpuinfo = {0};
 
 #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
-#include <cpuid.h>
+# ifdef HAVE_CPUID_H
+# include <cpuid.h>
 static void __zend_cpuid(uint32_t func, uint32_t subfunc, zend_cpu_info *cpuinfo) {
        __cpuid_count(func, subfunc, cpuinfo->eax, cpuinfo->ebx, cpuinfo->ecx, cpuinfo->edx);
 }
+# else
+static void __zend_cpuid(uint32_t func, uint32_t subfunc, zend_cpu_info *cpuinfo) {
+       __asm__ __volatile__ (
+               "cpuid"
+               : "=a"(cpuinfo->eax), "=b"(cpuinfo->ebx), "=c"(cpuinfo->ecx), "=d"(cpuinfo->edx)
+               : "a"(func), "c"(subfunc)
+       );
+}
+# endif
 #elif defined(ZEND_WIN32) && !defined(__clang__)
 # include <intrin.h>
 static void __zend_cpuid(uint32_t func, uint32_t subfunc, zend_cpu_info *cpuinfo) {