Skip to content

elvees/mcom03-sbl

Repository files navigation

Secondary Bootloader (SBL)

Компоненты

SBL-XIP

SBL-XIP выполняется на RISC0 из QSPI0 в режиме XIP (загрузка напрямую из QSPI0).

SBL-XIP выполняет:

  • копирование кода инициализации DDR из QSPI0 в SPRAM0;
  • запуск кода инициализации DDR из SPRAM0 (инициализатор DDR должен вернуть управление SBL после завершения работы);
  • копирование DTB из QSPI0 в DDR;
  • копирование TF-A из QSPI0 в DDR;
  • копирование TEE из QSPI0 в DDR (опционально);
  • копирование U-Boot из QSPI0 в DDR;
  • запуск TF-A на ARM CPU.

Скрипты сборки проекта позволяют собирать SBL-XIP для нескольких плат за один вызов Cmake.

Для сборки SBL-XIP рецепту сборки должна быть передана CMake-переменная IMAGES_PATH, содержащая путь к требуемым для сборки бинарным файлам в том виде, в котором их собирает Buildroot. То есть, директория должна иметь следующую структуру:

  • ./<ddrinit_1>/ddrinit.bin
  • ./<ddrinit_2>/ddrinit.bin
  • ./uboot-dtb/<dtb_name_1>.dtb
  • ./uboot-dtb/<dtb_name_2>.dtb
  • ./u-boot.bin
  • ./bl31.bin
  • ./bl32.bin (необязательно)

Также рецепту сборки должна быть передана переменная DDRINIT_DTB_MAP, содержащая пары ddrinit-DTB для включения в образ SBL-XIP. Переменная должна иметь следующий формат: <ddrinit1>:<dtb1> <ddrinit2>:<dtb2> ....

Результатом сборки SBL-XIP является набор образов для всех переданных пар ddrinit и DTB с именами следующего формата: sbl-xip-<dtb>.bin.

SBL-S1

BootROM последовательно загружает и передаёт управление на образы. Цепочка образов упаковывается в проприетарный формат SBIMG.

SBL-S1 (stage 1) предназначен для начальной настройки микросхемы и должен выполняться первым в цепочке загрузки.

Note

Полная цепочка загрузки посредством BootROM еще не реализована.

SBL-S1 выполняется на RISC0 из SPRAM0. Может быть загружен c помощью BootROM или через JTAG.

SBL-S1 выполняет:

  • настройку частот системного коммутатора;
  • настройку регистров уровня TOP;
  • настройку cлужебной подсистемы;
  • настройку WDT0 с таймаутом 3с;

SBL-S2

Является частью цепочки загрузки с помощью BootROM.

Отвечает за: * настройку контуров безопасности; * проверку загружаемых образов;

SBL-S3

Является частью цепочки загрузки с помощью BootROM.

Отвечает за: * настройку частот и запуск ПО ARM CPU (entry point TF-A BL31); * предоставляет набор сервисов работающих через mailbox:

  • cервис управления WDT;
  • сервис настройки базовых адресов подсистем/устройств GPU, HSPERIPH, ...;

Уровни доступа к памяти

Warning

Этот документ не является достоверным. Описанные свойства могут не поддерживаться в ПО или поддерживаться не так как описано в документе. Свойства могут измениться при финальной реализации или быть не реализованы совсем.

Для ведущих и ведомых устройств на внутрикристальных шинах (AXI) назначаются уровни доступа:

  • trusted,
  • sdr,
  • secure,
  • non-secure.

Ведущий с более высоким уровнем (например, sdr) может обращаться к ведомому с равным или более низким уровнем доступа (например, sdr, secure, non-secure).

После начала работы некоторым адресным диапазонам можно понизить уровень доступа.

ARM CPU при работе в режиме TrustZone отправляет транзакции secure, при работе в обычном режиме non-secure.

Настройка уровней доступа к адресным диапазонам (в том числе регионам DDR) выполняется в регистрах системного коммутатора.

Карта памяти в режиме загрузки BootROM QSPI0

Доступ к DDR памяти осуществляется через два диапазона в физической карте памяти – DDR Low и DDR High.

DDR Low

Диапазон DDR Low предназначен для использования доверенными средами исполнения в доверенном контуре (RISC0) и приложениями связного (SDR) контура.

0x8000_0000  +------------------+
             | RISC0 VMMU table |
0x8000_3000  +------------------+
             |     SBL-S3       |
             +------------------+
             |       ...        |
0x87C0_0000  +------------------+
             |    bootstage     |
0x8800_0000  +------------------+
             |     SBL-S2       |
             +------------------+
             |       ...        |
0x8FFF_FFFF  +------------------+
             |     Reserved     |
0xFFFF_FFFF  +------------------+

Память инициализируется только для доверенного контура, один или два диапазона размером 256 MiB, в зависимости задействован ли DDRMC1:

  • DDR Low Trusted 0 0x8000_0000 - 0x8FFF_FFFF.
  • DDR Low Trusted 1 0xC000_0000 - 0xCFFF_FFFF.

Диапазон DDR Low Trusted 1 используется в качестве виртуальной памяти для трансляции в DDR High. Отображение доступно только для RISC0. Для трансляции могут быть использованы 512 слотов по 2 MiB. В ПО реализована возможность трансляции 256 слотов (0xC000_0000 - 0xDFFF_FFFF) в DDR High.

DDR High

