Измените режим 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:

так что у вас не у всех четырех работает один и тот же код почти параллельно...

Другие вопросы по тегам