В процессе выполнения исследований на платформе Kaby Lake обнаружены проблемы с корректным выполнением предыдущей версии UEFImark EBC Edition. Для выхода из создавшейс яситуации добавлена поддержка ACPI с целью детектирования ACPI-таблицы MCFG (PCI memory mapped configuration space) и получения из нее количества шин PCI (параметр хранится в виде номера последней шины, то есть количество шин минус 1).

Теоретические предпосылки

Несмотря на то, что сканирование шины PCI в UEFImark EBC Edition выполняется посредством PCI Root Bridge I/O Protocol (RBIO), и прямое обращение к диапазону MCFG в данном случае не выполняется (в отличие от UEFImark x64), существует вероятность того, что процедура RBIO при получении на вход недопустимого номера шины, не выполнит входной контроль параметров и отработает транзакцию по адресу, соответствующему неверному номеру шины. Статус RBIO не является надежным ограничителем номера шины.

В частности, если базовый адрес MCFG Base установлен в F0000000h, незаконное сканирование распространяется на диапазон доступа к Flash ROM и другие memory-mapped ресурсы, не от­но­ся­щи­еся к ди­а­па­зо­ну MCFG. Сканирование всех 256 шин 00h-FFh соответствует адресации 256 MB F0000000h — FFFFFFFFh. Если размер диапазона MCFG менее 256 MB, это может привести к та­ким последствиям:

  • Нарушение работы ресурсов, находящихся выше диапазона MCFG в том же 256 MB блоке, и как следствие, нарушению работы платформы.
  • Обнаружению несуществующих устройств при сканировании PCI и как следствие, нарушению работы программы.

Основные модификации

  • При старте добавлен шаг: Detect ACPI. Детектируется таблица MCFG и читается номер последней шины PCI. Устанавливается лимит, переменная Last_PCI_Bus.
  • Подпрограмма сканирования PCI (PCI_Scan_Class) использует ограничение количества шин, на основании значения лимита, полученного из таблицы MCFG, использует переменную Last_PCI_Bus.

Доступность UEFImark EBC Edition

Загрузить утилиту UEFImark EBC Edition, v0.24 можно с нашего сайта по этой ссылке.


20.01.2018