Вот и сбылось предсказание, что будут попадаться другие инструкции из огромного списка, которые сложнее отслеживать. На данный момент встречаются как минимум две команды:
0x0FAEE8 - lfence 0xF30FE6 - cvtdq2pd
Хотя по-нормальному надо делать сканер всех команд, готового я пока не нашёл.
simplix
Нормальных сканеров нет, они могут ложно определять коды инструкций в блоках данных (например в строках, которые содержатся в коде). Нужно полное дизассемблирование.
Вобщем надо все бинарники, собранные на VC12, сразу помечать, как требующие SSE2. Разработчики-индусы не отключают в настройках проекта VC12 генерацию SSE2-кода, скорее всего они даже не догадываются об этом.
Отредактировано WAJIM (11.01.2019 12:13:47)
Да 3 месяца уже осталось до конца.
В общем со сканером стало ещё чудесатее - оказывается многие старые обновления тоже должны работать только с SSE2, а их WU всегда предлагало на все процессоры. Например старющее KB909520, basecsp.dll - 12F45: cvttsd2si; там же рядом три файла с movapd. И таких обновлений десятки, кроме уже исключённых.
После тщательной сортировки у меня получилось следующее.
Уже отмечены в наборе, как требующие SSE2:
KB4034775
KB4340937
KB4343674
KB4458000
KB4458006
KB4462987
KB4473077
Требуют SSE2, но сейчас устанавливаются на все процессоры:
KB909520
KB942288-v3
KB951978
KB956572
KB969084
KB2659262
KB2813347-v2
KB2834886
KB2957503
KB3013126
KB3029944
KB3035132
KB3065979
KB3078601
KB3145739
KB3178034
KB3191203
KB4012583
KB4015383
KB4019276
KB4039384
KB4089082
KB4339291
KB4459091
KB4466388
KB4467689
KB4481275
simplix сообщает:
KB909520, basecsp.dll - 12F45: cvttsd2si;
Там вначале cpuid проверяется и взводится флаг, если поддерживаются соответствующие инструкции. В дальнейшем флаг анализируется, и выполняется одна из двух веток кода - с поддержкой инструкций и без.
В проверке cpuid также осуществляется сравнение со строчкой "AuthenticAMD".
Что может являться признаком наличия такой проверки.
Отредактировано YDean (11.01.2019 17:31:46)
YDean
Верно, сначала вызывается инструкция cpuid и опознается процессор.
Потом ветки SSE2/не-SSE2 разделяются по проверке: cmp d,[000415A6C],0. Молодцы, оптимизировали же код в свое время...
Отредактировано WAJIM (11.01.2019 19:46:52)
YDean
Спасибо, это ценная информация, и икебана сложилась. Вот что у меня вышло по итогу:
+KB909520
+KB942288-v3
+KB951978
KB956572 - v7.10
+KB969084
+KB2659262
+KB2813347-v2
+KB2834886
+KB2957503
+KB3013126
+KB3029944
+KB3035132
+KB3065979
+KB3078601
+KB3145739
+KB3178034
+KB3191203
+KB4012583
+KB4015383
KB4019276 - v7.10
KB4034775 - v12
+KB4039384
+KB4089082
KB4339291 - v7.10
+KB4340937
+KB4343674
+KB4458000
KB4458006 - v12
KB4459091 - v7.10
+KB4462987
KB4466388 - v7.10
KB4467689 - v7.10
+KB4473077
KB4481275 - v12
Здесь "+" отмечены обновления (со всеми файлами), в которых я нашёл процедуру проверки инструкций. Причём процедура есть даже в тех обновлениях, которые мы исключали раньше, поэтому их я добавлю для установки на все процессоры. Остальные обновления, где я не нашёл процедуру, отмечены версией линкера, причём v7.10 тоже не требуют SSE2, учитывая их старость и сам компилятор. Остаётся всего три обновления с v12, в которых нет проверки и есть инструкции SSE2. К тому же, о KB4034775 раньше был отчёт о сбое.
P. S. Список литературы для истории: Intrinsics Guide, SSE2 instructions.
simplix
Проверка cpuid не дает гарантии, что в коде есть ветки для не-SSE2 вариантов, надо дизассемблировать и проверять вручную.
Вы же не проверяли xpsp2res.dll ? Там кода нет, только ресурсы.
Добавьте для KB4481275 условие наличия SSE2 и пока больше ничего не меняйте в скрипте в плане SSE2. Если у кого-то будут проблемы - напишет.
Отредактировано WAJIM (11.01.2019 20:13:19)
WAJIM
Я искал не только проверку cpuid, но и другие инструкции, плюс выборочно проверял чтобы были две ветки инструкций. Единственное что пока не понял до конца, это почему в обновлениях с линкером v7.10 вообще нет проверки cpuid и других аналогичных проверок. Но, учитывая что они старые и раньше мы их не исключали, эти можно оставить.
UpdatePack-XPSP3-Rus Live 19.1.11 (заменяет 19.1.10)
• Добавлен KB4480965 из Windows XP Embedded (IE8, заменяет KB4470199)
• Добавлен KB4481275 из Windows XP Embedded (заменяет KB4463573)
• Adobe Flash 32.0.0.114 ActiveX & Plugin
Внесены все необходимые корректировки по проверке SS2.
Подскажите, новые методы https шифрования включаются в каком нибудь из обновлений? Смутно припоминаю, что была про них информация, но, к примеру, попался мне сайт maps-for-free.com, который IE 8 не берет. Или помимо обновления там еще в реестре что то нужно включать?
$DR@GON$
Конечно, без SSE2 ищите версию 29.0.0.171.
Отредактировано WAJIM (13.01.2019 17:46:13)
Установил 19.1.11 на ПК с р3. Перестал работать Ping Plotter.
Установились, судя по логу, 4340937, 4343674, 4458000, 4462987, 4473077. Они вроде бы тут выше указаны как обновления для машин с SSE2. Похоже, в алгоритм определения проца влезла какая-то ошибка.
Да, и винрар не работает. Сейчас буду откатывать.
ps. Откатил, заработали программы. Конкретно это было из-за 4343674 (mf3216.dll).
Отредактировано alexey65536 (14.01.2019 08:31:15)
alexey65536
Спасибо, пересмотрю эти файлы. Извините за временные неудобства, но лучше перепробовать на практике, чем оставался бы шанс, что нужные обновления не установлены. К тому же в этом нет ничего критичного, т. к. на загрузку системы эти обновления не влияют, бекапы создаются, а набор я делаю таким образом, чтобы новая версия автоматически удаляла несовместимые обновления.
simplix
А по итогу всего вышесказанного и новых "исследований" можно будет опубликовать список всех обновлений требующих SSE2?
alexey65536
Слушайте, ну я не вижу в KB4343674\mf3216.dll инструкций SSE2 и линкер там v7.10. Более новая версия этого же файла есть в KB4458000, там всё так же. Вы определили это обновление только удалением? Хотелось бы взглянуть на скриншоты ошибок (если есть) и системные логи во время возникновения проблем, а если сможете запустить TeamViewer - будет идеально. Не исключено, что здесь какая-то проблема, не связанная с SSE2.
APavs
На этой же странице список с отметками "v12".
Определил удалением.
У вас нет отдельного 4343674, чтобы снова всю пачку не ставить?
Вот сообщение от винрара:
Ошибка приложения winrar.exe, версия 5.61.0.0, модуль gdiplus.dll, версия 5.2.6002.24439, адрес 0x0007b374. Информация события: 0000 41 70 70 6C 69 63 61 74 69 6F 6E 20 46 61 69 6C Application Fail 0010 75 72 65 20 20 77 69 6E 72 61 72 2E 65 78 65 20 ure winrar.exe 0020 35 2E 36 31 2E 30 2E 30 20 69 6E 20 67 64 69 70 5.61.0.0 in gdip 0030 6C 75 73 2E 64 6C 6C 20 35 2E 32 2E 36 30 30 32 lus.dll 5.2.6002 0040 2E 32 34 34 33 39 20 61 74 20 6F 66 66 73 65 74 .24439 at offset 0050 20 30 30 30 37 62 33 37 34 0D 0A 0007b374..
А у пингплоттера там собственное окно вылазит, в общий лог это не идет.
Отредактировано alexey65536 (14.01.2019 12:42:49)
Спасибо, пока ставить не нужно. Из сообщения видно, что проблема в gdiplus.dll, а не mf3216.dll. Как и предполагал WAJIM, это именно тот случай, когда SSE2-инструкция выполняется без проверки на возможности процессора (проверил), хотя первая по коду инструкция cvttsd2si (1bb5e) имеет такую проверку.
Я поднял еще один дровяной комп с п3, если нужно будет что-то делать по удаленке - можно попробовать.
simplix
Это потому, что инструкцию lfence вставляли в код вручную, она необходима для защиты от Spectre. Делать это опционально, в зависимости от наличия SSE2, индусы не захотели.
UpdatePack-XPSP3-Rus Live 19.1.14
Итог: указанные выше обновления снова не будут устанавливаться на процессоры без SSE2, т. к. там везде есть lfence без проверок. Дополнительно прошёлся по всем обновлениям, чтобы убедиться, что только у этих линкер v12, все остальные имеют более низкие версии, так что это самый простой признак. Также без SSE2 будут устанавливаться ближайшие заменённые обновления, лучше так, чем никак (их всего пару штук).