Использование регистра r9 в ARM

Я пытаюсь понять источник U-boot (2014.07). Я мог видеть следующий код в файле arch/arm/cpu/armv7/lowlevel_init.S.

#ifdef CONFIG_SPL_BUILD
        ldr     r9, =gdata
#else
        sub     sp, sp, #GD_SIZE
        bic     sp, sp, #7
        mov     r9, sp
#endif
        push    {ip, lr}
        bl      s_init
        pop     {ip, pc}

Подскажите, пожалуйста, почему sp перемещен в регистр r9 - "mov r9, sp" (для сборки SPL gdata загружается в регистр r9 - "ldr r9, =gdata"). Есть ли какое-либо конкретное использование регистра r9, чтобы мы сохраняли значение sp в r9.


person user3693586    schedule 09.09.2015    source источник
comment
Хотя обычно это не используется в качестве аргумента, возможно, это так. Что внутри s_init? Поскольку это проект с открытым исходным кодом, не могли бы вы также дать ссылку на исходники?   -  person domen    schedule 09.09.2015
comment
Функция s_init настраивает plls, конфигурацию мультиплексора и т. д. s_init определяется @   -  person user3693586    schedule 09.09.2015


Ответы (1)


Общий ABI, изложенный ARM в Стандарте вызовов процедур обозначает r9 как «Регистр платформы»:

Виртуальная платформа может назначать этому регистру любую роль и должна документировать это использование. Например, он может обозначать его как статическую базу (SB) в модели данных, не зависящей от позиции, или он может обозначать его как регистр потока (TR) в среде с локальным хранилищем потока. Использование этого регистра может потребовать, чтобы хранимое значение сохранялось во всех вызовах. Виртуальная платформа, которая не нуждается в таком специальном регистре, может назначить r9 в качестве дополнительного регистра переменных, сохраняемых вызываемым пользователем, v6.

В этом случае U-Boot ABI использует его для глобального указателя данных (см. также arch/arm/lib/crt0.S и arch/arm/include/asm/global_data). .h), но, возможно, не соответствует пункту "необходимо задокументировать это использование"...

person Notlikethat    schedule 09.09.2015
comment
Спасибо, поэтому в arch/arm/cpu/armv7/lowlevel_init.S они используют r9 в качестве глобального указателя данных. Но я не думаю, что они использовали этот глобальный указатель данных в s_init (определено @ - person user3693586; 09.09.2015
comment
Согласно комментарию в текущем коде, это похоже на пользу старого низкоуровневого кода инициализации для конкретной платы, который этого хочет (предположительно вызывается перед _main) - person Notlikethat; 09.09.2015
comment
Это верно. Также стоит отметить, что u-boot может иногда изменять регистр «r9» при настройке устройств памяти. Таким образом, глобальные данные могут быть мобильными. Вот почему они используют 'r9'. Использование меняется со временем/платформой, поэтому люди должны быть осторожны. SPL — это «загрузчик-загрузчик»; Код SOC rom обычно устанавливает для стека ограниченную память R/W, поэтому SPL использует и стек/данные в одном месте для загрузчика-загрузчика SPL. - person artless noise; 09.09.2015