Явный доступ к банковским регистрам в ARM
Согласно руководству по ARM, должна быть возможность доступа к банковским регистрам для определенного режима ЦП, например, "r13_svc". Когда я пытаюсь сделать это, GCC кричит на меня со следующей ошибкой:
Для непосредственного выражения требуется префикс # - `mov r2,sp_svc'
В чем дело?
Обновить. Следующий текст из Справочного руководства по архитектуре ARM для ARMv5 и ARMv6 привел меня к мысли, что это возможно, раздел A2.4.2:
Регистры R13 и R14 имеют шесть физических регистров в каждом. Один используется в пользовательском и системном режимах, а каждый из оставшихся пяти - в одном из пяти исключительных режимов. В тех случаях, когда необходимо указать конкретную версию, к которой вы обращаетесь, вы используете имена в форме: R13_mode R14_mode, где mode - соответствующий usr, svc (для режима Supervisor), abt, und, irq и fiq.
3 ответа
Я не думаю, что это возможно с mov
инструкция; по крайней мере, в соответствии с Руководством по архитектуре ARM, которое я читаю. Какой у вас документ? Есть вариант ldm
который может загружать регистры пользовательского режима из привилегированного режима (используя ^
). Единственный другой вариант - переключиться в режим SVC. mov r2, sp
, а затем переключитесь обратно в любой другой режим, который вы использовали.
Ошибка, которую вы получаете, потому что она не понимает sp_svc
, так что он думает, что вы пытаетесь сделать немедленный mov
, который будет выглядеть так:
mov r2, #0x14
Вот почему он говорит "требует префикса #".
Правильный синтаксис для этого mrs r2,sp_svc
или же mrs r3, sp_usr
, Это новое расширение armv7. Код можно увидеть в исходном файле ARM Linux KVM interrupt_head.S. Газовый пакет binutils для этой инструкции поддержки от Мэтью Греттон-Данна. Требуется расширение виртуализации, насколько я понимаю.
Согласно тому, что я понимаю, LPAE (расширение большого физического адреса) подразумевает расширения виртуализации. Таким образом, Cortex-A7, Cortex-A12, Cortex-A15 и Cortex-A17 могут использовать это расширение. Однако Cortex-A5, Cortex-A8 и Cortex-A9 не могут.
Документация по инструкции может быть найдена в ARMv7a TRM revC, в разделе B9.3.9 MRS (Банковский регистр).
Для других процессоров Cortex-A (и ARMv6) вы можете использовать cps
инструкция по переключению режимов и передаче банковского регистра в небанкованный регистр (R0-R7), а затем переключение обратно. Очевидная сложность заключается в пользовательском режиме. Правильный способ справиться с этим с ldm rN, {sp,lr}^
; Пользовательский режим не имеет простого пути возврата к привилегированным режимам.
Для всех старых процессоров будет работать информация, предоставленная Dwelch. В основном, использовать mrs/msr
менять режимы.
Это важная инструкция для переключения контекста (что виртуальные машины делают много).
Вы используете mrs и msr для изменения режимов путем изменения битов в cpsr, а затем обычно используете r13.
От руки
MRS R0,CPSR BIC R0,R0,#0x1F ORR R0,R0,#0x13 MSR CPSR_c,R0
затем
MOV SP,#0x10000000
или если вам нужно больше битов в непосредственной
ldr sp,=0x12345600
или если вы не хотите, чтобы ассемблер размещал ваши данные, вы можете разместить их самостоятельно.
ldr sp, svc_stack б 1ф svc_stack: .word 0x12345600 1:
Вы увидите типичный код запуска, в котором приложение будет поддерживать прерывания, прерывания и другие исключения, чтобы установить все нужные вам указатели стека, изменить режим, установить sp, изменить режим, установить sp, изменить режим....