Измените режим ARM на системный режим (CPSR) на ARMv8-A
Я использую 4-ядерный процессор ARM Cortex A53 (архитектура ARMv8) в 32-разрядном режиме. Мне нужно использовать эту инструкцию для входа в системный режим:
cpsid if, #0x1F
но эта инструкция, cps, вызывает сбой моей системы. На ARM1176JZF-S (архитектура ARMv6) эта точная линия работала безупречно. Я изучил это, и, похоже, это связано с низким уровнем привилегий, но инструкция svc не решает проблему так, как я думал. Что мне нужно сделать, чтобы выполнить режим системы в этой архитектуре?
Источник для контрольных битов: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344i/ch02s14s08.html
Вот откуда я получил информацию о CPS (в изменении системных режимов): http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0527a/index.html
1 ответ
Мой код для выхода из режима Hyper (предположим, нет config.txt на SD-карте) для pi2 и pi3:
mrs r0,cpsr
bic r0,r0,#0x1F
orr r0,r0,#0x13
msr spsr_cxsf,r0
add r0,pc,#4
msr ELR_hyp,r0
eret
Множество людей на форуме baremetal на сайте Raspberry Pi, и есть вариации на эту тему. В отличие от старых добрых дней, вы не можете просто сменить cpsr один раз в режиме HYP, но если вы посмотрите на инструкцию eret, она принимает новый cpsr, а также ветвление (принимает новый lr для передачи на компьютер) не на самом деле, а на возврат способ изменить cpsr. Вот как это делают голые металлисты, о которых я знаю.
Есть, конечно, предположения, необходимые здесь, чтобы заставить это работать, и они, случается, работают с пи.
Если у вас есть файл config.txt, вам нужно быть немного осторожным, код начальной загрузки, который GPU размещает для манипулятора, "сортирует" ядра и пропускает ядро 0, а также переводит их все в режим HYP. (и pi2 и pi3), если вы решите победить это:
kernel_old=1
disable_commandline_tags=1
тогда вам решать сортировать ядра
mrs x0,mpidr_el1
mov x1,#0xC1000000
bic x1,x0,x1
cbz x1,zero
not_zero:
wfi
b not_zero
zero:
так что у вас не у всех четырех работает один и тот же код почти параллельно...