我正在使用带有 arm trust-zone 的 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