一个查看armv8系统寄存器-值-含义的方式

news2024/11/26 4:33:52

找到解压后的SysReg_xml_v86A-2019-12目录

wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-architecture/2019-12/SysReg_xml_v86A-2019-12.tar.gz
wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-architecture/2019-12/A64_ISA_xml_v86A-2019-12.tar.gz
wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-architecture/2019-12/AArch32_ISA_xml_v86A-2019-12.tar.gz

tar zxf A64_ISA_xml_v86A-2019-12.tar.gz
tar zxf AArch32_ISA_xml_v86A-2019-12.tar.gz
tar zxf SysReg_xml_v86A-2019-12.tar.gz

替换脚本中的dir_path路径

from xml.dom.minidom import parseString
import sys
import os
import re

GREEN = '\033[32m'
RED = '\033[31m'
YELLOW = '\033[33m'
END_COLOR = '\033[0m'


def print_red(content):
    print(RED + content + END_COLOR)


def print_green(content):
    print(GREEN + content + END_COLOR)


def print_yellow(content):
    print(YELLOW + content + END_COLOR)


def bit_32(value):
    result = str(bin(int(value)).replace("0b", "").zfill(32))
    reversed_content = ''.join(reversed(result))
    return reversed_content


def bit_64(value):
    result = str(bin(int(value)).replace("0b", "").zfill(64))
    reversed_content = ''.join(reversed(result))
    return reversed_content

def parse_system_register_xml(file_path, register_value):
    f = open(file_path)
    lines = f.read()
    xml_string = lines.replace("<arm-defined-word>", "").replace("</arm-defined-word>", "").replace("<binarynumber>", '').\
        replace("</binarynumber>", "").replace("<instruction>", '').replace("</instruction>", '')

    xml_string = re.sub("<register_link[\w\W]*?>", '', xml_string)
    xml_string = re.sub("</register_link>", '', xml_string)

    dom = parseString(xml_string)
    data = dom.documentElement
    field = data.getElementsByTagName('field')
    # 获取该寄存器的bit长度
    bit_len = int(data.getElementsByTagName('fields')[0].getAttribute('length'))
    content = "Not value"
    if bit_len == 64:
        content = bit_64(register_value)
    elif bit_len == 32:
        content = bit_32(register_value)

    for field_signal in field:
        print("------------------------------------------------------------------------------------------------")
        id = field_signal.getAttribute('id')
        # print(str(id))
        field_name = field_signal.getElementsByTagName('field_name')[0].childNodes[0].nodeValue
        field_msb = field_signal.getElementsByTagName('field_msb')[0].childNodes[0].nodeValue
        field_lsb = field_signal.getElementsByTagName('field_lsb')[0].childNodes[0].nodeValue
        int_field_msb = int(field_msb)
        int_field_lsb = int(field_lsb)
        field_description = field_signal.getElementsByTagName('field_description')[0].getElementsByTagName('para')[0].childNodes[0].nodeValue
        print_yellow(str(id).strip() + "\t" + str(field_description).strip())
        value = '0b' + ''.join(reversed(content[int_field_lsb:int_field_msb+1]))
        # 解析赋值
        field_value = field_signal.getElementsByTagName('field_values')[0]
        field_value_instances = field_value.getElementsByTagName('field_value_instance')
        for field_value_instance in field_value_instances:
            field_value = field_value_instance.getElementsByTagName('field_value')[0].childNodes[0].nodeValue
            field_value_description = field_value_instance.getElementsByTagName('field_value_description')[0].getElementsByTagName('para')[0].childNodes[0].nodeValue
            if field_value == value:
                if field_value == '0b0' or field_value == '0b00':
                    print_red("\t" + field_value + " :\t" + field_value_description)
                else:
                    print_green("\t" + field_value + " :\t" + field_value_description)



