From: Nikita Popov Date: Thu, 3 Jan 2019 09:24:48 +0000 (+0100) Subject: Possible fix for bug #77357 X-Git-Tag: php-7.3.2RC1~55 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a361c3a54c055cdf7088e76aa8efa159334e096;p=php Possible fix for bug #77357 Don't invoke CPUID with feature levels above the supported maximum. In this case CPUID will return the highest supported basic information leaf, which will have unrelated bits in the relevant positions. --- diff --git a/Zend/zend_cpuinfo.c b/Zend/zend_cpuinfo.c index ea1f08f948..4cbd2ac776 100644 --- a/Zend/zend_cpuinfo.c +++ b/Zend/zend_cpuinfo.c @@ -77,16 +77,24 @@ void zend_cpu_startup(void) { if (!cpuinfo.initialized) { zend_cpu_info ebx; + int max_feature; cpuinfo.initialized = 1; __zend_cpuid(0, 0, &cpuinfo); - if (cpuinfo.eax == 0) { + max_feature = cpuinfo.eax; + if (max_feature == 0) { return; } + __zend_cpuid(1, 0, &cpuinfo); + /* for avx2 */ - __zend_cpuid(7, 0, &ebx); - cpuinfo.ebx = ebx.ebx; + if (max_feature >= 7) { + __zend_cpuid(7, 0, &ebx); + cpuinfo.ebx = ebx.ebx; + } else { + cpuinfo.ebx = 0; + } } }