Я использую Cortex-M33 с зоной доверия руки. В моей защищенной прошивке есть безопасный API, который я могу вызывать из незащищенной прошивки. Все работает, как и ожидалось - по крайней мере, пока я не обновил свой компилятор с gcc-arm-none-eabi-7-2018-q2-update
до gcc-arm-none-eabi-10-2020-q4-major
.
Рассматриваемая функция выглядит следующим образом:
bool __attribute__((cmse_nonsecure_call)) (*Callback_Handler)();
__unused __attribute__((cmse_nonsecure_entry))
bool Secure_SetSomeCallbackHandler(bool (*handler)()) {
// this cmse-check fails with the compiler in `version gcc-arm-none-eabi-10-2020-q4-major`
// it works with the `gcc-arm-none-eabi-7-2018-q2-update` though
handler = cmse_check_address_range(handler, 4, CMSE_NONSECURE);
if (handler == NULL) {
return false;
}
Callback_Handler = handler;
return true;
}
Я удостоверяюсь, что предоставленный указатель действительно находится в незащищенном пространстве, используя cmse_check_address_range
. Это работает для версии 7, но если я скомпилирую код с версией 10, возвращается NULL
. Я ничего не менял ни в исходниках, ни в какой-либо другой части, только компилятор.
Я проверил какие-либо изменения в этой функции, но даже https://github.com/gcc-mirror/gcc/commits/master/libgcc/config/arm/cmse.c
не показывает никаких изменений.
Что-нибудь изменилось? Возможно, я использую функцию не по назначению (нужны ли другие флаги для функций? Но опять же, это работает с версией 7.
Обновлять:
- Я также разместил это на форуме встроенного инструментария arm: https://answers.launchpad.net/gcc-arm-embedded/+question/695596
- @HsuHau https://stackoverflow.com/a/66273629/1358283 опубликовал ошибку https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99157
gcc-arm-none-eabi-objdump --disassemble=Secure_SetSomeCallbackHandler <program.elf>
должно работать. - person Frant   schedule 17.02.2021