Почему поведение SMM отличается между firststeps.simics и qsp-клиент-core.simics?

#simics

Вопрос:

Если я установлю точку SMM останова firststeps.simics и проверю регистры, она покажет ожидаемое RIP = 0x8000 и CS base = 0x30000 . Но если я сделаю то же самое qsp-client-core.simics , это покажет RIP = 0xdffebe74 и CS base = 0 , и я не понимаю, почему.

В конце концов я вижу SMBASE , как переходят от 0x30000 к 0xdffcd000 . Но , похоже, то, что говорится в руководстве по чипсету X58 TSeg , не устанавливается на то же значение, которое я ожидал бы. Есть идеи, почему TSeg это никогда не устанавливается?

 simicsgt; print -x %msr_ia32_smbase 0xdffcd000 simicsgt; get-device-offset board.mb.nb.core_misc.bank.pci_config 0xA8 4 0 (LE)  

(Примечание: я протестировал это на платформах до skylake, и, похоже, это происходит только на coffee lake, что по qsp-client-core.simics умолчанию)

Ответ №1:

Я только что попробовал firststeps.simics и вижу, что обработчик smm также перемещен. smm_base находится 0x30000 на первой записи, но 0xdffd3000 почти сразу меняется на:

 $ ./simics targets/qsp-x86/qsp-client-core.simics simicsgt; output-radix 16 simicsgt; board.mb.cpu0.core[0][0]-gt;smm_base 0x30000 simicsgt; continue-seconds 30 simicsgt; board.mb.cpu0.core[0][0]-gt;smm_base 0xdffd3000  

Вы также можете ясно видеть это из журналов:

 simicsgt; board.mb.cpu0.core[0][0].log-group -disable MSR board.mb.cpu0.core[0][0]:  enabled log groups: "Intermediate code" "Performance hint" "Other" "VMX" "Hardware breakpoints" "Pin change" "FPU" "Exception" "VM-monitor" "MONITOR" "X86 other" "Default_Log_Group"  disabled log groups: "MSR" simicsgt; board.mb.cpu0.core[0][0].log-level 2 [board.mb.cpu0.core[0][0]] Changing log level: 1 -gt; 2 simicsgt; log-setup -time-stamp  simicsgt; c [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0x83939a 388559012} IA32_FEATURE_CONTROL set to 0x5 [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdf353932 388714533} Cache flush (with write-back) [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdf353987 388714952} Cache flush (with write-back) [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdf353932 388781185} Cache flush (with write-back) [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdf353987 388781604} Cache flush (with write-back) [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdf5765f5 389274426} Cache flush (with write-back) [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdf57664a 389274845} Cache flush (with write-back) [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdef5ed20 393668159} Cache flush (with write-back) [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdef5ecf0 393668269} Cache flush (with write-back) [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdffebe6e 397678713} SMI raised [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdffe43a9 397679321} New SMM base: 0xdffd3000 [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdefc3471 398242965} SMI raised [board.mb.cpu0.core[0][0] info] {board.mb.cpu0.core[0][0] 0xdefc3471 403646564} SMI raised  

Как вы можете видеть, первый вызов обработчика SMM изменяет smm_base, что довольно типично.

Я не знаю, Tseg но, надеюсь, я хотя бы частично ответил на ваш вопрос.