`cmse_check_address_range` изменяет поведение при обновлении компилятора

Я использую 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.

Обновлять:


person kratenko    schedule 17.02.2021    source источник
comment
Вы сравнивали код, сгенерированный для этой функции, с двумя компиляторами? gcc-arm-none-eabi-objdump --disassemble=Secure_SetSomeCallbackHandler <program.elf> должно работать.   -  person Frant    schedule 17.02.2021


Ответы (1)


Кажется, это ошибка GCC, когда libgcc проверяет поддержку CMSE.

Он проверяет $? для возвращаемого значения команды gcc, но в Makefile он должен использовать $$? вместо.

diff --git a/libgcc/config/arm/t-arm b/libgcc/config/arm/t-arm
index 364f40ebe7f9..3625a2590bee 100644
--- a/libgcc/config/arm/t-arm
+++ b/libgcc/config/arm/t-arm
@@ -4,7 +4,7 @@ LIB1ASMFUNCS = _thumb1_case_sqi _thumb1_case_uqi _thumb1_case_shi \

 HAVE_CMSE:=$(findstring __ARM_FEATURE_CMSE,$(shell $(gcc_compile_bare) -dM -E - </dev/null))
 HAVE_V81M:=$(findstring armv8.1-m.main,$(gcc_compile_bare))
-ifeq ($(shell $(gcc_compile_bare) -E -mcmse - </dev/null >/dev/null 2>/dev/null; echo $?),0)
+ifeq ($(shell $(gcc_compile_bare) -E -mcmse - </dev/null >/dev/null 2>/dev/null; echo $$?),0)
 CMSE_OPTS:=-mcmse
 endif

Я сообщил об ошибке:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99157

person Hsu Hau    schedule 19.02.2021