Как использовать ARM Secure Monitor Call (SMC)

Я использую операционную систему, которая использует процессор ARM Cortex на FPGA. Чтобы получить доступ к этой области памяти на этой плате, мне нужно запустить безопасный мир. Мне сказали, что мне нужно использовать вызов Secure Monitor, чтобы войти в безопасный мир. Если я не нахожусь в безопасном мире, доверенная прошивка Arm блокирует мою операционную систему и дает мне сигнал прерывания 2.

Как я могу использовать SMC? Есть ли где-нибудь пример реализации этого?

Спасибо


person Chris    schedule 06.12.2019    source источник
comment
infocenter.arm.com/help/topic/com. arm.doc.den0028b/   -  person Michael Dorgan    schedule 06.12.2019
comment
Также загляните в вики тегов зоны доверия. Это достаточно сложная тема. Возможно, можно предоставить обычному миру доступ к FPGA, но это зависит от топологии шины и от того, является ли FPGA интеллектуальным ведомым устройством или доступ предоставляется каким-либо другим периферийным устройством, таким как TZASC и т. д.   -  person artless noise    schedule 07.12.2019


Ответы (1)


Я понял ваш вопрос как «Как я могу реализовать вызов ARM Secure Monitor (SMC), чтобы я мог получить доступ к определенному региону моей системы из программного обеспечения, не работающего на EL3». Если вы хотите знать, как использовать существующий вызов SMC , вам уже ответили в первом комментарии Майкла Доргана.

Если нет, вам нужно реализовать свой собственный вызов SMC в программном обеспечении, работающем на EL3, которое выполнялось во время загрузки вашей системы. В типичной системе Aarch64 часть BL31 доверенной прошивки Arm будет ответственен за это, и ATF, похоже, является тем, что работает в вашей системе.

Примером реализации могут служить обработчики SMC для службы дверного звонка почтового ящика ZynqMP IPI, расположенной здесь.

Вы должны:

  • получить исходный код Arm Trusted Firmware, на котором работает ваша система,
  • реализовать свой собственный набор вызовов SMC, используя, например, пример службы дверного звонка почтового ящика IPI,
  • перекомпилировать Arm Trusted Firmware для вашей платформы,
  • обновить свою систему,
  • тестовое задание.

Поскольку ваша платформа использует ATF, она может поддерживаться этим кодом. . В противном случае поставщик микросхемы/платы должен предоставить исходный код для вашей платформы.

Надеюсь, это поможет.

person Frant    schedule 06.12.2019
comment
Большое спасибо за этот ответ. Можете ли вы объяснить немного больше о том, что делает почтовый ящик ZynqMP IPI? Есть ли какой-нибудь справочный материал, который поможет мне разобраться в этом? Мне нужно что-то, что работает на EL0, чтобы получить доступ к области памяти, которая получит доступ, только если я нахожусь в EL3. SMC вызывается в EL0 или EL3? Спасибо - person Chris; 07.12.2019
comment
Я не знаю точно, для чего предназначен почтовый ящик ZynqMP IPI, но вы можете обратиться к справочному руководству ZyngMP. Глубокое погружение в доверенные прошивки — отличная презентация. Этого вместе с кодом почтового ящика ZynqMP IPI и документацией ZynqMP должно быть достаточно. После вызова служба SMC будет работать на уровне EL3. Опять же, я предлагаю вам прочитать презентацию Линаро. С каким именно процессором вы работаете? - person Frant; 07.12.2019
comment
Я использую ARM Cortex A53 и плату Xilinx MPSoc Ultrascale + ZCU102. Я использую ОС VxWorks. Если я запускаю приложение и хочу получить доступ к этой области памяти, я использую SMC в своем коде EL0, что затем переводит мое приложение в EL3, и тогда я могу правильно получить доступ к этой области памяти? После того, как я прочитаю/запишу, как мое приложение вернется к EL0? Еще раз спасибо Франт, это большая помощь. - person Chris; 08.12.2019
comment
Код должен работать как минимум на уровне EL1, чтобы можно было использовать SMC. Я не знаю, на каком EL работает VxWorks, но под Linux вы должны написать драйвер (Linux работает на EL1), который сможет использовать инструкцию SMC для вызова вашего пользовательского обработчика SMC. Пользовательская программа (работающая на уровне EL0) может использовать IOCTL драйвера для доступа к сервису через драйвер. Вероятно, вам следует обратиться к документации по VxWorks. - person Frant; 09.12.2019
comment
Мой код, работающий на EL0, вызывает драйвер (EL1), должен вызывать обработчик SMC, который определен в ATF, верно? Я вижу кучу обработчиков SMC в исходном коде ATF. - person Chris; 10.12.2019
comment
Да, я думаю, это был бы план при использовании Linux: код EL0 вызывал бы драйвер, работающий на EL1. Затем код драйвера может вызвать вашу пользовательскую службу (реализованную в вашем пользовательском ATF), работающую на EL3, с помощью инструкции SMC. Вам следует обратиться к документации по порту Aarch64 VxWorks. Обратите внимание, что у меня нет личного опыта реализации этой схемы. - person Frant; 10.12.2019
comment
Интересно. Спасибо, Франт! Я посмотрю, что я могу сделать с этим. - person Chris; 15.12.2019