首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RISC-V模糊仿真

RISC-V模糊仿真
EN

Stack Overflow用户
提问于 2022-04-28 04:29:26
回答 1查看 95关注 0票数 0

我是新手,但我需要模仿RISC-V使用qemu。作为我的模糊项目的一个开始,我如何给qemu一个指令集并将注册表中的更改作为输出。

EN

回答 1

Stack Overflow用户

发布于 2022-04-28 12:52:49

我大概能理解你的问题。因为这里没有与riscv相关的环境,所以我只能提供一个解决方案。例如,在riscv中,我们设计了一个函数来获取所有寄存器的值,这依赖于qemu的插件模块(例如qemu_plugin_register_vcpu_insn_exec_cb())。

plugin_test.c

代码语言:javascript
复制
#include <inttypes.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <glib.h>

#include <qemu-plugin.h>

QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;

#define CPU_SIZE 32
static int cpu_num;
static int cpu_value[CPU_SIZE]={0};

static void vcpu_insn_exec_before(unsigned int cpu_index, void *)
{
    for (size_t i = 0; i < cpu_num; i++)
    {
        /* code */
        for (size_t j = 0; j < CPU_SIZE; i++)
        {
            
            if(cpu_value[j] != get_cpu_register(i,j)) {
                // The value of cpu has changed
                ...
            } else {
                // The value of cpu has not changed
                ...
            }
        }
        
    }
}

static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
{
    size_t n = qemu_plugin_tb_n_insns(tb);
    size_t i;

    for (i = 0; i < n; i++) {
        struct qemu_plugin_insn *insn = qemu_plugin_tb_get_insn(tb, i);
        qemu_plugin_register_vcpu_insn_exec_cb(
                insn, vcpu_insn_exec_before, QEMU_PLUGIN_CB_NO_REGS,void *);
    }
}

static void plugin_exit(qemu_plugin_id_t id, void *p)
{
}

QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
                                           const qemu_info_t *info,
                                           int argc, char **argv)
{
    if(info->system_emulation) {
        cpu_num = info->system.smp_vcpus;
    } else {
        cpu_num = 1;
    }
    
    qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
    qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
    return 0;
}

api-ext.c

代码语言:javascript
复制
void *qemu_get_cpu(int index);

static uint32_t get_cpu_register(unsigned int cpu_index, unsigned int reg) {
    uint8_t* cpu = qemu_get_cpu(cpu_index);
    return *(uint32_t*)(cpu + 33488 + 5424 + reg * 4);
}

应该注意的是,api-ext.c中的内容是从其他方面获得的。这是用于获取arm cpu值的函数。您需要检查riscv的源代码或文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72038055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档