Инструкция по сборке кронштейна "retne"


В настоящее время я нахожусь в процессе понимания того, что требуется для загрузки ядра Linux. Я просматривал исходное дерево ядра Linux, в частности для архитектуры ARM, пока не наткнулся на эту инструкцию сборки retne lr в arch/arm/kernel/hyp-stub.S

С концептуальной точки зрения легко понять, что команда должна вернуться к адресу, хранящемуся в регистре ссылок, если Z-флаг равен 0. То, что я ищу, находится там, где эта сборка руки инструкция фактически документирована.

Я искал в справочном руководстве по архитектуре ARMARMv7-A и ARMv7-R edition раздел A8.8 и не мог найти описание инструкции.

Грэппинг источников и проверка, является ли этоARM-специфическим GNU as extension , не выявили ничего конкретного.

Поиск google с запросами "ARM assembly ret instruction", "arm return instruction" и ничего подобного по строкам не нашел и ничего полезного тоже. Наверное, я искал не там, где надо, или что-то упустил.

Любое разъяснение будет весьма оценено.

1 8

1 ответ:

Архитектурный ассемблер - это одно, а код реального мира-совсем другое. Как только ассемблерные псевдо-операции и макросы вступают в игру, знакомство и с цепочкой инструментов, и с кодовой базой, о которой идет речь, очень помогает. Linux особенно неприятен, так как большая часть исходного кода ассемблера содержит несколько слоев как макросов ассемблера, так и макросов CPP. Если вы знаете, что искать, и следуйте по следу заголовка, чтобы arch/arm/include/asm/assembler.h, в конце концов вы найдете этого сложного зверя:

.irp    c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo
.macro  ret\c, reg
#if __LINUX_ARM_ARCH__ < 6
        mov\c   pc, \reg
#else
        .ifeqs  "\reg", "lr"
        bx\c    \reg
        .else
        mov\c   pc, \reg
        .endif
#endif
        .endm
        .endr

Цель это означает, что испускает архитектурно-предпочтительную инструкцию возврата в интересах микроархитектур со стеком возврата, позволяя при этом тому же коду все еще компилироваться для более старых архитектур.