У меня есть довольно странная вещь, которую мне нужно сделать: получить доступ к некоторым «безопасным» инструкциям для вещей, которые на самом деле не нужно делать в безопасном контексте. Вкратце: мне нужно перейти в безопасный режим, но не потому, что мне нужна функциональность аппаратного 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?
Любая другая помощь приветствуется!
mcr p15, 0, r0, c12, c0, 1
, который установит векторную таблицу монитора для использования инструкцииsmc
. настроить GHB можно в вызовеsmc
. Однако вы можете получить доступ к MVBAR только из безопасного режима. Если вы никогда не находитесь в безопасности, вы никогда не добьетесь этого. - person artless noise   schedule 25.09.2014mcr
для установки MVBAR такая же, как и другие GHB / BTB; он доступен только в безопасном мире. Чтобы сделать это из вашего текущего режима, вы запрашиваете эксплойт TZ на этой платформе. TZ спроектирован так, что вы не можете этого сделать. - person artless noise   schedule 26.09.2014