Самый простой способ получить доступ к безопасным инструкциям (TrustZone) из привилегированного контекста на Cortex A8 / DM3730

У меня есть довольно странная вещь, которую мне нужно сделать: получить доступ к некоторым «безопасным» инструкциям для вещей, которые на самом деле не нужно делать в безопасном контексте. Вкратце: мне нужно перейти в безопасный режим, но не потому, что мне нужна функциональность аппаратного TPM или что-то в этом роде. Мне просто нужен доступ к определенным инструкциям, которых я бы иначе не получил.

Мы делаем это на Gumstix Overo FireSTORM COM. Насколько я понимаю, они загружаются безопасно, но затем где-то (MLO? U-boot?) Они переключаются в небезопасный режим, но я могу ошибаться. Дело в том, что мы определенно делаем это из небезопасного (но привилегированного, см. Ниже) режима.

(Я написал этот вопрос о прямом доступе к GHB / BTB предсказателя ветвления A8, если вам интересно, что я хочу сделать: Запись непосредственно в глобальный буфер истории (GHB) или BTB в предсказателе ветвления ARM Cortex A8?)

Теперь все это будет выполняться из u-boot (у нас есть COM-модули Overo FireSTORM), так что, к счастью, у меня есть «привилегированное» выполнение. Здесь не о чем беспокоиться. И я просмотрел другие вопросы StackOverflow, но, похоже, нет ничего о том, как именно перейти в безопасный режим. Все, что я действительно хочу сделать, это получить доступ к некоторым регистрам CP15, а затем вернуться в небезопасный режим (и, возможно, повторить процесс).

Я просмотрел инструкцию SMC, но не могу найти документации о том, как правильно перехватить вызов / куда идет вызов / как это настроить и т. Д.

Эта информация где-нибудь?

Напомним, что я хочу сделать:

FROM PRIVILEGED EXECUTION: 
Do stuff
Tweak GHB // requires secure execution
Do more stuff
Tweak GHB 
Do more stuff
...
...
...
Do stuff

Любая помощь ОБЯЗАТЕЛЬНО будет оценена по достоинству!

Благодаря @artlessnoise я нашел этот файл в источнике u-boot: /u-boot/arch/arm/cpu/armv7/nonsec_virt.S.

Он содержит следующий код:

/*
* secure monitor handler
* U-boot calls this "software interrupt" in start.S
* This is executed on a "smc" instruction, we use a "smc #0" to switch
* to non-secure state.
* We use only r0 and r1 here, due to constraints in the caller.
*/
   .align  5
_secure_monitor:
   mrc     p15, 0, r1, c1, c1, 0           @ read SCR
   bic     r1, r1, #0x4e                   @ clear IRQ, FIQ, EA, nET bits
   orr     r1, r1, #0x31                   @ enable NS, AW, FW bits

#ifdef CONFIG_ARMV7_VIRT
   mrc     p15, 0, r0, c0, c1, 1           @ read ID_PFR1
   and     r0, r0, #CPUID_ARM_VIRT_MASK    @ mask virtualization bits
   cmp     r0, #(1 << CPUID_ARM_VIRT_SHIFT)
   orreq   r1, r1, #0x100                  @ allow HVC instruction
#endif

   mcr     p15, 0, r1, c1, c1, 0           @ write SCR (with NS bit set)

#ifdef CONFIG_ARMV7_VIRT
   mrceq   p15, 0, r0, c12, c0, 1          @ get MVBAR value
   mcreq   p15, 4, r0, c12, c0, 0          @ write HVBAR
#endif

   movs    pc, lr                          @ return to non-secure SVC

Предположительно, если бы я изменил маску для инструкции mcr p15, я мог бы просто «отключить» переход в небезопасный режим. Однако это, вероятно, убьет u-boot.

Итак, возникает вопрос: как мне установить соответствующий вектор, чтобы при вызове SMC я возвращался в безопасный режим и мог заниматься своими GHB / BTB?

Любая другая помощь приветствуется!


person user770901    schedule 24.09.2014    source источник
comment
Находится ли когда-либо ваш код в безопасном режиме или загрузчик ПЗУ переводит вас в нормальный режим? Вам нужен mcr p15, 0, r0, c12, c0, 1, который установит векторную таблицу монитора для использования инструкции smc. настроить GHB можно в вызове smc. Однако вы можете получить доступ к MVBAR только из безопасного режима. Если вы никогда не находитесь в безопасности, вы никогда не добьетесь этого.   -  person artless noise    schedule 25.09.2014
comment
Спасибо за ответ, @artlessnoise! Я отредактировал вопрос, добавив немного дополнительной информации. Мы начинаем с незащищенного (но привилегированного) режима. Я знаю, что вызов SMC можно использовать для доступа к безопасному режиму (верно?). Если я правильно читаю ваш ответ, проблема в том, что мы никогда не сможем установить место, где будет завершаться вызов SMC [если мы не установим его в безопасный режим]. Это верно? Значит, нет никакого способа сделать то, что мы пытаемся сделать, строго в режиме NS?   -  person user770901    schedule 26.09.2014
comment
Это правильно. Вам необходимо изменить код или путь выполнения u-boot и / или загрузчика ROM (MLO?), Чтобы получить некоторый код в привилегированном безопасном мире; инструкция mcr для установки MVBAR такая же, как и другие GHB / BTB; он доступен только в безопасном мире. Чтобы сделать это из вашего текущего режима, вы запрашиваете эксплойт TZ на этой платформе. TZ спроектирован так, что вы не можете этого сделать.   -  person artless noise    schedule 26.09.2014
comment
Спасибо за подсказку, @artlessnoise. С вашей помощью я нашел - думаю, - где u-boot переходит в режим NS. Я обновил исходный вопрос, чтобы будущие поколения могли извлечь из него пользу. Оставшаяся проблема, похоже, заключается в том, как установить соответствующий вектор, поэтому, когда я делаю вызов SMC - намного позже при выполнении u-boot - I a). вернуться в безопасный режим и б). могу повозиться с GHB. Есть какие-нибудь идеи?   -  person user770901    schedule 26.09.2014
comment
Я думаю, у вас не тот файл. Это для Cortex-A15. См .: include / configs / vexpress_ca15_tc2.h, я не думаю, что Cortex-A8 загружается таким образом.   -  person artless noise    schedule 27.09.2014
comment
@artlessnoise Вы, наверное, правы. Не похоже, что этот файл скомпилирован в u-boot. Но я не уверен, как помогает предлагаемый вами файл. Возможно, именно MLO переводит машину в состояние NS, или, может быть, она где-то похоронена в u-boot. В любом случае, мне все еще трудно понять, как на самом деле войти в безопасный режим. знак равно   -  person user770901    schedule 01.10.2014


Ответы (1)


DM3730 на Gumstix является устройством общего назначения, что означает, что TrustZone отключена. Вы не можете туда попасть.

См. https://stackoverflow.com/a/8028948/6839

person Tom Hennen    schedule 05.12.2014