Коллеги, трабла, с которой я столкнулся сегодня из разряда необъяснимых. Команда push fs(gs) согласно манов "If the source operand is the FS or GS and its size is less than the address size of the stack, the zero-extended value is pushed on the stack" Собственно пару недель назад так и было, я тогда как раз заинтересовался нюансами push/pop, поэтому и обратил внимание. Однако сегодня на моей машине это не работает. Теперь push fs(gs) апдейтит только младшее слово в стеке,старшее не изменятся(т.е. работает так же,как и push cs(ds,ss,es)). Не имеет значения в какой среде выполняется код - винда,реалмод, чистая протмода без ОС, unreal, ринг0/3 - везде такая же хрень. В общем как ни крути, проц стал выполнять команду push fs по другому, чем 2 недели назад. За полдня мне это просто разорвало мозг. В чудеса как бы верить не хочется. Из объяснений мне пришло на ум только два, оба фантастические 1) Засбоил проц. Причем именно на этой команде. Других отклонений не наблюдалось. Не верится. 2) В БИОСе прописался триппер, который при каждой загрузке апдейтит микрокод проца.Этот апдейт меняет логику команды. В это верится еще меньше. Других разумных и вероятных объяснений не вижу. ЗЫ. Пытаюсь щас исключить второй вариант, путем собственного апдейта микрокода на заведомо валидный. Однако нашел только файло для апдейта микрокода под линукс. Там какая-то мутная структура, понять под какой проц какой кусок я пока не могу. Подскажите плиз
Но блин, обнулялось же... И должно обнуляться - пустите код под варей или борщом, если манам не верите.
medstrax1 Да верю я документации... А ещё верю в баги... Но больше всего верю, что сейчас может прийти кто-нибудь вроде leo и сказать, что в томе 3C на 666-й странице есть сноска, где мелким шрифтом написано, что с такой-то модели поведение push fs/gs изменилось. P.S. Проверил под VMWare... аналогично: старшее слово не обнуляется. С чего бы Bochs верить больше, чем документации, не понимаю. P.P.S. Процессор — Intel Core 2 Duo P7350.
Да, похоже ситуация усугубляется. На моем П4 варя старшее слово обнуляет. ЗЫ. Даже если на какой то странице талмуда появится некая сноска, мой проц об этом не знает. Но раньше обнулял, а теперь не хочет. Поправки на галлюцинации и прочие измененные состояния сознания не принимаются )))) ЗЗЫ. Какая варя стоит? У меня 7.0.1 build-227600
В общем понятно, что дело не в варе. Прошу кому не лень протестите плиз код push ds pop gs mov [esp-4],12345678h push gs pop eax shr eax,16 cmp ax,1234h jnz No_Error ; т.е. согласно манам ;здесь значит косяк
Мы в legacy\compatibility на P4 и Core2 встречали лишь отсутствие изменения верхней половины. При этом в подрежиме x64 верняя половина стабильно обнулялась (точнее, обнулялись верхние 3/4). Вот здесь было немного насчёт этого – и ошибки необнуления кажутся незначительными на фоне вывода о сохранении по "push xs" части дескрипторного кеша.
Насколько я понял, вывод о сохранении на стеке части кэша дескриптора как минимум в отдельных случаях ошибочен. Мне воспроизвести не удалось. Собственно речь не об этом. Почему у меня щас проц работает иначе, чем две недели назад!? - вот что убивает. Я впервые за многие годы сталкиваюсь с тем, чего не понимаю напрочь. Блин аж материться хочеццо. Ну не хочется верить в каких-то суперхакеров, которые взломали интеловскую прошивку микрокода и сейчас налаживают ботнет....
Сохранение сегментных регистров в стек действительно идет без обнуления старшего WORD-а и варь тут непричем.
Sol_Ksacap Это вы про что? Using the PUSH CS, PUSH DS, PUSH ES, or PUSH SS instructions in 64-bit mode generates an invalid-opcode exception.
при выделении нового места в том числе и в стеке, это место при выделении обнуляется. а при переюзывании этого не делается. может в этом все дело?
Дык кто бы спорил, но сохранение fs и gs _шло_ с обнулением. Я глазам верю. И талмуды здесь не думаю что врут на 100%, скорей всего какие то нюансы просто обошли стороной
Нет, пару недель назад проверял и эту возм-ть. В любом случае шло обнуление старших 16 бит. Сейчас я это обнуление не могу воспроизвести ну вообще никак. Это называется пи.ц, руки опускаются.
medstrax1 Так CrystalIC же написал, что на P4 HT поведение инструкции нестабильно. Как раз может быть Ваш случай.
Кристалег бывает прав, но не думаю что в этом случае. Нестабильное поведение любой из инструкций общего назначения в интеловских процах давно бы вызвало немало шума. И на продажах интела тоже бы отразилось неслабо. Этого нет. Вывод - фича не в команде. ЗЫ. Рыл на интеловском комьюнити тоже ноль эмоций
medstrax1 Да ладно... Там дамп приведен. Попушить немного fs на стек — не та задача, с которой кто-либо мог бы справиться как-то не так (с учётом того, что он подтверждает, что изначально в стеке нули). Может там и не дескрипторный кэш, но явно видно, что поведение нестабильно. А шум... да с чего бы его поднимать? Инструкция используется нечасто. А когда используется, то всех почти всегда интересует только младшее слово.