def search_file(arch, register_name):
    dir_path = "/Users/showme/workspace/tools/mra_tools/v8.6/SysReg_xml_v86A-2019-12"
    return dir_path + "/" + arch + "-" + register_name + ".xml"


def do(arch, register_name, register_value):
    file_path = search_file(arch, register_name)
    if not os.path.exists(file_path):
        print_red("file not found")
        exit(0)
    parse_system_register_xml(file_path, register_value)


def help():
    print("use: ./main.py AArch32|AArch64 register_name hex_register_value")
    print("use: ./main.py 32|64 register_name hex_register_value")
    exit(0)


if __name__ == '__main__':
    if len(sys.argv) != 4:
        help()

    arch = ""
    if "32" in str(sys.argv[1]):
        arch = "AArch32"
    elif "64" in str(sys.argv[1]):
        arch = "AArch64"
    else:
        help()

    register_name = str(sys.argv[2]).lower()
    register_value = int(sys.argv[3], 16)
    do(arch, register_name, register_value)

运行

python3 ./parse_xml.py AArch64 SCTLR_EL3 0x30C50830

在这里插入图片描述

参考

https://github.com/alastairreid/mra_tools
https://github.com/lelegard/arm-cpusysregs
https://github.com/ashwio/arm64-sysreg-lib

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1444429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(已解决)将overleaf上的文章paper上传到arxiv上遇到的问题。

文章目录 前言初级问题后续问题 前言 首先说一点&#xff0c;将paper的pdf文件直接上传arxiv是不行的&#xff0c;arxiv要求我们要上传源文件&#xff0c;所以才这么麻烦。 初级问题 首先上传文件之后有可能会在下面这个界面出现问题&#xff0c;这里一般都比较常见的问题&a…

『运维备忘录』之 HTTP 响应状态码速查

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

java学习07---综合练习

飞机票 1.需求: 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来年4月&#xff09;头等舱7…

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表

什么是ScottPlot.WPF&#xff1f; ScottPlot.WPF 是一个开源的数据可视化库&#xff0c;用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本&#xff0c;提供了简单易用的 API&#xff0c;使开发人员能够通过简单的代码创建各种类型的图表&#…

【项目技术点总结之三】使用Java生成复杂好看的word或pdf报告的解决方案

前言 项目中往往会遇到需要生成报告的场景&#xff0c;不管是简单报告还是复杂报告&#xff0c;其实都需要找很多资料去尝试&#xff0c;本文会提出几种个人完美解决报告生成的解决方案&#xff0c;而且会提出几个失败但是能生成报告的设想&#xff0c;当然都是踩过坑的&#…

Peter算法小课堂—背包问题

我们已经学过好久好久的动态规划了&#xff0c;动态规划_Peter Pan was right的博客-CSDN博客 那么&#xff0c;我用一张图片来概括一下背包问题。 大家有可能比较疑惑&#xff0c;优化决策怎么优化呢&#xff1f;答案是&#xff0c;滚动数组&#xff0c;一个神秘而简单的东西…

java nio零拷贝

零拷贝是一种计算机执行IO操作的优化技术&#xff0c;其核心目标是减少数据拷贝次数&#xff0c;从而提高系统性能。它主要体现在以下几个方面&#xff1a; 1. **定义与原理**&#xff1a;零拷贝字面上的意思包括“零”和“拷贝”。其中&#xff0c;“拷贝”是指数据从一个存储…

《21天精通IPv4 to IPv6》第3天:IPv6地址配置——如何为不同的系统配置IPv6?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

SpringCloud-Nacos服务分级存储模型

Nacos 服务分级存储模型是 Nacos 存储服务注册信息和配置信息的核心模型之一。它通过将服务和配置信息按照不同级别进行存储&#xff0c;实现了信息的灵活管理和快速检索&#xff0c;为微服务架构下的服务发现和配置管理提供了高效、可靠的支持。本文将对 Nacos 服务分级存储模…

CentOS7搭建Hadoop集群