ПО, исполняемое на RISC0 (SBL, SBL-S2) во время начальной загрузки, назначает адресному диапазону 0x8_8000_0000 - 0x8_8FFF_FFFF (256 MiB) уровень доступа Secure. Данный диапазон зарезервирован для размещения secure monitor (BL31), TEE bootloader (BL32), TEE OS. Остальной диапазон доступной памяти используется загрузчиком REE (U-Boot) и REE OS (Linux).

0x8_8000_0000 +-----------------+         --+          --+
              |    TF-A User    |           |            |
              +-----------------+           |            |
              |       ...       |           |            |
0x8_8020_0000 +-----------------+           |            |
              |  TF-A Reserved  |         (BL31)         |
0x8_8030_0000 +-----------------+           |            |
              |      TF-A       |           |            |
              +-----------------+           |            |
              |       ...       |           |      Secure Memory
0x8_8038_0000 +-----------------+         --+            |
              |  TEE Bootloader |           |            |
              +-----------------+         (BL32)         |
              |       ...       |           |            |
0x8_8138_0000 +-----------------+         --+            |
              |       TEE       |           |            |
              +-----------------+      (Trusted OS)      |
              |       ...       |           |            |
0x8_9000_0000 +-----------------+         --+          --+
              |    Reserved     |           |            |
0x8_9040_0000 +-----------------+           |            |
              |    ddr info     |           |            |
              +-----------------+           |            |
              |       ...       |           |            |
0x8_9040_2000 +-----------------+           |            |
              |   U-Boot DTB    |           |            |
              +-----------------+           |            |
              |       ...       |         (BL33)         |
0x8_9048_0000 +-----------------+           |     Non-Secure Memory
              |     U-Boot      |           |            |
              +-----------------+           |            |
              |       ...       |           |            |
0x8_9060_0000 +-----------------+           |            |
              |    Reserved     |           |            |
0x8_9240_0000 +-----------------+         --+            |
              |                 |           |            |
              |   Linux (REE)   |       (Rich OS)        |
              |                 |           |            |
              +-----------------+         --+          --+

Разработка

Отладка по JTAG

MDB-скрипты (директория scripts) предназначены для отладки компонентов SBL-S1, ddrinit, TF-A, U-Boot и запуска Linux через отладчик MC-USB-JTAG (отладчик работает через RISC0).

Скрипты последовательно загружают образы и передаёт им управление. Алгоритм исполнения см. в комментариях к скриптам.

Unit-тесты

В проекте реализованы unit-тесты на базе google-test.

см. процедуру сборки тестов playbooks/sbl-unittests.yaml

Правила разработки

Включаемые заголовки

В проекте включаемые заголовки разделены на группы. Группы разделены пустыми строками. Внутри групп заголовки располагаются в алфавитном порядке. Все заголовочные файлы проекта должны быть указаны без использования псевдонимов каталогов UNIX . (текущий каталог) или .. (родительский каталог).

Порядок группировки:

  • Стандартные/системные заголовки C, обрамляемые угловыми скобками.
  • Заголовки проекта, обрамленные угловыми скобками и выраженные через путь относительно корня проекта. Путь к корню проекта передается в скриптах сборки через флаг -I.
  • Локальные заголовки, обрамленные кавычками.

При указании пути без ссылок на верхние директории используются кавычки (#include "header.h" - разрешено, #include <subdir/header.h> - запрещено).

Правила оформления комментариев

Общие правила оформления комментариев:

  • для однострочных комментариев используется стиль "C++-style";
  • для многострочных комментариев используется стиль "C-style" и обрамление с помощью /** и */;

Правила оформления описаний функций:

  • комментарии с описанием функций состоят из обязательной секции "@brief" и опциональных секций "@param" и "@return";
  • правила оформления секции "@brief":
    • в секции содержится краткое описание поведения функции или ее предназначение;
    • секция начинается с заглавной буквы и заканчивается без знака точки;
    • если секция состоит из более чем одного предложения, то все предложения должны заканчиваться знаком точки;
  • правила оформления секций "@param":
    • в секциях находятся имена параметров и их краткие описания;
    • описания параметров в секциях начинаются с заглавной буквы и заканчиваются без знака точки;
    • если описания параметров в секциях состоят из более чем одного предложения, то все предложения должны заканчиваться знаком точки;
    • описания параметров в секциях отделяются от имен параметров символом "-";
    • символы "-" в секциях выровнены по правому краю, но описания после знаков "-" выровнены по левому краю относительно символов "-";
  • правила оформления секции "@return":
    • в секции находятся значения, которые могут быть получены на выходе из функции, и описания причин полученных значений;
    • описания значений в секции начинаются с заглавной буквы и заканчиваются без знака точки;
    • если функция может вернуть больше чем одно значение, описания в секции разделены запятыми;
    • возвращаемые значения выровнены по левому краю с поправкой на знак;
    • описания в секции отделяются от возвращаемых значений символом "-";
    • символы "-" в секции выровнены по правому краю, но описания после знаков "-" выровнены по левому краю относительно символов "-";

Примеры комментариев:

// One line comment

/**
 * The first line comment.
 * The second line comment.
 */

/**
 * @brief The function description
 *
 * @param var1   - Description of var1 function parameter
 * @param var205 - The first line of var2 function parameter description.
 *                 The second line of var2 function parameter description.
 *
 * @return  0   - Description of the first function return value,
 *         -100 - Description of the second function return value
 */

About

Secondary bootloader for MCom-03

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 9