Я хочу прочитать значения некоторых регистров Cortex-A53, например
- D_AA64ISAR0_EL1 (AArch64)
- ID_ISAR5 (Aarch32)
- ID_ISAR5_EL1 (Aarch64)
К сожалению, мне не хватает опыта встраивания / сборки. Документация раскрывает
Для доступа к ID_AA64ISAR0_EL1: MRS, ID_AA64ISAR0_EL1; Чтение ID_AA64ISAR0_EL1 в Xt. ID_AA64ISAR0_EL1 [31: 0] может быть доступно через интерфейс с отображением внутренней памяти и внешний интерфейс отладки, смещение 0xD30.
Я решил использовать devmem2 на своей цели (поскольку busybox не включает апплет devmem). Правильна ли следующая процедура чтения реестра?
devmem2 0xD30
Часть, в которой я не уверен, использует смещение как прямой физический адрес. Если это реальный адрес, зачем вызывать смещение, а не адрес. Если это смещение, каков базовый адрес? Я на 99% уверен, что это неправильная процедура, но как мне узнать базовый адрес, к которому нужно добавить смещение? Я искал техническое справочное руководство Armv8 и документы A53 MPCore безрезультатно. Они подробно объясняют содержимое регистров, но, похоже, предполагают, что вы читаете их из ASM, используя метку ID_AA64ISAR0_EL1.
Обновление:
Я нашел это:
Регистр базового адреса конфигурации, EL1 Характеристики CBAR_EL1 следующие: Назначение Содержит физический базовый адрес регистров интерфейса GIC CPU, отображенных в памяти.
Но это просто дублирует мою проблему, как читать этот другой регистр?
Обновление 2: первое обновление кажется актуальным только для GIC, а не для регистров конфигурации, которые я пытаюсь прочитать (я неправильно понял информацию).
Для конкретной проблемы (проверка доступности криптографических расширений) можно просто cat / proc / cpuinfo и искать aes / sha и т. Д.
Обновление 3:
Сейчас я исследую http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0176c/ar01s04s01.html, а также базовый адрес, специфичный для SoC, поэтому его можно найти в справочном руководстве. SoC.
Обновление 4:
Благодаря отличному ответу я, кажется, могу читать данные через модуль ядра:
[ 4943.461948] ID_AA64ISA_EL1 : 0x11120
[ 4943.465775] ID_ISAR5_EL1 : 0x11121
P.S .: Это было очень проницательно, еще раз спасибо!
Обновление 5: Исходный код согласно запросу:
/******************************************************************************
*
* Copyright (C) 2011 Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*****************************************************************************/
#include <linux/module.h>
#include <linux/types.h>
/*****************************************************************************/
// read system register value ID_AA64ISAR0_EL1 (s3_0_c0_c6_0).
static inline uint64_t system_read_ID_AA64ISAR0_EL1(void)
{
uint64_t val;
asm volatile("mrs %0, ID_AA64ISAR0_EL1" : "=r" (val));
return val;
}
// read system register value ID_ISAR5_EL1 (s3_0_c0_c2_5).
static inline uint64_t system_read_ID_ISAR5_EL1(void)
{
uint64_t val;
asm volatile("mrs %0, s3_0_c0_c2_5" : "=r" (val));
return val;
}
/*****************************************************************************/
int init_module(void)
{
printk("ramdump Hello World!\n");
printk("ID_AA64ISAR0_EL1 : 0x%llX\n", system_read_ID_AA64ISAR0_EL1());
printk("ID_ISAR5_EL1 : 0x%llX\n", system_read_ID_ISAR5_EL1());
return 0;
}
void cleanup_module(void)
{
printk("ramdump Goodbye Cruel World!\n");
}
MODULE_LICENSE("GPL");