准备工作 1、准备三台虚拟机&#xff0c;参考&#xff1a;CentOS7集群环境搭建&#xff08;3台&#xff09;-CSDN博客 2、配置虚拟机之间免密登录&#xff0c;参考&#xff1a;CentOS7集群配置免密登录-CSDN博客 3、虚拟机分别安装jdk&#xff0c;参考&#xff1a;CentOS7集…

springboot179基于javaweb的流浪宠物管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

HiveSQL——用户行为路径分析

注&#xff1a;参考文档&#xff1a; SQL之用户行为路径分析--HQL面试题46【拼多多面试题】_路径分析 sql-CSDN博客文章浏览阅读2k次&#xff0c;点赞6次&#xff0c;收藏19次。目录0 问题描述1 数据分析2 小结0 问题描述已知用户行为表 tracking_log&#xff0c; 大概字段有&…

CVE-2012-1823 漏洞复现

CVE-2012-1823 PHP SAPI 与运行模式 首先&#xff0c;介绍一下PHP的运行模式。 下载PHP源码&#xff0c;可以看到其中有个目录叫sapi。sapi在PHP中的作用&#xff0c;类似于一个消息的“传递者”&#xff0c;比如在《Fastcgi协议分析 && PHP-FPM未授权访问漏洞 &…

【前后端的那些事】2万字详解WebRTC + 入门demo代码解析

文章目录 构建WebRTC需要的协议1. ICE2. STUN3. NAT4. TURN5.SDP WebRTC通讯过程1. 大致流程2. 详细流程3. 核心api3.1 RTCPeerConnection3.2 媒体协商3.3 重要事件 代码编写1. 什么是websocket2. 消息实体类Message3. 业务流程图4. 搭建前后端环境5. join -- handleJoin -- jo…

2月11日作业

1、请使用递归实现n! 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h>int fun(int n) {if(n1)return 1;else{return n*fun(n-1);} }int main(int argc, const char *argv[]) {int n;printf("please enter n:");scanf…

keil调试出现cannot evaluate新思路

我在用最新的keil时也出现了这个问题&#xff0c;网上说的办法几乎没啥用&#xff0c;包括魔术棒的设置和将变量定义为全局变量&#xff0c;都没用。 这里我使用的是keil5.13&#xff0c;编译器是6.21&#xff0c;硬件是STM32F407VET6 可以看到&#xff0c;即使是定义为全局变量…

GeoServer 2.11.1升级解决Eclipse Jetty 的一系列安全漏洞问题

Eclipse Jetty 资源管理错误漏洞(CVE-2021-28165) Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7656) Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7657) Eclipse Jetty HTTP请求走私漏洞(CVE-2017-7658) Jetty 信息泄露漏洞(CVE-2017-9735) Eclipse Jetty 安全漏洞(CVE-2022-20…

二分搜索法的探究与心得

引言 在计算机科学中&#xff0c;二分搜索&#xff08;Binary Search&#xff09;算法是一种在有序数组中查找特定元素的基本搜索技术。其优点在于高效的搜索速度&#xff0c;时间复杂度为 ( O(log n) )&#xff0c;这一点与时间复杂度为O(n) 的线性搜索法相比&#xff0c;效率…

cad基础学习

基础操作与设置 切换工作空间 调整鼠标 界面右击&#xff0c;选项 选项中找到显示&#xff0c;十字光标调到最大 当然也可以输入命令op,回车。它会自动打开这个界面 画一个直线 上面选直接&#xff0c;单击俩个点&#xff0c;画出一个直线。然后空格收尾&#xff0c;这就画出…

Python API的使用简述

文章目录 Web APIGit 和 GitHub使用 API 调用请求数据安装 requests处理响应 API处理响应字典监视API的速率限制使用 Pygal 可视化仓库改进Pygal图表添加自定义工具提示 本篇文章&#xff1a;我们叙述如何编写一个独立的程序&#xff0c;并对其获取的数据进行可视化。这个程序将…