向 QEMU 添加新指令
Adding a new instruction to QEMU
我对向 QEMU 添加新指令感到有点困惑,想确认我的理解是否正确。看了源码,我觉得给QEMU加一条指令大概有以下几个步骤:
- 在
\target\target_arch\op_helper.c
中定义格式为 CHERI_HELPER_IMPL(*instruction*
的辅助函数来模拟此指令。
- 在
\target\target_arch\translate.c
中定义 generate_*instruction*
调用 gen_helper_*instruction*
调用辅助函数。
我是否遗漏了任何步骤?
你提到“CHERI_HELPER_IMPL”宏这一事实告诉我你不是在使用上游 QEMU,而是使用 CHERI 项目的分支。因此,您应该与他们讨论那里可能需要的任何特殊事项。据我了解,他们的本地修改可能非常重要。
对于上游 QEMU,这取决于目标架构是否使用 decodetree。
对于 decodetree-based 架构:
- 向 .decode 文件添加一个或多个合适的指令模式。这将导致生成代码,该代码调用名称以
trans_
开头的函数来处理与该模式匹配的指令,并将其传递给一个结构指针,该结构包含由您的模式定义的各种指令字段的值。
- 适当地实现
trans_
功能。您需要做什么取决于指令行为是什么。对于简单的指令,您可以只发出 TCG 操作来执行指令必须执行的操作。对于更复杂的工作,您可能希望为“调用运行时辅助函数”发出 TCG 操作。 tcg/README 文件底部有一些“推荐的编码规则”,其中包括何时使用辅助函数的经验法则。
- 如果您决定发出辅助调用,则需要实现辅助函数。 helper.h 中的 DEF_HELPER_* 宏既定义了您要编写的 C 函数的原型,也定义了您的 translate-time 代码的 auto-generate 函数
gen_helper_whatever
可以调用生成TCG代码调用。
对于非decodetree-based架构:
- 会有hand-written代码,通常从translate.c开始,使用switch语句和bit-masking代码标识指令。您需要查看该代码以找出在其中添加标识您要添加的指令的代码的位置。这就是全部target-specific;一些目标使用一些 table-driven 设置或一些预处理器宏作为其中的一部分,一些完全使用 hand-written 代码。
- 找到添加“这是我的指令类型吗?”的位置后检查,其余类似于 decodetree-based 目标:您需要发出 TCG 操作来完成工作或调用助手在运行时完成工作。
您会发现在每个步骤中都有很多具体细节需要正确处理,但这是基本大纲。
我对向 QEMU 添加新指令感到有点困惑,想确认我的理解是否正确。看了源码,我觉得给QEMU加一条指令大概有以下几个步骤:
- 在
\target\target_arch\op_helper.c
中定义格式为CHERI_HELPER_IMPL(*instruction*
的辅助函数来模拟此指令。 - 在
\target\target_arch\translate.c
中定义generate_*instruction*
调用gen_helper_*instruction*
调用辅助函数。
我是否遗漏了任何步骤?
你提到“CHERI_HELPER_IMPL”宏这一事实告诉我你不是在使用上游 QEMU,而是使用 CHERI 项目的分支。因此,您应该与他们讨论那里可能需要的任何特殊事项。据我了解,他们的本地修改可能非常重要。
对于上游 QEMU,这取决于目标架构是否使用 decodetree。
对于 decodetree-based 架构:
- 向 .decode 文件添加一个或多个合适的指令模式。这将导致生成代码,该代码调用名称以
trans_
开头的函数来处理与该模式匹配的指令,并将其传递给一个结构指针,该结构包含由您的模式定义的各种指令字段的值。 - 适当地实现
trans_
功能。您需要做什么取决于指令行为是什么。对于简单的指令,您可以只发出 TCG 操作来执行指令必须执行的操作。对于更复杂的工作,您可能希望为“调用运行时辅助函数”发出 TCG 操作。 tcg/README 文件底部有一些“推荐的编码规则”,其中包括何时使用辅助函数的经验法则。 - 如果您决定发出辅助调用,则需要实现辅助函数。 helper.h 中的 DEF_HELPER_* 宏既定义了您要编写的 C 函数的原型,也定义了您的 translate-time 代码的 auto-generate 函数
gen_helper_whatever
可以调用生成TCG代码调用。
对于非decodetree-based架构:
- 会有hand-written代码,通常从translate.c开始,使用switch语句和bit-masking代码标识指令。您需要查看该代码以找出在其中添加标识您要添加的指令的代码的位置。这就是全部target-specific;一些目标使用一些 table-driven 设置或一些预处理器宏作为其中的一部分,一些完全使用 hand-written 代码。
- 找到添加“这是我的指令类型吗?”的位置后检查,其余类似于 decodetree-based 目标:您需要发出 TCG 操作来完成工作或调用助手在运行时完成工作。
您会发现在每个步骤中都有很多具体细节需要正确处理,但这是基本大纲。